有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

AWS EMR上的java avro错误

我使用的是spark红移(https://github.com/databricks/spark-redshift),它使用avro进行传输

读红移是可以的,而写我得到的

Caused by: java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter

尝试使用Amazon EMR 4.1.0(Spark 1.5.0)和4.0.0(Spark 1.4.1)。 不行

import org.apache.avro.generic.GenericData.createDatumWriter

或者,只是

import org.apache.avro.generic.GenericData

我使用的是scala shell 尝试下载其他几个avro mapred和avro JAR,尝试设置

{"classification":"mapred-site","properties":{"mapreduce.job.user.classpath.first":"true"}},{"classification":"spark-env","properties":{"spark.executor.userClassPathFirst":"true","spark.driver.userClassPathFirst":"true"}}

并将这些JAR添加到spark类路径。可能需要以某种方式调整Hadoop(EMR)

这对任何人都有影响吗


共 (4) 个答案

  1. # 1 楼答案

    这里是EMR的乔纳森。部分问题在于Hadoop依赖于Avro 1.7.4,完整的Hadoop类路径包含在EMR上的Spark路径中。这可能有助于我们将Hadoop的Avro依赖项升级到1.7.7,以便与Spark的Avro依赖项相匹配,尽管我有点担心这可能会破坏其他功能,但我还是可以尝试一下

    顺便说一句,我注意到您的EMR集群配置示例存在一个问题,即您使用的是“spark env”配置分类,而“spark defaults”分类将是设置spark的合适分类。{司机,执行人}。userClassPathFirst。但我不确定这本身就能解决你的问题

  2. # 3 楼答案

    与Avro相关的EMR运行时间冲突错误非常常见。 Avro被广泛使用,很多罐子都依赖它。 在“NoSuchMethodError”或不同的Avro版本中,我很少看到这个问题的不同方法

    我没能用“火花”解决它。遗嘱执行人。userClassPathFirst’标志,因为我得到了LinkageError

    以下是为我解决冲突的解决方案:

    1. 使用Intellij的依赖性分析器(Maven插件)将Avro从所有导致冲突的依赖性中排除
    2. 设置EMR时,添加一个引导操作,该操作调用下载特定Avro JAR的bash脚本:

      #!/bin/bash

      mkdir -p /home/hadoop/lib/
      cd /home/hadoop/lib/
      wget http://apache.spd.co.il/avro/avro-1.8.0/java/avro-1.8.0.jar
      
    3. 设置EMR时,添加以下配置:

      [
      {"classification":"spark-defaults", "properties":{
      "spark.driver.extraLibraryPath":"/home/hadoop/lib/avro-1.8.0.jar:/usr/lib/hadoop/*:/usr/lib/hadoop/../hadoop-hdfs/*:/usr/lib/hadoop/../hadoop-mapreduce/*:/usr/lib/hadoop/../hadoop-yarn/*:/etc/hive/conf:/usr/lib/hadoop/../hadoop-lzo/lib/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*", 
      "spark.executor.extraClassPath":"/home/hadoop/lib/avro-1.8.0.jar:/usr/lib/hadoop/*:/usr/lib/hadoop/../hadoop-hdfs/*:/usr/lib/hadoop/../hadoop-mapreduce/*:/usr/lib/hadoop/../hadoop-yarn/*:/etc/hive/conf:/usr/lib/hadoop/../hadoop-lzo/lib/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*", 
      "spark.driver.extraClassPath":"/home/hadoop/lib/avro-1.8.0.jar:/usr/lib/hadoop/*:/usr/lib/hadoop/../hadoop-hdfs/*:/usr/lib/hadoop/../hadoop-mapreduce/*:/usr/lib/hadoop/../hadoop-yarn/*:/etc/hive/conf:/usr/lib/hadoop/../hadoop-lzo/lib/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*"}, 
      "configurations":[]}
      ]
      

    如你所见,我不得不在现有的库中添加我的新库。否则就没用了

  3. # 4 楼答案

    仅供参考-Alex Nastetsky的解决方案

    从主节点删除JAR

    find / -name "*avro*jar" 2> /dev/null -print0 | xargs -0 -I file sudo rm file
    

    从从属节点删除JAR

    yarn node -list | sed 's/ .*//g' | tail -n +3 | sed 's/:.*//g' | xargs -I node ssh node "find / -name "*avro*jar" 2> /dev/null -print0 | xargs -0 -I file sudo rm file
    

    按照Jonathan的建议正确设置configs也值得一试