복붙노트

[HADOOP] HBase MapReduce 작업에서 기본 공유 라이브러리로드

HADOOP

HBase MapReduce 작업에서 기본 공유 라이브러리로드

최근에 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 감속기에서 기본 라이브러리를로드 하시겠습니까?

내가 분명히 말했는지 모르겠지만, 그렇지 않다면 알려주십시오.

해결법

  1. ==============================

    1.세 번째 요점은 공식 문서와 다릅니다

    세 번째 요점은 공식 문서와 다릅니다

    공식 문서 : Native Shared Libraries

  2. from https://stackoverflow.com/questions/28845955/load-native-shared-libraries-in-a-hbase-mapreduce-task by cc-by-sa and MIT license