1

データストリーム内のmapreduceジョブのレイテンシーを削減しようとしていますが、ジョブの完了後に読み取るのではなく、hdfs-apiを使用してreducerpart-xxxxファイルの出力を継続的に調整したいと考えています。しかし、これはHadoopジョブにとって安全だと思いますか?

4

1 に答える 1

1

FileOutputFormatベースの出力形式 (テキスト、シーケンス ファイル etx) を使用する場合、それらは、成功FileOutputCommitter/失敗などのときにリデューサー出力をコミットまたは中止する責任があるコモンを利用します。

バックグラウンドで、リデューサーが出力を書き込んでいるときに、指定された HDFS 出力ディレクトリの _temporary サブディレクトリに書き込まれます。

レデューサーが完了すると、ジョブ トラッカーはそのレデューサー試行の 1 つの特定のインスタンスを最終出力として示し (投機的実行では、レデューサー タスクの試行は 1 回以上実行される可能性があることを思い出してください)、出力コミッターにそのバージョンのレデューサー出力 (他の試行は中止されます)。

出力コミッターが試行出力をコミットすると、part-r-xxxxx ファイルが試行一時ディレクトリから指定された出力ディレクトリに移動されるだけです。

したがって、これを念頭に置いて、出力ディレクトリに part-r-* ファイルが表示されると、完全に書き込まれ、安全に末尾に表示されます。したがって、この意味で、レデューサー出力の処理をジャンプすることができます (1000 レデューサー スロット クラスターで 10K レデューサーを実行しているとします)。 finished は次の map reduce ジョブで使用されます (ジョブが送信されると、現在入力として利用可能なファイルのみが考慮され、ジョブの送信後に表示される新しいファイルを継続的にスキャンすることはありません)。

また、最後のいくつかのレデューサーでジョブが実際に失敗する可能性があることも考慮する必要があります。この場合、失敗する前に完了したレデューサー出力を熱心に処理したいですか、それともジョブ全体が完了した場合にのみ処理したいですか? (これはほとんどの仕事にとってより理にかなっています)。

于 2013-01-05T14:19:46.377 に答える