目立つように、MultipleTextOutputFormat は新しい API に移行されていません。そのため、その場で書き込まれるキー値に基づいて出力ディレクトリと出力ファイル名を選択する必要がある場合、新しい mapreduce API を使用する代替手段は何ですか?
3 に答える
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
方法では、キーがマップ出力キーと同じタイプ (マッパーでこれを使用している場合) またはレデュース出力キーと同じタイプ (リデューサーで使用している場合) である必要があります。値も同様の方法で入力する必要があります。
後者の方法では、次の関数write
を使用して MultipleObjects 静的プロパティをセットアップするときに指定した型と一致するキー/値の型が必要です。addNamedOutput
public static void addNamedOutput(Job job,
String namedOutput,
Class<? extends OutputFormat> outputFormatClass,
Class<?> keyClass,
Class<?> valueClass)
したがって、 が使用しているものとは異なる出力タイプが必要な場合は、後者の方法Context
を使用する必要があります。write
異なる出力ディレクトリを取得する秘訣はbaseOutputPath
、次のように、ディレクトリ セパレータを含む aを渡すことです。
multipleOutputs.write("output1", key, value, "dir1/part");
私の場合、これにより「dir1/part-r-00000」という名前のファイルが作成されました。
ディレクトリbaseOutputPath
を含むa の使用に成功しなかったため、すべての s はパラメーターに渡されるパスに厳密に含まれています。..
baseOutputPath
-output
MultipleOutputs をセットアップして適切に使用する方法の詳細については、私が見つけたこのコードを参照してください (私のものではありませんが、非常に役に立ちました。別の出力ディレクトリは使用しません)。https://github.com/rystsov/learning-hadoop/blob/master/src/main/java/com/twitter/rystsov/mr/MultipulOutputExample.java
類似: Hadoop Reducer: 投機的実行を使用して複数のディレクトリに出力するにはどうすればよいですか?
基本的に、リデューサーから直接 HDFS に書き込むことができます。投機的な実行に注意し、ファイルに一意の名前を付ける必要があります。その後、独自の OutputCommitter を実装して、中止された試行をクリーンアップする必要があります (これが最も困難です)。真に動的な出力フォルダーがある場合の一部 - 各フォルダーをステップスルーし、中止/失敗したタスクに関連付けられた試行を削除する必要があります)。これに対する簡単な解決策は、投機的実行をオフにすることです
最良の回答については、Hadoop - 決定版ガイド第 3 版 (253 ページから) を参照してください。
HDG 本からの抜粋 -
「古い MapReduce API には、複数の出力を生成するための 2 つのクラスがあります。MultipleOutputFormat と MultipleOutputs です。一言で言えば、MultipleOutputs はより完全な機能を備えていますが、MultipleOutputFormat は出力ディレクトリ構造とファイルの命名をより詳細に制御できます。新しい API の MultipleOutputs は結合します。古い API の 2 つの複数出力クラスの優れた機能です。」
MultipleOutputs API を使用して、ディレクトリ構造、ファイルの命名、および出力形式を制御する方法の例があります。
HTH。