0

我正在尝试在我的 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 实现它时,就会发生这种情况。我的实现如下所示:

如果我使用 Mapper 中的计数器,它只是 map 方法中的一行,如下所示:

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

如果我从 Reducer 尝试过它,它正在清理中:

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

预先感谢您的任何帮助。

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

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 方面唯一的问题是什么?

4

1 回答 1

1

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

Hadoop 2 API 与 Hadoop 1 API 不兼容。

于 2014-04-18T13:16:17.940 回答