2011-02-02 5 views

答えて

9

ジョブでは、ジョブ構成mapred.job.reuse.jvm.num.tasksを指定することで、タスクJVMを再利用することができます。値が1(デフォルト)の場合、JVMは再利用されません(つまり、JVMごとに1つのタスク)。 -1の場合、(同じジョブの)JVMが実行できるタスクの数に制限はありません。 apiを使って1より大きい値を指定することもできます。 $HADOOP_HOME/conf/mapred-site.xml

+1

おかげで、もう一つ質問があります。これらのタスクはいくつかのクラスローダーも共有するので、すべての静的リソースは一度だけロードされますか? (あるいは、Tomcatのように動作して、JVMを共有する理由はほとんどありません...) – yura

+1

タスクが完了すると、JVMはクリアされます。このパラメータは、jvmインスタンス化が非常に高価であるため、「長期実行」ではないジョブの実行時間を向上させます。タスクインスタンスに対してすべてのリソースを共有することはできませんでした。 –

4

#は、JVMは、制限なしのために(デフォルトは1である)、再利用、または-1に設定する回数を指定する回数に設定することができ

<property> 
    <name>mapred.job.reuse.jvm.num.tasks</name> 
    <value>#</value> 
</property> 

次のプロパティを追加再利用量。私はあなたがここで説明するものを達成するためにJVMを再利用して静的オブジェクトを使用して上に行く

0

複数のマップタスク(Hadoop)が静的なデータ構造を共有するための簡単な方法はありません。

これは実際に現在のMap Reduceモデルの既知の問題です。現在の実装では、マップタスク全体で静的なデータを共有しない理由は、Hadoopが高い信頼性を持つように設計されているためです。その結果、タスクが失敗した場合、タスクは自身のJVMのみをクラッシュさせます。他のJVMの実行には影響しません。

私は現在、単一のJVMの作業を複数のコアに分散できるプロトタイプを作成しています(基本的に、マルチコアを利用するためには1つのJVMが必要です)。このようにして、CPU使用率を損なうことなくメモリデータ構造の重複を減らすことができます。次のステップは、1つのJVM内で複数のMapタスクを実行できるHadoopのバージョンを開発することです。これはまさにあなたが求めているものです。

ここに興味深い記事 https://issues.apache.org/jira/browse/MAPREDUCE-2123

関連する問題