我有一个要求,我只需要HBase的值而不是row-key来写入输出文件。 为此,我使用NullWritable.class作为我的地图输出键类型。 现在我必须根据列值对输出数据进行分区。但是,正如我们所知,自定义分区基于密钥工作,因此我得到的是异常。
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键/值参数,那么我的reducer不工作。
答案 0 :(得分:0)
问题在于VM。在集群环境中,代码工作正常。