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 またはそのようなものを使用して、より効率的にする必要がありますか?