最近我尝试用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中加载本机库?
我不知道我说的是否清楚。如果不清楚,请告诉我。
1条答案
按热度按时间wz3gfoph1#
首先将库复制到hdfs:
作业启动程序应包含以下内容:
mapreduce任务可以包含:
第三点不同于官方文件
官方文档:本地共享库