我正在使用以下代码从表中读取,该表的行键格式为“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 读取行。
感谢和问候