簡體   English   中英

在HBase MapReduce任務中加載本機共享庫

[英]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”(如上所述),我已成功將共享庫加載到本地計算機中。

我瀏覽了下面的一些網站:

通過DistributedCache加載本機庫時出現問題

本機庫指南 在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()); 

第三點與官方文檔不同

官方文檔: 本地共享庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM