こんにちは私はマッパーとレデューサーを持っているAverageScoreCalculatorと言うMapReduceタスクを持っています。問題は、アベレージスコア計算機のいくつかのフィールドを静的に初期化することです。これは、マッパーとレデューサーの両方で使用できますか?
3 に答える
デフォルトでは、各 map および reduce タスクは異なる JVM で実行され、ノード上の特定のインスタンスで複数の JVM が実行されている可能性があります。
次のプロパティを設定します
mapred.job.reuse.jvm.num.tasks = -1 mapreduce.tasktracker.map.tasks.maximum = 1 mapreduce.tasktracker.reduce.tasks.maximum = 1
mapreduce.job.reduce.slowstart.completedmaps
=
1
また、特定のノードで JVM を再利用する単一のマッパー/リデューサーのみが実行され、リデューサーはすべてのマッパーが処理を完了するまで起動しません。
いくつかの注意事項
上記のアプローチは MapReduce 1x リリースで機能し、効率的なアプローチではありません。
MapReduce 2x リリースでは、JVM の再利用はサポートされていません。
map または reduce プログラムで静的フィールドが動的に更新されると、問題が発生します。スタンドアロンおよび疑似分散モードは初心者向けであり、Hadoop を学習している場合にのみ使用してください。これらのモードは、マップの主な目的である膨大な量のデータを処理している間は役に立ちません-プログラミングの練習を減らします.
ジョブがノード間で分散されると、静的情報が失われます。静的変数の使用を再検討してください。
可能であれば、マップを貼り付けてプログラムを減らし、静的フィールドの必要性を減らしてください。同じことに対するより良い解決策があります。
まず、ジョブが実行される構成/モードを知る必要があります。
たとえば、ローカル (スタンドアロン) モードで実行する場合、ジョブを実行する JVM は 1 つだけです。疑似分散モードで実行すると、マシン上の複数の JVM を使用してジョブが実行されます。分散モードで実行すると、それらは異なるマシンで実行され、もちろん異なる JVM で実行されます (JVM を再利用します)。