gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:49:34 24 4
gpt4 key购买 nike

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

在执行下面的代码时,我遇到了一个讨厌的 IOException: Pass a Delete or a Put

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 Method) 在 javax.security.auth.Subject.doAs(Subject .java:415) 在 org.apache.hadoop.security .UserGroupInformation.doAs(UserGroupInformation.java:1548) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162) 容器被 ApplicationMaster 杀死。根据要求杀死容器。退出代码为 143 容器以非零退出代码 143 退出

最佳答案

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com