1

我正在使用以下代码从表中读取,该表的行键格式为“epoch_meter”,其中 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 个字节(一个浮点值)。那将是大约 3.2 GB(我不考虑键的空间 - 如果我考虑键,那么考虑每个键是大约 20 到 30 个字符的字符串值 - 每行可能会增加 60 个字节)。现在我不确定 HBase 是否会在内部对其进行压缩,但如果我不考虑压缩,那 3.2GB 应该被分成很多映射器。与 HDFS 拆分相比,如果我考虑 128MB 拆分,它应该给我大约 25 个 TableMapper。

现在我正在使用的 startrow endrow 组合正在检查这 1 亿条记录中的大约 1/25。因此,我看到只有 2 个 TableMapper 用于这项工作。不知道是不是这样计算的,这是一个猜测。

但它仍然是大约 400 万行,并且两个映射器使工作运行非常缓慢。谁能告诉我如何更改拆分(现在不推荐使用 TableInputFormat),以便有更多的 TableMapper 读取行。

感谢和问候

4

1 回答 1

1

您需要使用自己的 TableMapReduceUtil (或复制 HBase)并使用子类TableInputFormatBase并覆盖 getSplits 以返回每个区域超过 1 个的拆分(默认行为) - 您可以在此处找到 TableInputFormatBase 的代码

顺便说一句,已弃用的 TableInputFormat 位于 org.apache.hadoop.hbase 中。mapred命名空间不是 org.apache.hadoop.hbase。mapreduce命名空间

于 2013-07-30T13:05:37.880 回答