1

結果を別のディレクトリに出力する必要があるレデューサーがあります。これにより、後で出力をパーティションテーブルとしてHiveへの入力として使用できます。(Hiveはフォルダー名に基づいてパーティションを作成します)。これらの場所に書き出すために、現在、これを実現するためにHadoopフレームワークを使用していません。いわば、「Hadoopの背後」にある別々の場所に書き出すだけです。つまり、これらのファイルを出力するためにhadoopのAPIを使用していません。

mapred.reduce.tasks.speculative.executionに設定すると問題が発生しましたtrue。同じタスクに対する複数のタスクの試行が同じ場所に書き込んでいるため、これが当てはまると理解しています。

HadoopのAPIを正しく使用して、同じレデューサーから複数の異なるフォルダーに出力し、私も使用できるようにする方法はありますmapred.reduce.tasks.speculative.execution=trueか?(私はMultipleOutputsについて知っていますが、投機的実行をサポートするかどうかはわかりません。)

もしそうなら、それを行ってS3に出力する方法はありますか?

4

2 に答える 2

3

Hadoopが通常投機的実行を処理する方法は、タスクの試行ごとに出力フォルダーを作成することです(実際のHDFS出力ディレクトリーの_temporaryサブフォルダーに)。

OutputCommitterfor the thenはOutputFormat、タスクが成功したときに一時タスクフォルダーの内容を実際の出力フォルダーに移動し、失敗/中止された他の一時タスクフォルダーを削除します(これはほとんどFileOutputFormatの場合のデフォルトの動作です)

したがって、あなたの場合、ジョブ出力フォルダーの外のフォルダーに書き込む場合は、独自の出力コミッターを拡張/実装する必要があります。ファイルを作成するときも同じ原則に従います。投機的に実行するときに名前の衝突を避けるために、完全なタスクID(試行IDを含む)を含めます。ジョブで作成されたファイルを追跡し、中止/失敗のシナリオで削除を管理する方法はあなた次第です(おそらく、タスクIDのファイルグロビン?)

于 2013-02-12T02:47:06.203 に答える
0

あなたはこれに興味があるかもしれません:http://hadoop.apache.org/docs/r2.3.0/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html

于 2014-04-08T04:49:38.773 に答える