2012-01-12 6 views
2

HadoopおよびMapReduceを初めて使用しています。 MyDir1/file1の MyDir1/FILE2 ... MyDir1/fileN1つのファイルまたはディレクトリを処理する1つのマッパーまたはリデューサ

MyDir2:私は次のように(10メガバイト大きく、N、各ファイルは100ファイルが圧縮または非圧縮することができるかもしれない)、この中にいくつかのディレクトリとファイルを持っています/ file1の MyDir2/FILE2 ... MyDir3/fileN

私は1つのマッパーまたは減速、すなわち、私はMyDir1は、複数のマッパーに分割することにしたいいけない全体MyDir1を処理したMapReduceアプリケーションを設計します。同様に、私はMyDir2を他のマッパー/レデューサーが分割することなく完全に処理したいと思っています。

これについてどうやったらいいですか?私自身のInputFormatを記述し、入力ファイルを読む必要がありますか?

+0

私は実際に同じ2つの要件を持っています。ファイルの先頭にヘッダー情報があるので、分割しないようにする必要があります。マッパーごとにディレクトリが必要なので、ファイルのソート(日付/時刻による)が個々の行のソートよりもはるかに効率的であるため、そのディレクトリのファイルを処理できます。 – MikeKulls

答えて

5

FileInputFormat#isSplitable()を実装します。入力ファイルは分割されず、マップごとに処理されます。ジョブを完了する時間は、マッパーが並行して実行されているにもかかわらず、最大の入力ファイルを処理する時間に依存することに注意してください。また、ノード間で多くのデータがシャッフルされるため、効率的でない可能性があります。

import org.apache.hadoop.fs.*; 
import org.apache.hadoop.mapred.TextInputFormat; 
public class NonSplittableTextInputFormat extends TextInputFormat { 
    @Override 
    protected boolean isSplitable(FileSystem fs, Path file) { 
     return false; 
    } 
} 

現在のAPIは、ディレクトリ全体を1つのマッパーで処理することはできません。あなた自身でInputFormatを書かなければならないかもしれません。あるいは、処理されるディレクトリのリストを作成し、処理される各マッパーに単一のディレクトリを渡します。これは、ノード間のデータ入れ替えのために効率的ではありません。

レデューサーに戻ってくると、入力ファイル/ディレクトリではなく、マッパーからの出力KVペアで動作します。

+0

このクラスが他のクラス内で定義されている場合、MRの標準と思われるように、静的としてマークする必要があります。 – MikeKulls

+0

@Praveen:この場合、なぜデータがたくさん並んでいるのか教えていただけますか? –

+0

@vishnu:その特定のアプローチでは、マップが実行されているノードにデータが存在するという保証はないためです。したがって、マップ・プロセスは、他のノードからデータを引き出す可能性が最も高い – Bala

関連する問題