我使用以下代码从一个表中读取,其行键的格式为“epoch_meter”,其中epoch是日期时间的长表示,以秒为单位,而米是米数。
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);
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个TableMappers。
现在我正在使用的startrow endrow组合正在检查大约1亿个recods中的1/25。因此,我看到只有2个TableMappers用于这项工作。不知道计算是否有效,这是猜测。
但它仍然有大约400万行,而且两位地图制作者正在使这项工作运行得很慢。谁能告诉我如何更改拆分(现在不推荐使用TableInputFormat),以便有更多的TableMappers读取行。
由于 此致
答案 0 :(得分:1)
您需要使用自己的TableMapReduceUtil (or copy HBase's)并使用子类TableInputFormatBase并覆盖getSplits以返回比每个区域1更多的拆分(默认行为) - 您可以找到TableInputFormatBase的代码{{ 3}}
顺便说一下,被删除的TableInputFormat是在org.apache.hadoop.hbase。 mapred 命名空间而不是org.apache.hadoop.hbase。 mapreduce 命名空间< / p>