2012-04-28 12 views
9

Java MapReduceを使用して、Hadoopの2つのデータセットで高価なクロス製品の操作を実行したいとします。MapReduceのクロス製品

たとえば、データセットAとデータセットBのレコードがあります。データセットAの各レコードを、出力のデータセットBの各レコードに一致させたいと思います。私はこれの出力サイズは|A| * |B|だと思っていますが、とにかくそれをやりたがっています。

私は豚がCROSSを持っていますが、高レベルでどのように実装されているのか分かりません。おそらく、私はソースコードを見て行きます。

コードを探しているわけではなく、この問題にどのようにアプローチすべきかを高レベルで知りたいだけです。

+0

AのすべてまたはBのすべてを1つのワーカーのメモリに収めることができますか?それはかなり簡単です。 –

+0

@SeanOwen私は欲しい!残念ながら、これはそうではありません。私が考えていたアプローチの1つは、データセットBを〜10〜100に分割して分割し、10〜100の異なるmrジョブを一度に実行することでした。 –

答えて

3

ドキュメントの類似性(ドキュメントを他のすべてのドキュメントと比較)を見て、2つのデータセットを分割し、それぞれのサブセットの「分割」があることを確認したカスタム入力フォーマットデータ。

だからあなたの分割は、私はそれはしかしだったが、大きさの順に設定された文書を持っていたどのようにパフォーマンスの高い覚えていない

A(1-10) x B(1-10) 
A(11-20) x B(1-10) 
A(21-30) x B(1-10) 
A(1-10) x B(11-20) 
A(11-20) x B(11-20) 
A(21-30) x B(11-20) 
A(1-10) x B(21-30) 
A(11-20) x B(21-30) 
A(21-30) x B(21-30) 

(100レコードを出力し、10のレコードの各合流する2個のセット)のようになります。 (8ノードのクラスタで)互いに比較し、数百万のクロス積が計算されます。

いくつかのドキュメントが他のドキュメントに対してスコアを決して高くしないような場合(例えば、それらの間に時間的余裕がある場合)、結果としてより良い分割が生成されるため、アルゴリズムを改善することもできます。

+0

これは素晴らしいです。すべてのペアリングが入力形式で行われるため、非常にきれいです。ありがとう! –

+0

@Chris Thats素晴らしいアプローチ。私はあなたが "カスタム入力フォーマット"を書いたやり方を分かち合うことができるのか、それともコードであるのか疑問に思っていました。それは助けになるだろう。 –

+0

@justinwaugh - 何かを掘り出してブログ投稿を書くことができるかどうかを確認します。ここからリンクしてください。 –