java—在hbase mapreduce任务中加载本机共享库

btqmn9zl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(314)

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

在main函数中,我写

//  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”(如上所述),我已经成功地将共享库加载到本地机器中。
我浏览了以下一些网站:
通过distributedcache加载本机库时出现问题
本机库指南在hadoop reducer中加载本机库?
我不知道我说的是否清楚。如果不清楚,请告诉我。

wz3gfoph

wz3gfoph1#

首先将库复制到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());

第三点不同于官方文件
官方文档:本地共享库

相关问题