2

我正在开发一些 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 版本有冲突,将与我们的集群管理员进一步联系。有什么想法吗,伙计们?

贾敏

4

3 回答 3

2

几乎可以肯定,问题是您正在开发的 Hadoop 版本与您正在运行的 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 工件。

于 2013-09-30T10:09:46.170 回答
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>`

这些做到了......快乐的编码:)

于 2014-02-06T05:56:28.613 回答
0

这是版本冲突。CDH 支持的 Avro 版本目前是 1.7.3。我在 1.7.5 中遇到了同样的问题,通过更改版本解决了这个问题。

来自 CDH 文档:http ://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/CDH4-Installation-Guide.html#../CDH4-Installation-指南/cdh4ig_topic_26_5.html

于 2013-10-22T14:51:36.507 回答