我正在开发一些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版本存在冲突,并且将与我们的群集管理员取得进一步联系。大家有什么想法吗?
贾明
问题几乎可以肯定是,您正在针对与运行时完全不同的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工件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句