我正在研究一些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依赖项, 根据{{3}}:
的建议添加分类器标记<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版本存在冲突,并进一步与我们的集群管理员联系 将到达。 任何想法,伙计们?
Jamin
答案 0 :(得分:2)
问题几乎可以肯定,你正在针对一个非常不同的Hadoop版本开发而不是你正在运行。 CDH 4.4有“MR1”和“MR2”的味道,新的“MR2”是默认的。我想你可能正在编译Hadoop 1.x发行版?你不需要编译CDH库(虽然这是最好的想法),但如果我就在这里,你至少需要针对Hadoop 2.x进行编译。
你的Avro很好,但你不需要指定“hadoop1”。
或者,如果您真的打算使用MR1,则需要确保在CDH 4.4中实际设置了MR1群集。这意味着安装在'mapreduce'服务中而不是'yarn',并在名称中使用带有“...- mr1 -...”的Maven工件。
答案 1 :(得分:2)
` <dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-mapred</artifactId>
<version>${avro.version}</version>
<classifier>hadoop2</classifier>
</dependency>`
这就是魔术!! 它与hadoop2和hadoop1的问题
参考 - https://issues.apache.org/jira/browse/AVRO-1170
上面是cloudera
对于MapR亚马逊
` org.apache.avro Avro的-mapred $ {} avro.version
<avro.version>1.7.6</avro.version>
<hadoop.version> 1.0.3-mapr-2.1.3.1</hadoop.version>`
这些做到了......快乐的编码:)
答案 2 :(得分:0)
这是一个版本的混淆。 CDH支持的Avro版本目前为1.7.3。我在1.7.5中遇到了同样的问题,通过更改版本解决了这个问题。