avro错误

xiozqbni  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(331)

我用的是星火红移(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试着下载了其他几个avromapred和avrojars,试过设置

{"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)。
这对谁有意义吗?

zysjyyx4

zysjyyx41#

spark-redshift 这里是维修人员。
其他emr用户在使用更新版本的 spark-avro 图书馆(哪个 spark-redshift 视情况而定)。简而言之,问题似乎在于emr的旧版本avro优先于 spark-avro . 在https://github.com/databricks/spark-avro/issues/91,此问题似乎与此处报告的异常情况相符,一位用户建议将avro JAR嵌入其应用程序代码:https://github.com/databricks/spark-avro/issues/91#issuecomment-142543149

mf98qq94

mf98qq942#

仅供参考-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也是值得一试的。

huus2vyu

huus2vyu3#

与avro相关的emr中的runntime冲突错误非常常见。avro应用广泛,很多jar都有它的依赖性。我在“nosuchmethoderror”或不同的avro版本中看到了这个问题的不同方法的一些变体。
我无法用'spark.executor.userclasspathfirst'标志解决它,因为我得到了linkageerror。
以下是解决冲突的方法:
使用intellij的依赖性分析器(maven插件)将avro从所有导致冲突的依赖性中排除。
设置emr时,添加一个引导操作,该操作调用一个bash脚本,该脚本下载特定的avrojar: #!/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

设置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":[]}
]

如您所见,我不得不将我的新库添加到现有库中。否则就没用了。
flseospp

flseospp4#

我是急诊室的乔纳森。部分问题是hadoop依赖于avro1.7.4,完整的hadoop类路径包含在emr上的spark路径中。它可能会帮助我们升级hadoop的avro依赖到1.7.7,以便与spark的avro依赖相匹配,尽管我有点担心这可能会破坏其他东西,但我还是可以尝试一下。
顺便说一句,我注意到您的示例emr cluster config的一个问题是,您使用的是“spark env”配置分类,而“spark defaults”分类将是设置spark.{driver,executor}.userclasspathfirst的合适分类。不过,我不确定这件事本身能解决你的问题。

相关问题