我正在开发一些 MapR 程序。它们通常在我本地机器上的 Apache hadoop 上进行编码和测试,打包的 jar(带有依赖项)被上传到我们运行 Cloudera CDH4(v4.4.1)的集群上。对于这两种情况,我都有不同的 pom.xml 文件来制作包。
现在我正在使用 Apache Avro 来序列化数据,并且涉及到当前的稳定版本 1.7.5。在本地模式下,我有avro-mapred pom.xml 依赖项
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-mapred</artifactId>
<version>1.7.5</version>
</dependency>
它在 Apache hadoop 上运行良好。
在集群模式下,对于 pom.xml 依赖项,按照CDH4 doc的建议附加了一个分类器标记:
<classifier>hadoop1</classifier>
但是 hadoop1 或 hadoop2 都没有,就会发生错误。对于 hadoop1 标签:
Error running child : java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected
at org.apache.avro.mapreduce.AvroKeyOutputFormat.getRecordWriter(AvroKeyOutputFormat.java:87)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:597)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:444)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)
对于 hadoop2 标签,
Error running child : java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter;
at org.apache.avro.mapreduce.AvroKeyRecordWriter.<init>(AvroKeyRecordWriter.java:53)
at org.apache.avro.mapreduce.AvroKeyOutputFormat$RecordWriterFactory.create(AvroKeyOutputFormat.java:78)
at org.apache.avro.mapreduce.AvroKeyOutputFormat.getRecordWriter(AvroKeyOutputFormat.java:104)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:597)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:444)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)
我正在使用 MapR1 中的新mapreduce接口进行编程。我也猜想它与安装的 avro 版本有冲突,将与我们的集群管理员进一步联系。有什么想法吗,伙计们?
贾敏