Java Hadoop mapreduce错误:org.apache.Hadoop.mapreduce.Counter

Java Hadoop mapreduce错误:org.apache.Hadoop.mapreduce.Counter,java,hadoop,mapreduce,biginsights,Java,Hadoop,Mapreduce,Biginsights,我尝试在MapReduce程序中使用计数器,但每当我尝试递增计数器时,我都会遇到以下错误: 14/04/18 12:22:51 INFO mapred.JobClient: Task Id : attempt_201404172237_0052_m_000003_0, Status : FAILED Error: org.apache.hadoop.mapreduce.Counter 当我试图读取计数器的值时,我得到以下异常: Exception in thread "main" java.l

我尝试在MapReduce程序中使用计数器,但每当我尝试递增计数器时,我都会遇到以下错误:

14/04/18 12:22:51 INFO mapred.JobClient: Task Id : attempt_201404172237_0052_m_000003_0, Status : FAILED
Error: org.apache.hadoop.mapreduce.Counter
当我试图读取计数器的值时,我得到以下异常:

Exception in thread "main" java.lang.IncompatibleClassChangeError: org.apache.hadoop.mapreduce.Counter
at com.zikesjan.bigdata.TfIdfMain.main(TfIdfMain.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
当我试图从Mapper或Reducer实现它时,就会发生这种情况。我的实现如下所示:

long documents = countLines.getCounters().findCounter(MyCounters.Documents).getValue();
如果使用Mapper中的计数器,则map方法中只有一行如下所示:

context.getCounter(MyCounters.Documents).increment(1);
public enum MyCounters {
    Documents
}
如果我在Reducer中试用过,它是在清理中:

public void cleanup(Context context){
    context.getCounter(MyCounters.Documents).increment(numberOfRows);
}
然后我实现了计数器的枚举,如下所示:

context.getCounter(MyCounters.Documents).increment(1);
public enum MyCounters {
    Documents
}
在我的主类中,我希望检索计数器的值,如下所示:

long documents = countLines.getCounters().findCounter(MyCounters.Documents).getValue();
不幸的是,似乎没有任何计数器操作对我有效。除了我上面所描述的,还有其他一些特定的方法来初始化计数器吗

我在IBMBigInsights实例上使用Hadoop版本1.1.1(如果此信息与问题相关)。特别是当我键入hadoop版本时,我得到:

Hadoop 1.1.1
Subversion git://dasani.svl.ibm.com/ on branch (no branch) -r f0025c9fd25730e3c1bfebceeeeb50d930b4fbaa
Compiled by jenkins on Fri Aug  9 17:06:14 PDT 2013
From source with checksum 21fb4557d5057d18b673b3fd46176f95
提前感谢您的帮助

编辑: 我已经在我的玩具一节点Cloudera Hadoop实例上尝试了我的Map Reduce程序,我把它放在虚拟盒中,它看起来就像我预期的那样工作。 在hadoop版本命令之后,我得到:

Hadoop 2.0.0-cdh4.4.0
Subversion file:///data/1/jenkins/workspace/generic-package-rhel64-6-0/topdir/BUILD/hadoop-2.0.0-cdh4.4.0/src/hadoop-common-project/hadoop-common -r c0eba6cd38c984557e96a16ccd7356b7de835e79
Compiled by jenkins on Tue Sep  3 19:33:17 PDT 2013
From source with checksum ac7e170aa709b3ace13dc5f775487180
因此,我的问题是:


1) 为什么计数器在Cloudera对我有效,只是因为它是单节点实例?或者计数器应该在多节点实例上工作?因此,只有IBM BigInsights方面存在问题?

不,这个问题与单节点实例无关。您需要升级在IBM Biginsights上运行的Hadoop版本。它在Cloudera的沙箱上取得了成功,因为它运行的是Hadoop 2


Hadoop 2 API与Hadoop 1 API不兼容。

不幸的是,我无法在IBM BigInsights上升级Hadoop版本,但当我将通过maven导入的Hadoop客户端版本更改为正确的1.1.1(不带计数器)时,它开始对我起作用了。