Hadoop mapreduce Ошибка: org.apache.hadoop.mapreduce.Counter
Я пытаюсь использовать счетчики в моей программе 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, это всего лишь одна строка в методе карты, которая выглядит следующим образом:
context.getCounter(MyCounters.Documents).increment(1);
В случае, когда я попробовал это от Редуктора, это было в очистке:
public void cleanup(Context context){
context.getCounter(MyCounters.Documents).increment(numberOfRows);
}
И тогда я реализовал счетчик Enum следующим образом:
public enum MyCounters {
Documents
}
И в моем основном классе я хотел бы получить значение счетчика следующим образом:
long documents = countLines.getCounters().findCounter(MyCounters.Documents).getValue();
К сожалению, похоже, что у меня не работает никаких операций со счетчиками. Есть ли какой-то другой конкретный способ инициализации счетчиков, кроме того, что я описал выше?
Я использую Hadoop версии 1.1.1 в экземпляре IBM BigInsights (если эта информация так или иначе относится к проблеме). Особенно когда я печатаю версию 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 на моем игрушечном экземпляре Cloudera Hadoop с одним узлом, который у меня есть в виртуальной коробке, и кажется, что он работает так, как я ожидал. После команды версии 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 ответ
Нет, проблема не связана с одним экземпляром узла. Вам необходимо обновить версию Hadoop, которая работает в IBM Biginsights. Он успешно работает в песочнице Cloudera, потому что на нем запущен Hadoop 2.
Hadoop 2 API несовместим с Hadoop 1 API.