2014-04-18 56 views
0

我想我的MapReduce程序中使用的柜台,但每当我试图增加它我收到以下错误:的Hadoop MapReduce的错误:org.apache.hadoop.mapreduce.Counter

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) 

它正在发生的事情时,我试图从两个映射或减速实现它。我的实现看起来如下:

在情况下,当我计数器使用来自映射它在地图上的方法只有一行,看起来像这样:

context.getCounter(MyCounters.Documents).increment(1); 

在情况下,当我已经尝试过了,从减速是在清理:

public void cleanup(Context context){ 
    context.getCounter(MyCounters.Documents).increment(numberOfRows); 
} 

然后,我已经实现了计数器的枚举是这样的:

public enum MyCounters { 
    Documents 
} 

在我的主类,我想检索计数器的值如下:

long documents = countLines.getCounters().findCounter(MyCounters.Documents).getValue(); 

不幸的是,好像有工作不适合我的计数器的任何操作。除了我上面已经描述过之外,还有其他一些具体的方法是否需要初始化计数器?

我在IBM BigInsights实例上使用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 

非常感谢您的帮助。

编辑: 我已经试过我的Map Reduce对我在虚框我的玩具一个节点的Hadoop Cloudera的实例程序,它好像有它的工作原理如我所料。 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方面只存在问题?

回答

1

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

Hadoop 2 API与Hadoop 1 API不兼容。

+0

不幸的是,我无法升级IBM BigInsights上的Hadoop版本,但是当我将通过maven导入的hadoop客户端版本更改为正确的1.1.1而没有计数器时,它就开始为我工作了。有2.0.0。 – ziky90