2011-12-22 13 views
7

Reduceタスクで使用する前に、Mapタスクの出力をディスクに保存する場所を調べようとしています。HadoopではフレームワークがMapタスクの出力を通常のMap-Reduceアプリケーションに保存しますか?

注: - :

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    while (tokenizer.hasMoreTokens()) { 
     word.set(tokenizer.nextToken()); 
     context.write(word, one); 
    } 

    // code that starts a new Job. 

} 

私は見つけることが興味を持ってい使用したバージョンマップクラスのmapメソッドを上書きする場合、例えば新しいAPI

でのHadoop 0.20.204ですcontext.write()はどこでデータの書き込みを終了しますか?私にHDFS上の次の場所を提供します

FileOutputFormat.getWorkOutputPath(context); 

:これまでのところ、私はに走ってきた

hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0 

私はそれは私に次のエラーを与える別のジョブのための入力としてそれを使用しよう:

org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0 

注:は、ジョブがマッパーで開始されたので、技術的には、マッパーのタスクを書いている一時フォルダは、それは出力がときに、NEが存在していますw仕事が始まります。それでも、入力パスは存在しないと言います。

一時的な出力先はどこですか?または、MapとReduceの両方のステージを持つジョブでMapタスクの出力を見つけることができる場所は何ですか?

+0

BTWは、FileOutputhFormatと似ています。#getWorkOutputPathは、タスクの一時出力フォルダの場所を示し、APIタスクのマップタスクではありません。 'これを別のジョブの入力として使用しようとすると、次のエラーが表示されます。' - 通常、一時ファイルはジョブが完了すると削除されます。そうしないと、ノードがいっぱいになります。 –

+0

OK、公正なポイントですが、他のジョブの実行中にジョブを開始しています。私はネストされたマップを減らしています。したがって、内部ジョブが実行されている間は、外部ジョブはビジー状態です。したがって、一時ファイルを削除しないでください。 – inquire

+0

でも大丈夫です。十分に公正なものが削除されます。つまり、削除される前のどこかにあることを意味します。私はそれがどこであるかを知る必要があります。 :D – inquire

答えて

3

本当に何が起こっているのか分かりました。

マッパーの出力は、サイズの約80%になるまでバッファリングされ、その時点でローカルディスクに結果をダンプし始め、アイテムをバッファに引き続き受け入れます。

マッパーの中間出力を取得し、マッパーがまだ実行している間に別のジョブの入力として使用したかったのです。 hadoop 0.20.204の展開を大幅に変更しなければ、これは不可能であることが判明しました。

map .... { 
    setup(context) 
    . 
    . 
    cleanup(context) 
} 

とクリーンアップが呼び出され、まだ一時フォルダにダンプはありません:システムが動作する方法であっても、マップコンテキストで指定されているすべてのものの後です。

その後、Mapの計算のすべてが最終的にマージされてディスクにダンプされ、Reducerに先行するシャッフルとソートのステージの入力になります。

私が読んで見たすべてのものから、出力が最終的になるはずの一時フォルダが、私があらかじめ推測していたものです。

FileOutputFormat.getWorkOutputPath(context) 

私は別のやり方でやりたいことを管理しました。とにかく 質問がありましたら、私に教えてください。

2

タスクトラッカーは、マップまたはReduceタスクごとに個別のJVMプロセスを開始します。

マッパー出力(中間データ)は、各マッパースレーブノードのローカルファイルシステム(HDFSではない)に書き込まれます。 Reducerにデータを転送すると、これらの一時ファイルにアクセスすることはできなくなります。

Mapperの出力を見たい場合は、IdentityReducerを使用することをおすすめしますか?

4

map reduceフレームワークは、不必要にファイルの複製を引き起こすため、中間出力をHDFSではなくローカルディスクに格納します。

関連する問題