2012-05-03 17 views
0

私はHadoop mapreduceストリーミングジョブを実行しています(マッパのみのジョブ)。場合によっては、私の仕事がstdoutに書き込んで、サイズがゼロでない出力ファイルが作成されます。場合によっては、私の仕事はstdoutに何も書き込まれませんが、依然としてサイズゼロの出力ファイルが作成されます。何もstdoutに書き込まれていないときにこのサイズのファイルを作成しないようにする方法がありますか?サイズゼロの出力ファイル

+0

私はそうは思わない。 –

答えて

0

現在の出力フォーマットを拡張しても構わない場合は、データが書き込まれていないときにcommitTaskステージを '中断'するためにOutputCommitterをオーバーライドするだけで済みます。

すべての出力形式が空ファイル(たとえば、シーケンスファイルにはヘッダーを含む)のファイルバイトをゼロにしているわけではないので、出力ファイルのサイズを確認するだけでは不十分です。次のファイルのソースで

ルック:

  • OutputCommitter - 基本抽象クラス
  • FileOutputCommitter - それは開始するには良い場所ですので、ほとんどのFileOutputFormatsこのコミッターを使用しています。 (ないに何も書かれていなかった場合は、ファイルをコピー)あなたのロジックが最も可能性が高い
0

あなたがMultipleOutputsを使用しています行くところこれは、プライベートメソッドmoveTaskOutputsに見て? 「はい」の場合、MultipleOutputsは、レデューサーが出力に何も書き込むことがない場合でも、デフォルトファイルを作成します。 あなたがLazyOutputFormat、ゼロサイズのファイルが作成されますを使用している場合でも、このデフォルトはゼロサイズの出力は、あなたが、私の経験からLazyOutputFormat.setOutputFormatClass()

を使用することができないようにするにはとき:レデューサーは書くためにいくつかのデータを持っている(ので、出力ファイルが作成されます)減速機は出力を書き込む前に殺されます。これはタイミングの問題だと思うので、HDFSには部分的な縮小出力ファイルしか存在しないか、またはまったく観察しないかもしれません。

例えば、レデューサーが10人の場合は、「n」(n < = 10)のファイル数しかなく、ファイルサイズが0バイトになるものもあります。