質問

Hadoopのマップタスクについて、メモリの静的データ(Ram Luceneインデックス)を大幅に共有したいですか?いくつかのマップ/削減タスクが同じJVMを共有する方法はありますか?

役に立ちましたか?

解決

ジョブは、ジョブ構成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再利用で静的オブジェクトを使用して、ここで説明していることを達成します。http://chasebradford.wordpress.com/2011/02/05/distributed-cache-tatic-objects-and-fast-setup/

もう1つのオプションは、より複雑ですが、読み取り専用メモリマッピングファイルで分散キャッシュを使用することです。そうすれば、JVMプロセス全体でリソースを共有できます。

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

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

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

ここに興味深い投稿がありますhttps://issues.apache.org/jira/browse/mapreduce-2123

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top