1

私はこれをやっています:

DistributedCache.createSymlink(job.getConfiguration()); 
DistributedCache.addCacheFile(new URI   
("hdfs:/user/hadoop/harsh/libnative1.so"),job.getConfiguration()); 

とマッパーで:

System.loadLibrary("libnative1.so");

(私もSystem.loadLibrary( "libnative1"); System.loadLibrary( "native1");を試しました。

しかし、私はこのエラーを受け取ります:

java.lang.UnsatisfiedLinkError: no libnative1.so in java.library.path

java.library.pathを..に設定する必要があるのか​​まったくわかりません。/homeに設定して、すべての.soを分散キャッシュから/ home /にコピーしようとしましたが、それでも機能しませんでした:(

何か提案/解決策をお願いしますか?

4

1 に答える 1

3

HadoopToolRunnerインターフェースを使用します。これにより、コマンドライン引数を介して共有ライブラリを分散キャッシュに追加できるようになり、マッパーが起動する前にタスクノードでJavaライブラリパスが適切に設定されます。これは、共有ライブラリを使用するようにマッパーを設定する方法です。

ジョブクラス(main()メソッドを含む)にorg.apache.hadoop.util.Toolインターフェースを実装させます。このようなもの:

public class Job extends Configured implements Tool {

  @Override
  public int run(String[] args) throws Exception {
    /* create the Hadoop Job here */
  }

  public static void main(String[] args) {
    int ret;
    try {
      ret = ToolRunner.run(new Job(), args);
    } catch (Exception e) {
      e.printStackTrace();
      ret = -1;
    }
    System.exit(ret);
  }
}

hadoopジョブを実行するときは、すべての共有ライブラリ(ローカルコピー)をコマンドライン引数として指定します。実際のファイルもリストしてください(これらがシンボリックリンクの場合)。Hadoopは、ジョブを開始する前に、-files引数で指定されたすべてのファイルを分散キャッシュにコピーします。

hadoop jar Job.jar -files libnative1.so,libnative1.so.0,libnative1.so.0.1

Mapperは、java.library.pathを設定するために特別な呼び出しを必要としません。それはhadoopによって処理されます。

于 2012-04-20T20:29:38.877 に答える