1

次のコードを使用して、「epoch_meter」の形式の行キーを持つテーブルから読み取ります。ここで、エポックは日時の長い表現であり、メートルはメーター番号です。

Job jobCalcDFT = Job.getInstance(confCalcIndDeviation);

jobCalcDFT.setJarByClass(CalculateIndividualDeviation.class);

Scan scan = new Scan(Bytes.toBytes(String.valueOf(startSeconds) + "_"),
Bytes.toBytes(String.valueOf(endSeconds + 1) + "_"));

scan.setCaching(500);

scan.setCacheBlocks(false);

scan.addColumn(Bytes.toBytes("readings"), Bytes.toBytes("halfhourly"));

TableMapReduceUtil.initTableMapperJob("meterreadings", 
scan, EmitDFTMapper.class,
MeterIdFrequencyKey.class, 
ComplexWritable.class, jobCalcDFT);

開始行と終了行について言及できます。しかし、分割を制御する方法について多くの情報を見つけることができません。

したがって、meterreadings テーブルには 1 億行あります。各行の値はわずか 32 バイト (float 値) です。それは約3.2 GBになります(キーのスペースは考慮していません-キーを考慮する場合、各キーは約20〜30文字の文字列値であると考えます-おそらく行ごとに60バイトが追加されます)。現在、HBase が内部的にこれを圧縮するかどうかはわかりませんが、圧縮を考慮しない場合、その 3.2GB はかなりの数のマッパーに分割されるはずです。HDFS 分割と比較すると、128MB の分割を考慮すると、約 25 の TableMappers が得られるはずです。

現在、私が使用している startrow endrow の組み合わせは、その 1 億件のレコードの約 1/25 をチェックしています。その結果、このジョブに使用されている TableMappers は 2 つしかありません。計算方法はわかりませんので、あくまでも推測です。

しかし、まだ約 400 万行あり、2 つのマッパーがジョブの実行を非常に遅くしています。行を読み取る TableMappers が増えるように、分割を変更する方法を教えてください (TableInputFormat は非推奨になりました)。

ありがとうございます。それでは、お元気で

4

1 に答える 1

1

独自の TableMapReduceUtil (または HBase のコピー)を使用し、サブクラスTableInputFormatBaseを使用して getSplits をオーバーライドし、リージョンごとに 1 つよりも多くの分割を返す必要があります (デフォルトの動作) - TableInputFormatBase のコードはこちらで見つけることができます

ちなみに廃止されたTableInputFormatはorg.apache.hadoop.hbaseにあります。org.apache.hadoop.hbase ではなく、 mapred名前空間。mapreduce名前空間

于 2013-07-30T13:05:37.880 に答える