重写TableMapper拆分

时间:2013-07-30 11:36:23

标签: hadoop mapreduce hbase

我使用以下代码从一个表中读取,其行键的格式为“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读取行。

由于 此致

1 个答案:

答案 0 :(得分:1)

您需要使用自己的TableMapReduceUtil (or copy HBase's)并使用子类TableInputFormatBase并覆盖getSplits以返回比每个区域1更多的拆分(默认行为) - 您可以找到TableInputFormatBase的代码{{ 3}}

顺便说一下,被删除的TableInputFormat是在org.apache.hadoop.hbase。 mapred 命名空间而不是org.apache.hadoop.hbase。 mapreduce 命名空间< / p>