用于Hadoop中NullWritable密钥类型的Mapreduce自定义分区

时间:2017-02-12 06:05:17

标签: hadoop mapreduce

我有一个要求,我只需要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不工作。

1 个答案:

答案 0 :(得分:0)

问题在于VM。在集群环境中,代码工作正常。