2012-01-16 13 views
5

私はHadoopが新しく、どのように動作するかを調べようとしています。私はWordCount-Exampleに似た何かを実装すべきです。タスクは、いくつかのファイルを読み込み、WordCountを実行し、各入力ファイルの出力ファイルを書き込むことです。 Hadoopはコンバイナを使用して、マップパーツの出力を減速器の入力としてシャッフルし、1つの出力ファイルを書き込みます(実行中の各インスタンスについて推測します)。私は、入力ファイルごとに1つの出力ファイルを書くことが可能かどうか疑問に思っていた(inputfile1の単語を保持し、結果をoutputfile1に書き込むなど)。 Combiner-Classを上書きすることは可能ですか、これに対して別の解決策がありますか(これはHadoop-Taskで解決する必要があるかどうかはわかりませんが、これが練習です)。Hadoop MapReduce - 入力ごとに1つの出力ファイル

おかげで...

答えて

1

map.input.file環境パラメータは、マッパーが処理しているファイル名を持ちます。この値をマッパーで取得し、これをマッパーの出力キーとして使用し、次にすべてのk/vを1つのファイルから1つのレデューサーに移動します。

マッパーのコード。ところで、私は古いMRのAPI

@Override 
public void configure(JobConf conf) { 
    this.conf = conf; 
} 

@Override. 
public void map(................) throws IOException { 

     String filename = conf.get("map.input.file"); 
     output.collect(new Text(filename), value); 
} 

そしてMultipleOutputFormatを使用を使用しています、これは仕事のための複数の出力ファイルを書き込むことができます。ファイル名は出力キーと値から派生することができます。

+0

ありがとう、私はそれが最高のアイデアだと思う。おそらく私は古いAPIを扱う方が簡単かもしれないので使いますが、まずは0.20 – spooky

0

Hadoopの 'チャンク' データ設定されたサイズのブロックに分割します。デフォルトは64MBブロックです。あなたのアプローチにこの問題の原因がどこにあるのかが分かります。各マッパーは、ファイルの一部のみを取得することがあります。ファイルが64MB(または設定されている値)未満の場合、各マッパーは1つのファイルしか取得しません。

私は非常に似た制約があります。私は単一のマッパーによって完全に処理されるために一連のファイル(チェーン内の以前の減速機からの出力)が必要でした。私は私の解決策の主な推進力は、処理に必要なファイル名をマッパーに提供するように設定し、マッパーに内部でファイルを読み込んだり読み込んだりすることです。これにより、単一のマッパーがファイル全体を処理することができます。ファイルの分散処理ではなく、「個々のファイルを分散させたくありません」という制約があります。 :)

は、私は私のMRは、個々のファイルに処理するファイルのファイル名を書き出す起動したプロセスを持っていました。それらのファイルが書き込まれた場所は、入力ディレクトリでした。各ファイルが< 64MBの場合、各ファイルに対して1つのマッパーが生成されます。 mapプロセスは、(ファイルに1つのエントリしかないので)正確に1回呼び出されます。
それから、マッパーに渡された値をとり、ファイルを開き、必要なマッピングを行います。 hadoopはプロセスのマップ/削減方法を賢明にしようとするので、各マッパーが単一のレデューサーに行くように、使用するレデューサーの数を指定する必要があります。これはmapred.reduce.tasksの設定で設定できます。私は私のプロセスは魅力的なこの特定のソリューションを作ったかもしれないいくつかの追加要件/制約があったjob.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);

を経由してこれを行います。 1:1から1:1の例では、私はそれをやりました、上に基本が置かれています。

HTH

+0

ありがとうございます。 setNumReduceTasksを使うと、必要なだけ多くの出力ファイルを取得できます。しかし、レデューサーの入力はまだ混合/シャッフルされます。私は私のマッパーの出力を確認したが、それは1つのマッパーが2つのファイルを処理しているようです(しかし、これは問題ではありません)。しかし、1つのファイルだけを処理するマッパーの結果は、他のマッパーの結果と混ざります。Hadoopがこれをやってしまうのを防ぐことができますか(シャッフル/コンバイン?コンバイナクラスを設定するかもしれません) すべてのファイル名を取得してマッパーに渡しましたか?または私は何かを逃していますか?多分別のconf値が設定されるでしょうか? – spooky

+0

特定のレデューサーを強制するには、出力を書き込むときに各マッパーに特定のキーを使用させます。同じキーが同じマッパーに移動します。各ジョブのconfに異なる値を渡し、その値をキーとして使用できます。その結果、各マッパーの出力が(私の経験では)単一の減速機になるでしょう。 – Nija

+1

ファイルが単一のマッパーによって処理されるようにファイル名をマッパーに渡すことは効率的な方法ではありません。データのローカリゼーションはなく、データがよりシャッフルされます。これを解決する1つの方法は、依存ファイルを1(gz、tar)にバンドルし、FileInputFormat#isSplitableメソッドからfalseを返すことです。 –

関連する問題