我有一个要求,我只需要从hbase而不是行键的值写入输出文件。为此,我使用nullwriteable.class作为Map输出键类型。现在我必须基于columns值对输出数据进行分区,但是我们知道自定义分区是基于key的,因此我得到了下面的异常。
Caused by: java.io.IOException: Illegal partition for (null) (40)
这正是我在maptask.class中得到异常的地方
if (partition < 0 || partition >= partitions) {
throw new IOException("Illegal partition for " + key + " (" +
partition + ")");
}
这里我知道分区的值是1,这和我返回的int分区40比较,然后它抛出异常
这是我正在使用的驱动程序代码。
TableMapReduceUtil.initTableMapperJob(args[0], // input table
scan, // Scan instance to control CF and attribute selection
DefaultMapper.class, // mapper class
NullWritable.class, // mapper output value
Text.class, // mapper output key
job);
这是我的分区码
public class FinancialLineItemPartioner extends Partitioner< NullWritable,Text> {
public int getPartition(NullWritable key, Text value, int setNumRedTask) {
String str = key.toString();
if (str.contains("Japan|^|BUS")) {
return 0;
} else if (str.contains("Japan|^|CAS")) {
return 1;
} else if (str.contains("Japan|^|CUS")) {
return 2;
}else {
return 3;
}
请建议。。
注意:如果我交换map output key/value参数,那么我的减速机就不工作了。
1条答案
按热度按时间2lpgd9681#
问题出在虚拟机上,同样的代码在集群环境中运行良好。