[英]Load Native Shared Libraries in a HBase MapReduce task
最近我試圖用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);
在地圖方法中,對以下工作進行編碼。
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”(如上所述),我已成功將共享庫加載到本地計算機中。
我瀏覽了下面的一些網站:
我不知道我說的是否清楚,否則請告訴我。
首先將庫復制到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());
第三點與官方文檔不同
官方文檔: 本地共享庫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.