2013-02-26 3 views
8

MultipleTextOutputFormatが目立つように、新しいAPIに移行されていません。したがって、出力ディレクトリを選択して、その場で書かれているKey-Valueに基づいてfienameを出力する必要がある場合、新しいmapreduce APIを使用する代わりに何ができますか?新しいAPIでのMultipleTextOutputFormatの代替

と同様に

答えて

4

私はAWS EMR Hadoop 1.0.3を使用しており、k/vペアに基づいて異なるディレクトリとファイルを指定することができます。 MultipleOutputsクラスから以下の機能のいずれかを使用します。

public void write(KEYOUT key, VALUEOUT value, String baseOutputPath) 

または

public <K,V> void write(String namedOutput, K key, V value, 
         String baseOutputPath) 

write方法は、地図出力キーと同じタイプであることをキーが必要です(場合にはこれを使用していますmapper)またはreduce出力キーと同じタイプ(これをレジューサーで使用している場合)。値も同様に入力する必要があります。

後者write方法は、セットアップaddNamedOutput機能を使用してMultipleObjects静的プロパティを指定したタイプに一致するように、キー/値の型が必要です。

public static void addNamedOutput(Job job, 
           String namedOutput, 
           Class<? extends OutputFormat> outputFormatClass, 
           Class<?> keyClass, 
           Class<?> valueClass) 

ですから、Contextとは異なる出力タイプが必要な場合は使用しています後でwriteメソッドを使用する必要があります。

異なる出力ディレクトリを取得するトリックは、このように、ディレクトリの区切りが含まれているbaseOutputPathを渡すことです。私の場合は

multipleOutputs.write("output1", key, value, "dir1/part"); 

、これは「DIR1 /パート-R-00000」という名前のファイルを作成しました。

私は、すべてのbaseOutputPath sは厳密-outputパラメータに渡されたパスに含まれている、..ディレクトリが含まれていることbaseOutputPathを使用して成功しませんでした。

MultipleOutputsの設定方法と使用方法の詳細については、私が見つけたコードを参照してください(私のものではありませんが、非常に参考になりました。 https://github.com/rystsov/learning-hadoop/blob/master/src/main/java/com/twitter/rystsov/mr/MultipulOutputExample.java

+0

キー/値のデータに基づいて 'baseOutputPath'を変更してテストしたところ、別のファイルに正常に出力されたことは忘れました。 – Eddified

+0

私はあなたがそれを言いましたことをうれしく思います、私はそれを最終的に見つけました:) – Amar

+0

"dir1/part"の部分のためにたくさんありがとう、それを考えなかったでしょう! – ssgao

0

Hadoop Reducer: How can I output to multiple directories using speculative execution?

基本的に、あなたの減速から直接HDFSに書き込むことができます - あなたは、あなたはあなたがOutputCommitter所有実装する必要があります、投機的実行を警戒すると一意にあなたのファイルに名前を付けるためにだけ必要がありますあなたが本当に動的な出力フォルダを持っているなら、これは最も難しい部分です - 各フォルダをステップして打ち切った/失敗したタスクに関連するattempsを削除する必要があります。これに対する簡単な解決策は、Hadoopのに変わり、最良の答えのために投機的実行に

+0

これは簡単ではありません:P MultipleTextOutputFormatの回避策はありますか?あるいは、新しいAPIを使用してMultipleTextOutputFormatのようなものを実装できますか? – Amar

+0

複数の出力のjavadocで述べたように、私は自分の仕事と減速機に以下のコードを追加しました。 ジョブ内: MultipleOutputs.addNamedOutput(job、namedoutputstring、outputformatclass、keyclass、valueclass); レデューサー内: mos = new Multiple Outputs (コンテキスト); ... /*実行時に計算される*/baseoutput = "abc/xyz/filename";mos.write(key、value、baseOutput); – techuser

+0

クリーンアップ()でmos.close()を忘れないでください。 –

-1

をオフにすることである - 。決定的なガイド第3版を(PGを開始する253。)

HDG帳から抜粋 -

"旧MapReduce APIには、複数の出力を生成するための2つのクラスがあります:MultipleOutputFormatとMultipleOutputs一言で言えば、MultipleOutputsはより完全に機能しますが、MultipleOutputFormatは出力ディレクトリ構造とファイルの命名をより詳細に制御します。古いAPIで2つの複数の出力クラスの最高の機能を組み合わせています。

これは、MultipleOutputs APIを使用してディレクトリ構造、ファイルの命名および出力形式を制御する方法の例を示しています。

HTH。

+0

MultipleOutputsは、キーと値のペアに基づいて、出力フォルダ名またはファイル名をオンザフライで決定できますか?私は親切に私に知らせる方法があれば、そうは思わない。 – Amar

+0

ええ、私はそれを見つけることができませんでした! MultipleOutputsを使うと、あらかじめ定義された*ファイルパスの* set *だけに書き込むことができます。そして、 'run()'で 'MultipleOutputs.addNamedOutput()'を使ってこれを行います。この文を作るよりも私がここで何か不足している可能性があります。他の場所に簡単に見つかる*場合は、少なくともそれにリンクを張っている可能性があります。 – Amar

+0

また、MultipleTextOutputFormatまたはMultipleOutputsのいずれかを使用したことが疑わしいです! MutipleTextOutputFormatと比較して、MultipleOutputs *を使用している間に出力の命名を制御することは少なくなりました。 – Amar

関連する問題