2013-09-30 149 views
2

我正在研究一些MapR程序。它们通常在我本地机器上的Apache hadoop上进行编码和测试, 和打包的jar(具有依赖性)上载到运行Cloudera CDH4(v4.4.1)的群集中。对于这两种情况,我有不同的pom.xml文件来制作包。Cloudera CDH4如何与Avro一起使用?

现在我正在使用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版本有冲突,并会进一步与我们的集群管理员 联系。 任何想法,家伙?

贾敏

回答

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工件。

+0

嗨肖恩,它尚未解决。我实际上使用新的mapreduce API编译MR1,我们的CDH 4.4.1也配置了MR1。我有一些其他程序没有在群集上成功运行avro。因为默认情况下avro未随CDH管理器一起发货,所以稍后将手动安装。也许我需要一些故障排除这个安装进度.. – caesar0301

+0

它看起来像问题是Avro。 Avro是一个图书馆,因此在Cloudera Manager中本身没有地方。它是Hadoop的一部分,因此是CDH的一部分。我刚刚意识到你说Avro 1.7.5;当从1.7.4更新到1.7.5时,我记得有些问题阻止了我的更新,但我不认为是这样。我建议你直接匹配版本是CDH/Hadoop,我认为它是1.7.4。这个错误显示了Avro是为Hadoop 1而构建的,但遇到了Hadoop 2. –

+0

它是我尝试使用最新版本的开始。我会尝试你的建议,并对这两个版本进行匹配。 – caesar0301

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>` 

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

相关问题