我想使用Rubydoop在Wikipedia历史转储XML文件上运行Hadoop作业。 到目前为止,我设法加载Cloud⁹的XMLInputFormat Java类并将其映射到Ruby类:
module Cloud9
require 'java'
require File.expand_path('../../cloud9-1.5.0.jar', __FILE__)
require File.expand_path('../../hadoop-core-1.2.1.jar', __FILE__)
require File.expand_path('../../commons-logging-1.1.1.jar', __FILE__)
java_import 'edu.umd.cloud9.collection.XMLInputFormat'
end
module Wikipedia
class XmlInputFormat < ::Cloud9::XMLInputFormat
end
end
并将XmlInputFormat添加到Rubydoop配置作业块:
input input_path, format: Wikipedia::XmlInputFormat
运行作业时,<page>
和</page>
标记开始分割后,我收到以下错误:
java.lang.Exception: java.lang.IncompatibleClassChangeError:
Found class org.apache.hadoop.mapreduce.TaskAttemptContext, but interface was expected
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.IncompatibleClassChangeError: Found class org.apache.hadoop.mapreduce.TaskAttemptContext, but interface was expected
at edu.umd.cloud9.collection.XMLInputFormat$XMLRecordReader.initialize(XMLInputFormat.java:102)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:521)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:223)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
我正在使用cloud9-1.5.0.jar和Rubydoop 1.1.0在本地运行Hadoop 2.1.2。
所以问题是:这是因为Cloud⁹和Rubydoop或本地使用的不兼容的hadoop版本(旧的/新的Hadoop API?)?怎么可能修好?
答案 0 :(得分:0)
Hadoop 1.2.1与Cloud⁹lib1.5版之间存在不兼容性错误,因为更高版本的Hadoop(2.x)使用TaskAttemptContext接口而不是类。
现在使用 cloud9-1.4.0.jar 对我有用。