在 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/