Hadoopのマップタスク用に大容量のメモリ静的データ(RAM luceneインデックス)を共有したいですか?複数のmap/reduceタスクが同じJVMを共有する方法はありますか?
4 に答える
ジョブは、ジョブ構成mapred.job.reuse.jvm.num.tasksを指定することにより、タスクJVMを再利用できるようにすることができます。値が1(デフォルト)の場合、JVMは再利用されません(つまり、JVMごとに1つのタスク)。-1の場合、JVMが(同じジョブで)実行できるタスクの数に制限はありません。APIを使用して1より大きい値を指定することもできます。
以下$HADOOP_HOME/conf/mapred-site.xml
のプロパティを追加します
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>#</value>
</property>
を数値に設定して、#
JVMを再利用する回数を指定するか(デフォルトは1
)、-1
再利用量に制限がないように設定できます。
恥知らずのプラグ
ここで説明することを達成するために、JVM 再利用で静的オブジェクトを使用する方法について説明します 。
もう 1 つのオプションは、より複雑ですが、読み取り専用のメモリ マップ ファイルで分散キャッシュを使用することです。そうすれば、JVM プロセス間でもリソースを共有できます。
私の知る限りでは、複数のマップ タスク (Hadoop) が静的データ構造を共有する簡単な方法はありません。
これは、実際には現在の Map Reduce モデルの既知の問題です。現在の実装がマップ タスク間で静的データを共有していない理由は、Hadoop が非常に信頼できるように設計されているためです。その結果、タスクが失敗した場合、それ自体の JVM のみがクラッシュします。他の JVM の実行には影響しません。
私は現在、単一の JVM の作業を複数のコアに分散できるプロトタイプに取り組んでいます (基本的に、マルチコアを利用するには 1 つの JVM が必要です)。このようにして、CPU 使用率を犠牲にすることなく、メモリ内データ構造の重複を減らすことができます。私にとっての次のステップは、1 つの JVM 内で複数の Map タスクを実行できるバージョンの Hadoop を開発することです。これは、まさにあなたが求めているものです。
ここに興味深い投稿があります https://issues.apache.org/jira/browse/MAPREDUCE-2123