我用的是星火红移(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)。
这对谁有意义吗?
4条答案
按热度按时间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-142543149mf98qq942#
仅供参考-alex nastetsky的解决方法
从主节点删除jar
从从属节点删除jar
按照jonathan的建议正确设置configs也是值得一试的。
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
[
{"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":[]}
]
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的合适分类。不过,我不确定这件事本身能解决你的问题。