Java 在hbase mapreduce中传递删除或放置错误

Java 在hbase mapreduce中传递删除或放置错误,java,hadoop,mapreduce,hbase,Java,Hadoop,Mapreduce,Hbase,在hbase上运行mapreduce时出现以下错误: java.io.IOException: Pass a Delete or a Put at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:125) at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableReco

在hbase上运行mapreduce时出现以下错误:

java.io.IOException: Pass a Delete or a Put
    at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:125)
    at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:84)
    at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:639)
    at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
    at HBaseImporter$InnerMap.map(HBaseImporter.java:61)
    at HBaseImporter$InnerMap.map(HBaseImporter.java:1)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
12/11/27 16:16:50 INFO mapred.JobClient:  map 0% reduce 0%
12/11/27 16:16:50 INFO mapred.JobClient: Job complete: job_local_0001
12/11/27 16:16:50 INFO mapred.JobClient: Counters: 0
代码:

公共类HBaseImporter扩展配置的实现工具{
公共静态类InnerMap扩展
制表器{
IntWritable one=新的IntWritable();
公共void映射(ImmutableBytesWritable行、结果值、上下文上下文)引发IOException、InterruptedException{
String val=新字符串(value.getValue(Bytes.toBytes(“cf”)、Bytes.toBytes(“line”));
String[]words=val.toString().split(“”);
试一试{
for(字符串字:字)
{
上下文。写(新的文本(单词),一个);
}
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
公共静态类MyTableReducer扩展了TableReducer{
公共void reduce(文本键、Iterable值、上下文上下文)引发IOException、InterruptedException{
int i=0;
for(可写入值:值){
i+=val.get();
}
Put Put=新的Put(Bytes.toBytes(key.toString());
put.add(Bytes.toBytes(“cf”)、Bytes.toBytes(“count”)、Bytes.toBytes(i));
write(null,put);
}
}
公共int运行(字符串args[])引发异常
{
//配置conf=getConf();
Configuration=HBaseConfiguration.create();
conf.addResource(新路径(“/home/trg/hadoop-1.0.4/conf/core site.xml”);
conf.addResource(新路径(“/home/trg/hadoop-1.0.4/conf/hdfs site.xml”);
作业作业=新作业(配置,“SM日志分析器MR”);
job.setJarByClass(HBaseImporter.class);
//setInputPaths(作业,新路径(args[1]);
//setOutputPath(作业,新路径(“outyy”));
//setOutputFormatClass(TextOutputFormat.class);
job.setMapOutputKeyClass(Text.class);
setMapOutputValueClass(IntWritable.class);
//setMapperClass(InnerMap.class);
扫描=新扫描();
scan.setCaching(500);//1是扫描中的默认值,这对MapReduce作业不好
scan.setCacheBlocks(false);
TableMapReduceUtil.initTableMapperJob(
“wc_in”,//输入表
scan,//扫描实例以控制CF和属性选择
InnerMap.class,//映射器类
Text.class,//映射器输出键
IntWritable.class,//映射器输出值
工作);
TableMapReduceUtil.initTableReducerJob(
“字数”//输出表
MyTableReducer.class,//reducer类
工作);
作业。setNumReduceTasks(1);
job.setNumReduceTasks(0);
返回作业。等待完成(true)?0:1;
}
公共静态void main(字符串[]args)引发异常{
//Configuration conf=new HBaseConfiguration();
//Job Job=configureJob(conf,args);
//系统退出(作业等待完成(真)?0:1;
字符串[]inArgs=新字符串[4];
inArgs[0]=“HBaseImporter”;
inArgs[1]=“/user/trg/wc_in”;
inArgs[2]=“AppLogMRImport”;
inArgs[3]=“MessageDB”;
int res=ToolRunner.run(新配置(),新HBaseImporter(),inArgs);
//int res=ToolRunner.run(新配置(),新HBaseImporter(),args);
}
}

我正在将映射输出值类设置为IntWritable.class,但仍在映射器中调用TableOutputFormat.write,该映射器需要Put对象。

得到了我自己问题的答案。我错误地将reducer任务的数量设置为“0”

 job.setNumReduceTasks(0);

因此,Mapper希望Put对象直接写入Hbase表。对上述行进行注释解决了问题。

以下代码并未解决该问题:

job.setNumReduceTasks(0);
它只帮助禁用reduce阶段,并跳过reduce阶段中的实际问题

此外,配置中存在问题,您应该包括
mapred site.xml
hbase site.xml
作为配置资源

job.setNumReduceTasks(0);