0

カスケードを使用して、2 つの 300MB ファイルの HashJoin を実行しています。次のカスケード ワークフローを実行します。

// select the field which I need from the first file
Fields f1 = new Fields("id_1");
docPipe1 = new Each( docPipe1, scrubArguments, new ScrubFunction( f1 ), Fields.RESULTS );   

// select the fields which I need from the second file 
Fields f2 = new Fields("id_2","category");
docPipe2 = new Each( docPipe2, scrubArguments, new ScrubFunction( f2), Fields.RESULTS ); 

// hashJoin
Pipe tokenPipe = new HashJoin( docPipe1, new Fields("id_1"), 
                     docPipe2, new Fields("id_2"), new LeftJoin());

// count the number of each "category" based on the id_1 matching id_2
Pipe pipe = new Pipe(tokenPipe );
pipe = new GroupBy( pipe , new Fields("category"));
pipe = new Every( pipe, Fields.ALL, new Count(), Fields.ALL );

このカスケード プログラムを 3 つのデータ ノードを持つ Hadoop クラスターで実行しています。しかし、最終結果を得るには約30分かかります。遅すぎると思いますが、私のプログラムとクラスターには問題はないと思います。このカスケード結合を高速化するにはどうすればよいですか?

4

2 に答える 2

3

カスケード ユーザーガイドに記載されているとおり

HashJoin は、迅速な比較のために右側のストリーム全体をメモリに保持しようとします (HashJoin ではグループ化が実行されないため、現在のグループ化だけではありません)。したがって、右側のストリーム内の非常に大きなタプル ストリームは、構成可能なスピルを超える可能性があります。パフォーマンスが低下し、メモリ エラーが発生する可能性があります。このため、右側の小さいストリームを使用することをお勧めします。

また

役立つかもしれない CoGroup を使用する

于 2013-12-24T06:28:25.913 に答える