在HBase MapReduce任务中加载本机共享库
最近我试图在JNI代码中实现我的算法(使用C ++)。我这样做并生成了一个共享库。 这是我的JNI课程。
public class VideoFeature{ // JNI Code Begin public native static float Match(byte[] testFileBytes, byte[] tempFileBytes); static { System.loadLibrary("JVideoFeatureMatch"); } // JNI Code End }
在主要function,我写
// MapReduce Configuration conf = HBaseConfiguration.create(); // DistributedCache shared library DistributedCache.createSymlink(conf); // Both following ways seem work. // DistributedCache.addCacheFile(new URI("/home/danayan/Desktop/libJVideoFeatureMatch.so#JVideoFeatureMatch"), conf); DistributedCache.addCacheFile(new URI("hdfs://danayan-pc:9000/lib/libJVideoFeatureMatch.so#libJVideoFeatureMatch.so"), conf);
在map方法中,代码跟随工作。
public static class MatchMapper extends TableMapper { @Override public void map(ImmutableBytesWritable key, Result values, Context context) throws IOException, InterruptedException { // Other codes Path[] localFiles = DistributedCache.getLocalCacheFiles(context.getConfiguration()); for(Path temp:localFiles) { String path = temp.toString(); if(path.contains("JVideoFeatureMatch")) { System.out.println("JVideoFeatureMatch found !"); } } }
换句话说,似乎我’DistributedCache’成功了我的共享库。但是我无法在Map函数中加载它。
public static class MatchMapper extends TableMapper { @Override public void map(ImmutableBytesWritable key, Result values, Context context) throws IOException, InterruptedException { // Other codes int score = (int)VideoFeature.Match(testBytes, tempBytes); }
当我尝试在JNI类中调用静态函数时,抛出’java.lang.Exception’:
java.lang.UnsatisfiedLinkError: no libJVideoFeatureMatch in java.library.path.
我也试过’System.load()’。 我已经考虑在Linux系统中使用前缀’lib’和后缀’.so’。
更重要的是,我设置了一个jvm参数(删除它没有任何区别):
-Djava.library.path=/usr/local/hadoop/lib/native/Linux-amd64-64
我已经通过将共享库移动到’Java.library.path’(上面设置)成功地在本地机器中加载了共享库。
我在下面浏览了一些网站:
通过DistributedCache加载本机库的问题
Native Libraries Guide 在hadoop reducer中加载本机库?
我不知道我是否说清楚。如果没有,请告诉我。
-
首先将库复制到HDFS:
bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
-
工作启动计划应包含以下内容:
DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so.1#mylib.so", conf);
-
MapReduce任务可以包含:
System.load((new File("mylib.so")).getAbsolutePath());
第三点与官方文件不同
官方文档:本机共享库