2016-05-17 12 views
2

マップタスクの値を各データノードのローカルディスクに保存したい。例えば、各データノードのローカルディスクにデータを書き込む

public void map (...) { 
    //Process 
    List<Object> cache = new ArrayList<Object>(); 
    //Add value to cache 
    //Serialize cache to local file in this data node 
} 

はどのようにして、各データノードにローカルディスクにこのキャッシュ・オブジェクトを格納することができ、私は上記のようなマップ機能では、このキャッシュを保存している場合ので、パフォーマンスはI/Oタスクので、ひどいでしょうか?

このデータノードのマップタスクが完全に実行されるのを待つ方法はありますか?それからこのキャッシュをローカルディスクに保存しますか?あるいは、Hadoopはこの問題を解決する機能を持っていますか?

+0

の下にある糸-default.xmlのから継承されたデフォルト、希望です助けになる。 –

答えて

2

以下の例を参照してください。作成されたファイルは、NodeManagerでコンテナに使用されるディレクトリの下にあります。これは、構成プロパティ糸-site.xml内yarn.nodemanager.local-dirsに、または答えの下に参照してください。/tmp

Please see @Chris Nauroth answer, Which says that Its just for debugging purpose and It's not recommended as a permanent production configuration. It was clearly described why it was not recommended.

public void map(Object key, Text value, Context context) 
     throws IOException, InterruptedException { 
    // do some hadoop stuff, like counting words 
    String path = "newFile.txt"; 
    try { 
     File f = new File(path); 
     f.createNewFile(); 
    } catch (IOException e) { 
     System.out.println("Message easy to look up in the logs."); 
     System.err.println("Error easy to look up in the logs."); 
     e.printStackTrace(); 
     throw e; 
    } 
} 
+0

データノードにローカルファイルを作成する方法を教えていただきありがとうございます。しかし、このファイルをデータノードにシリアル化する方法については、私の質問で例を挙げました。たとえば、map関数()でシリアル化すると、inputsplitに1000レコードがある場合、プログラムは1000回serialize funciton()を呼び出しますか?各ノードでタスク関数()が完全に終了したときにオブジェクトをシリアル化するオブジェクトがありますか? – nd07

+1

マップメソッドを使用して1000レコードまたはレコード数をシリアル化することを理解しています。私は、セットアップでファイルハンドルを開いてクリーンアップメソッドで閉じることができると思います。マップメソッドでは、すべてのレコードを追加モードで書き込むことができます。それはあなたの種類の要件のために大丈夫でしょうか?再び!クリス・ナウロスの答えに記載されているポイントが適用されます。あなたはこれを試すことができます。 Thx –

+0

ご協力いただきありがとうございます! – nd07

関連する問題