hadoop中可空写密钥类型的mapreduce自定义分区

xv8emn3q  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(375)

我有一个要求,我只需要从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参数,那么我的减速机就不工作了。

2lpgd968

2lpgd9681#

问题出在虚拟机上,同样的代码在集群环境中运行良好。

相关问题