gpt4 book ai didi

java - 在 HBase MapReduce 任务中加载 native 共享库

转载 作者:可可西里 更新时间:2023-11-01 14:58:28 27 4
gpt4 key购买 nike

最近我尝试在 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
}

在主函数中,我写

    //  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<Text, IntWritable> {

@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<Text, IntWritable> {

@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”(上面设置)成功地在本地机器上加载了共享库。

我浏览了下面的一些网站:

Issue loading a native library through the DistributedCache

Native Libraries Guide loading native libraries in 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());

第三点与官方文档不同

官方文档:Native Shared Libraries

关于java - 在 HBase MapReduce 任务中加载 native 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28845955/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com