java - Mapreduce 作业到 HBase 抛出 IOException : Pass a Delete or a Put

标签 java hadoop mapreduce hbase elastic-map-reduce

在 EMR 上使用 Hadoop2.4.0 和 HBase0.94.18 时,我尝试直接从 Mapper 输出到 HBase 表。

在执行下面的代码时,我遇到了一个令人讨厌的IOException:传递删除或放置

public class TestHBase {
  static class ImportMapper 
            extends Mapper<MyKey, MyValue, ImmutableBytesWritable, Writable> {
    private byte[] family = Bytes.toBytes("f");

    @Override
    public void map(MyKey key, MyValue value, Context context) {
      MyItem item = //do some stuff with key/value and create item
      byte[] rowKey = Bytes.toBytes(item.getKey());
      Put put = new Put(rowKey);
      for (String attr : Arrays.asList("a1", "a2", "a3")) {
        byte[] qualifier = Bytes.toBytes(attr);
        put.add(family, qualifier, Bytes.toBytes(item.get(attr)));
      }
      context.write(new ImmutableBytesWritable(rowKey), put);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = HBaseConfiguration.create();
    String input = args[0];
    String table = "table";
    Job job = Job.getInstance(conf, "stuff");

    job.setJarByClass(ImportMapper.class);
    job.setInputFormatClass(SequenceFileInputFormat.class);
    FileInputFormat.setInputDirRecursive(job, true);
    FileInputFormat.addInputPath(job, new Path(input));

    TableMapReduceUtil.initTableReducerJob(
            table,                  // output table
            null,                   // reducer class
            job);
    job.setNumReduceTasks(0);
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

有人知道我做错了什么吗?

堆栈跟踪

错误:java.io.IOException:在 org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:125) 处传递删除或放入 org.apache.hadoop.hbase.mapreduce .TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:84) 在 org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:646) 在 org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl .java:89) 在 org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112) 在 org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124) 在org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:775) 在 org.apache.hadoop.mapred.MapTask.run( MapTask.java:341) 在 org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167) 在 java.security.AccessController.doPrivileged( native 方法) 在 javax.security.auth.Subject.doAs(Subject) .java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548) 在 org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162) 容器被 ApplicationMaster 杀死。根据要求杀死容器。退出代码为 143 容器以非零退出代码 143 退出

最佳答案

如果你能显示完整的堆栈跟踪会更好,这样我可以帮助你轻松解决它。我没有执行你的代码。据我所见您的代码,这可能是问题所在
job.setNumReduceTasks(0);

Mapper 将期望您的 put 对象直接写入 Apache HBase。 您可以增加 setNumReduceTasks 或者如果您看到该 API,您可以找到其默认值并对其进行注释。

关于java - Mapreduce 作业到 HBase 抛出 IOException : Pass a Delete or a Put,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532790/

相关文章:

java - 如何检查 C++ 源代码中是否有任何系统/shell 调用?

java - getRemoseUser() 使用简单的登录 html 表单返回 null

Hadoop 安装 : No such file while run hadoop format

hadoop - Hive 中 Cluster By 和 CLUSTERED BY 的区别?

java - Bukkit 编码 - Config.yml 如何允许玩家在其中包含 {target} 和 {sender},并且它在游戏中显示为发送者名称和目标名称

java - 将 pojo 实体与 Web 服务客户端生成的工件映射

mysql - 从空的配置单元表传递增量值

hadoop - 是否可以将数据作为流输入到MapReduce作业中

python - 在将输入发送到 mrjob 映射器之前如何过滤 s3 文件?

Python - 如何将目录作为 MapReduce 输入传递