2012-03-26 5 views
1

実行中の特定のジョブは、大きなHDFSファイルを処理する前に、DBからいくつかのメタデータを収集する必要がありますこのメタデータはファイル内のデータに追加され、後のmap/combine/reduceステージに渡されます。Hadoop MapReduceとデータベースクエリを組み合わせる

私はこのクエリを置く場所が正しいかどうか疑問に思っていました。マッパーが始まるときにメタデータを利用できるようにする必要がありますが、マッパーが同じクエリーを実行するので、そこに配置することは重複しているようです。どのようにして(もしあれば)このクエリを一度実行し、その結果をすべてのマッパーで共有できますか?タスクを実行するすべてのノード間でデータを共有する共通の方法はありますか(HDFSに書き込む以外)ありがとう。

答えて

3

メイン関数でMYSqlクエリを使用でき、クエリの結果を文字列に格納できます。次に、変数をHadoop Job Configurationオブジェクトに設定することができます。 Configurationオブジェクトに設定された変数には、すべてのマッパーがアクセスできます。

あなたの主なクラスは次のようになります....
JobConf conf = new JobConf(Driver.class);
String metainfo = <You metadata Info goes here>;
conf.set("metadata",metainfo);





publi class Map(...){を次のようにだからマップクラスの中で、あなたは、メタデータ値にアクセスすることができます

String sMetaInfo="";

public void configure(JobConf job) {

sMetaInfo= job.get("metadata"); // Getting the metadata value from Job Configureation Object

}
public void map(....){

// Map Function
}

}

+3

また、メタデータが大きすぎて設定に保存できない場合は、DistributedCacheを使用して調べる必要があります。ドライバのDBからメタデータを取得し、ファイルに保存してからファイルをDistributedCacheに追加します。メモリにロードして必要に応じて追加するためのファイルが各マッパーで使用可能になります –

+0

両方の回答が素晴らしいです! – sa125

0

あなたはcloudeを持っている場合、私は急襲を使用しますra配布を容易にします。私は通常、Javaでカスケード接続してプログラムを作成し、dbソース用にdbmigrateをソース「タップ」として使用して第一級の市民にします。 dbmigrateでpksを使用する場合、パフォーマンスは十分です。

+0

https://github.com/Cascading/cascading-dbmigrate –

関連する問題