0

HBase をソースおよびシンクとして使用する MR ジョブを改善する必要があります。

基本的に、マッパーで 3 つの HBase テーブルからデータを読み取り、リデューサーが計算を行って HBase テーブルにダンプするための 1 つの巨大な文字列としてそれらを書き出します。

Table1 ~ 19 million rows.
Table2 ~ 2 million rows.
Table3 ~ 900,000 rows.

マッパーの出力は次のようになります。

HouseHoldId contentID name duration genre type channelId personId televisionID timestamp

これは、Table1 の 1 行分です。同様に、1900 万のマッパー出力。

HouseHoldID 値に基づいて並べ替えることに興味があるので、この手法を使用しています。ペアのVの部分は興味ないので無視です。私のマッパークラスは次のように定義されています:

public static class AnalyzeMapper extends TableMapper<Text, IntWritable> { }

私の MR ジョブが完了するまでに 22 時間かかりますが、これはまったく望ましくありません。どういうわけかこれを最適化して、どうにかしてもっと速く実行することになっています..

scan.setCaching(750);        
scan.setCacheBlocks(false); 
TableMapReduceUtil.initTableMapperJob (
                                       Table1,           // input HBase table name
                                       scan,                   
                                       AnalyzeMapper.class,    // mapper
                                       Text.class,             // mapper output key
                                       IntWritable.class,      // mapper output value
                                       job);

TableMapReduceUtil.initTableReducerJob(
                                        OutputTable,                // output table
                                        AnalyzeReducerTable.class,  // reducer class
                                        job);
job.setNumReduceTasks(RegionCount);  

私の HBase Table1 には 21 のリージョンがあるため、21 のマッパーが生成されます。8 ノードの cloudera クラスターを実行しています。

私はここで何か間違っていますか?

カスタム SortComparator または Group Comparator またはそのようなものを使用して、より効率的にする必要がありますか?

4

0 に答える 0