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)
这对任何人都有影响吗
# 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 楼答案
这里是维护者
其他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# 3 楼答案
与Avro相关的EMR运行时间冲突错误非常常见。 Avro被广泛使用,很多罐子都依赖它。 在“NoSuchMethodError”或不同的Avro版本中,我很少看到这个问题的不同方法
我没能用“火花”解决它。遗嘱执行人。userClassPathFirst’标志,因为我得到了LinkageError
以下是为我解决冲突的解决方案:
设置EMR时,添加一个引导操作,该操作调用下载特定Avro JAR的bash脚本:
#!/bin/bash
设置EMR时,添加以下配置:
如你所见,我不得不在现有的库中添加我的新库。否则就没用了
# 4 楼答案
仅供参考-Alex Nastetsky的解决方案
从主节点删除JAR
从从属节点删除JAR
按照Jonathan的建议正确设置configs也值得一试