Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 在map reduce中反序列化avro对象时出现异常_Apache_Hadoop_Parallel Processing_Mapreduce_Avro - Fatal编程技术网

Apache 在map reduce中反序列化avro对象时出现异常

Apache 在map reduce中反序列化avro对象时出现异常,apache,hadoop,parallel-processing,mapreduce,avro,Apache,Hadoop,Parallel Processing,Mapreduce,Avro,我正在尝试运行MapReduce作业,该作业将avro文件作为输入并进行一些处理。我遵循apache在这里提供的示例程序 但我一直遇到这个例外 java.lang.Exception: java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter; at org.apache.h

我正在尝试运行MapReduce作业,该作业将avro文件作为输入并进行一些处理。我遵循apache在这里提供的示例程序

但我一直遇到这个例外

java.lang.Exception: java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter;
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)

Caused by: java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter;
知道我做错了什么吗?我已在底部指定了pom配置。此外,我使用的是MapR版本4

<repositories>
    <repository>
        <id>MapR</id>
        <url>http://repository.mapr.com/maven/.</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>1.2.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro</artifactId>
        <version>1.7.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-mapred</artifactId>
        <version>1.7.6</version>
        <classifier>hadoop2</classifier>
    </dependency>
</dependencies>

MapR
http://repository.mapr.com/maven/.
org.apache.hadoop
hadoop内核
1.2.0
假如
org.apache.avro
阿夫罗
1.7.6
org.apache.avro
阿夫罗·马普雷德
1.7.6
hadoop2

此类错误的常见原因如下:

  • 您的软件是根据avro的1.7.6版本编译的,但在运行时,可能加载了旧版本的类
  • 确保1.7.6是运行时类路径中avro工件的实际版本。在映射器的开头打印出类路径。如果您使用的是oozie,那么类路径jar将列在启动器作业输出中
  • 在类路径中看到的第一个avrojar将用于加载类,因此如果不是1.7.6,这就是问题所在
  • 通过将
    mapreduce.job.user.classpath.first
    configuration属性设置为true,可以强制类路径工件在任务的类路径中排在第一位

此外,您的pom中还有另一个错误,可能会导致您出现问题,可能就是您看到的问题。您使用的是为hadoop2编译的avro mapred工件,而您所依赖的hadoop工件是hadoop1的工件。这些不应该兼容。如果您使用的是hadoop1,请松开avro mapred上的hadoop2分类器,如果您使用的是hadoop2,请移除hadoop core,并将hadoop mapreduce客户端core放在一旁。

我通过在引导操作中注入正确的avro jar解决了这个问题,如下所述: