在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中加载本机库?

我不知道我是否说清楚。如果没有,请告诉我。

  1. 首先将库复制到HDFS:

     bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1 
  2. 工作启动计划应包含以下内容:

     DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so.1#mylib.so", conf); 
  3. MapReduce任务可以包含:

     System.load((new File("mylib.so")).getAbsolutePath()); 

第三点与官方文件不同

官方文档:本机共享库