1. ホーム
  2. hadoop

[解決済み] HadoopのReduceタスクはいつ始まるのか?

2023-06-13 13:12:07

質問

Hadoopでreduceタスクはいつ始まるのでしょうか?マッパーのある割合(閾値)が完了した後に開始されるのでしょうか?もしそうなら、この閾値は固定ですか?一般的にどのような閾値が使われるのでしょうか?

どのように解決するのですか?

reduceフェーズは、shuffle, sort, reduceの3つのステップで構成されています。シャッフルは、reducerが各マッパーからデータを収集するところです。これはデータ転送だけなので、マッパーがデータを生成している間でも可能です。一方、sortとreduceは、すべてのマッパーが終了してからでないと開始できない。MapReduceがどちらをやっているかは、リデューサの完了率を見ればわかります。0~33%はシャッフル、34~66%はソート、67~100%はリデュースをやっていることを意味します。これは、リデューサが時々33%で止まっているように見える理由です。

リデューサーは、終了したマッパーの割合の閾値に基づいてシャッフルを開始します。このパラメータを変更することで、リデューサーがより早く、あるいはより遅くシャッフルを開始するようにすることができます。

なぜリデューサーを早く開始することが良いのでしょうか?マッパーからリデューサへのデータ転送を時間をかけて分散させるからです。ネットワークがボトルネックになっている場合には良いことです。

なぜ早期にリデューサを起動するのは悪いことなのでしょうか?なぜなら、データをコピーしてマッパーが終了するのを待つだけで、リデューサーのスロットは占有されてしまうからです。後で開始される、実際に還元スロットを使用する別のジョブは、今それを使用することができません。

のデフォルト値を変更することで、リデューサが起動するタイミングをカスタマイズすることができます。 mapred.reduce.slowstart.completed.mapsmapred-site.xml . の値は 1.00 を指定すると、reducersを開始する前にすべてのmapperが終了するのを待ちます。値が 0.0 の場合、リデューサはすぐに開始されます。値が 0.5 を指定すると、 マッパーの半分が完了した時点でリデューサーを開始します。また mapred.reduce.slowstart.completed.maps をジョブごとに変更することもできます。 Hadoop の新しいバージョン (少なくとも 2.4.1) では、このパラメータは mapreduce.job.reduce.slowstart.completedmaps (です(ユーザーyegor256に感謝します)。

一般的に、私は mapred.reduce.slowstart.completed.maps の上に 0.9 を使うことで、システムが複数のジョブを同時に走らせることができるようになります。こうすることで、リデューサがデータのコピー以外何もしていないときに、ジョブがリデューサを占有することがなくなります。もし一度にひとつのジョブしか実行しないのであれば、このように 0.1 が適切でしょう。