2013-09-30 2 views
2

Je travaille sur certains programmes MapR. Ils sont généralement codés et testés sur Apache hadoop sur ma machine locale, et jar packé (avec dépendances) est téléchargé sur notre cluster sous Cloudera CDH4 (v4.4.1). Pour les deux situations, j'ai différents fichiers pom.xml pour faire des paquets. Maintenant, j'utilise Apache Avro pour sérialiser les données et la version stable actuelle 1.7.5 est impliquée. En mode local, je Avro-mapred pom.xml dépendanceComment Cloudera CDH4 fonctionne avec Avro?

<dependency> 
    <groupId>org.apache.avro</groupId> 
    <artifactId>avro-mapred</artifactId> 
    <version>1.7.5</version> 
</dependency> 

et il fonctionne bien sur Apache Hadoop.

En mode cluster, pour la dépendance pom.xml, une étiquette de classificateur est joint en annexe comme suggéré par CDH4 doc:

<classifier>hadoop1</classifier> 

Mais ni hadoop1 ou hadoop2, erreur se produit. Pour tag 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) 

Pour tag 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) 

Je programmation en utilisant les nouvelles MapReduce interface MapR1. Je suppose également que c'est un conflit avec la version avro installé et d'autres contacts avec notre administrateur de cluster seront atteints. Des idées, les gars?

Jamin

Répondre

2

Le problème est presque certainement que vous développez avec une version très différente de Hadoop que vous utilisez contre. CDH 4.4 vient dans un "MR1" et "MR2" saveur, avec plus récent "MR2" étant la valeur par défaut. Je pense que vous compilez probablement contre une distribution Hadoop 1.x? Vous n'avez pas besoin de compiler avec les bibliothèques CDH (bien que ce soit la meilleure idée ici), mais si je suis ici, vous aurez au moins besoin de compiler avec Hadoop 2.x.

Votre Avro va bien sauf que vous n'avez pas besoin de spécifier "hadoop1" non plus. Ou, si vous avez vraiment l'intention d'utiliser MR1, vous devez vous assurer que vous avez réellement mis en place un cluster MR1 dans CDH 4.4. Cela signifie installé dans le service 'mapreduce' au lieu de 'yarn' et utilisant des artefacts Maven avec "... -mr1 -..." dans le nom.

+0

Salut Sean, Ce n'est pas encore résolu. Je compile actuellement avec MR1 en utilisant de nouvelles API mapreduce et notre CDH 4.4.1 est également configuré avec MR1. J'ai d'autres programmes sans avro fonctionnant avec succès sur le cluster. Comme avro n'est pas livré avec le gestionnaire CDH par défaut, il est installé manully plus tard. Peut-être que j'ai besoin d'un peu de dépannage sur cette progression de l'installation .. – caesar0301

+0

Il semble que le problème est Avro. Avro est une bibliothèque donc n'a pas de place en soi dans Cloudera Manager. Il fait partie de Hadoop et fait donc partie de CDH. Je viens de réaliser que vous avez dit Avro 1.7.5; Je me souviens d'un problème lors de la mise à jour de 1.7.4 à 1.7.5 qui m'a empêché de mettre à jour, mais je ne pense pas que c'était cela. Je vous conseille de faire correspondre la version est CDH/Hadoop, directement, ce que je pense est 1.7.4. Cette erreur montre que l'Avro est construit pour Hadoop 1 mais rencontre Hadoop 2. –

+0

C'est un début pour moi d'essayer avro donc la dernière version est utilisée. Je vais essayer vos conseils et donner un match sur ces deux versions. – caesar0301

2
  ` <dependency> 
     <groupId>org.apache.avro</groupId> 
     <artifactId>avro-mapred</artifactId> 
     <version>${avro.version}</version> 
     <classifier>hadoop2</classifier> 
    </dependency>` 

Cela ne la magie !! Son problème avec la hadoop2 et hadoop1

se réfèrent - https://issues.apache.org/jira/browse/AVRO-1170

ci-dessus était pour Cloudera

Et pour amazon 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>` 

Ceux-ci l'ont fait ... Codage heureux :)