2012-04-20 10 views
1

からライブラリをロードすることができません:私は、このやっている分散キャッシュのHadoop

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");

しかし、私はこのエラーを取得しています:

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

私はjava.library.pathを設定する必要があります。 私はそれを/ homeに設定しようとしましたが、分散キャッシュから/ home /にすべての.soをコピーしましたが、まだ動作しませんでした:

お願い/解決方法を教えてください。

答えて

3

Hadoop ToolRunnerインターフェイスを使用します。これにより、共有ライブラリをコマンドライン引数を使用して分散キャッシュに追加することができ、マッパーが起動する前にタスク・ノードで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を設定するための特別な呼び出しは必要ありません。ハープで世話をする。

+0

素晴らしい提案!私はこれを試してみる.. – Harsh

関連する問題