Cloudera CDH4如何与Avro配合使用?

时间:2013-09-30 08:24:36

标签: mapreduce cloudera avro

我正在研究一些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

3 个答案:

答案 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中遇到了同样的问题,通过更改版本解决了这个问题。

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