【java学习】Jni在hadoop上的使用(中)
上一篇博文里,已经在linux环境下实现单机版JNI的验证。这一篇,进入“阶段二”,将JNI程序放到hadoop上跑通。
这个阶段的尝试我吃了不少苦头,主要是路径问题:hadoop将我写好的jar包分发到每个tasknode上,同时,我们要把.so也分发到相同路径下,并“告诉”tasknode,使得jvm在运行jar包的时候能够找到这个动态库。
还是按顺序说。写hadoop程序。
map函数:
public void runTestJni (String[] args) throws Exception {// the configurationConfiguration conf = new Configuration();// conf.set("java.library.path", "./Jars");// DistributedCache.addFileToClassPath(new Path("/xxx/libFakeSegmentForJni.so"), conf);/*conf.set("hadoop.native.lib", "true");conf.set("java.library.path", "./");conf.set("mapred.job.classpath", "./");DistributedCache.createSymlink(conf);DistributedCache.addFileToClassPath(new Path("/xxx/libFakeSegmentForJni.so"), conf);*/GenericOptionsParser goparser = new GenericOptionsParser(conf, args);String otherargs [] = goparser.getRemainingArgs();// the jobJob job;job = new Job(conf, "@xiaojinghui-TestFakeSegmentForJni-hadoopJni");job.setJarByClass(TestFakeSegmentForJni.class);......
可以看到,我在"Job job"之前注释的有多乱。这还是删除了一些绝对不靠谱的尝试语句呢。可想而知,我当时的郁闷。
最后提一句,设置java.library.path失败,有两种说法:
参考文献:
《Hadoop JAVA程序-files功能测试》