プロパティ「mapred.job.reuse.jvm.num.tasks」を設定して JVM を再利用できることはわかっています。私の質問は次のとおりです。
(1) ここで設定するタスクの数、-1 またはその他の正の整数をどのように決定しますか?
(2) すでに JVM を再利用し、mapreduce ジョブでこのプロパティを -1 の値に設定することは良い考えですか?
どうもありがとうございました!
プロパティ「mapred.job.reuse.jvm.num.tasks」を設定して JVM を再利用できることはわかっています。私の質問は次のとおりです。
(1) ここで設定するタスクの数、-1 またはその他の正の整数をどのように決定しますか?
(2) すでに JVM を再利用し、mapreduce ジョブでこのプロパティを -1 の値に設定することは良い考えですか?
どうもありがとうございました!
相互に確実に実行される非常に小さなタスクがある場合は、このプロパティを -1 に設定すると便利です (生成された JVM が無制限に再利用されることを意味します)。したがって、(タスクの数)-JVM ではなく、(ジョブで使用可能なクラスター内のタスクの数)-JVM を生成するだけです。
これは大幅なパフォーマンスの向上です。長時間実行されるジョブでは、新しい JVM のセットアップと比較してランタイムの割合が非常に低いため、パフォーマンスが大幅に向上することはありません。
また、長時間実行されるタスクでは、ヒープの断片化などの問題によりパフォーマンスが低下するため、タスク プロセスを再作成することをお勧めします。
さらに、途中で実行されるジョブがいくつかある場合、適切なトレードオフを考慮して、タスクの 2 ~ 3 つだけを再利用できます。
JVM の再利用 (MR1 でのみ可能) は、JVM の起動時の遅延をなくすため、パフォーマンスの向上に役立ちますが、わずかなものであり、多くの欠点 (読み取りの副作用) があります。ほとんどのタスクは長時間 (数十秒) 実行されます。これらのタスクの実行時間を見ると、起動時間は問題ではありません. 白紙の状態で新しいタスクを開始したい場合. JVM を再利用すると、ヒープが完全ではない可能性があります.クリーン (以前の実行から断片化されています。断片化により、より多くの GC が発生し、すべての起動時間の増加が無効になる可能性があります。メモリ リークがある場合は、メモリ使用量などにも影響を与える可能性があります。したがって、新しい JVM を開始することをお勧めします。 (タスクがそれほど小さくない場合) MR2(YARN) では、新しい JVM がタスクのために常に開始されます。Uber タスクの場合 - ローカル JVM でのみタスクを実行します。