apache-spark - NoSuchMethodError 使用 Databricks Spark-Avro 3.2.0

标签 apache-spark avro databricks spark-avro

我有一个 spark master 和 worker 在带有 spark 2.0.2 和 hadoop 2.7 的 Docker 容器中运行。我正在尝试通过运行从不同的容器(同一网络)提交来自 pyspark 的作业

df = spark.read.json("/data/test.json")
df.write.format("com.databricks.spark.avro").save("/data/test.avro")

但是我收到了这个错误:

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

如果我以交互方式尝试或使用 spark-submit 都没有区别。这些是我在 spark 中加载的包:

com.databricks#spark-avro_2.11;3.2.0 from central in [default]
com.thoughtworks.paranamer#paranamer;2.7 from central in [default]
org.apache.avro#avro;1.8.1 from central in [default]
org.apache.commons#commons-compress;1.8.1 from central in [default]
org.codehaus.jackson#jackson-core-asl;1.9.13 from central in [default]
org.codehaus.jackson#jackson-mapper-asl;1.9.13 from central in [default]
org.slf4j#slf4j-api;1.7.7 from central in [default]
org.tukaani#xz;1.5 from central in [default]
org.xerial.snappy#snappy-java;1.1.1.3 from central in [default]

spark-submit --version 输出:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.0.2
      /_/

Branch 
Compiled by user jenkins on 2016-11-08T01:39:48Z
Revision 
Url 
Type --help for more information.

scala 版本是 2.11.8

我的 pyspark 命令:

PYSPARK_PYTHON=ipython /usr/spark-2.0.2/bin/pyspark --master spark://master:7077 --packages com.databricks:spark-avro_2.11:3.2.0,org.apache.avro:avro:1.8.1

我的 spark-submit 命令:

spark-submit script.py --master spark://master:7077 --packages com.databricks:spark-avro_2.11:3.2.0,org.apache.avro:avro:1.8.1

我读过 here这可能是由“正在使用旧版本的 avro”引起的,所以我尝试使用 1.8.1,但我一直遇到同样的错误。阅读 avro 效果很好。有帮助吗?

最佳答案

这个错误的原因是默认情况下hadoop中包含一个apache avro版本1.7.4,如果SPARK_DIST_CLASSPATH env 变量包括 ivy2 jar 之前的 hadoop common ( $HADOOP_HOME/share/common/lib/ ),可能会使用错误的版本而不是 spark-avro (>=1.7.6) 所需的版本并安装在 ivy2 中。

要检查是否是这种情况,请打开 spark-shell并运行

sc.getClass().getResource("/org/apache/avro/generic/GenericData.class")

这应该会像这样告诉您类的位置:

java.net.URL = jar:file:/lib/ivy/jars/org.apache.avro_avro-1.7.6.jar!/org/apache/avro/generic/GenericData.class

如果该类指向 $HADOOP_HOME/share/common/lib/那么你必须简单地在SPARK_DIST_CLASSPATH中的hadoop 之前包含你的ivy2 jars环境变量。

例如,在 Dockerfile 中

ENV SPARK_DIST_CLASSPATH="/home/root/.ivy2/*:$HADOOP_HOME/etc/hadoop/*:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/hdfs/lib/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/yarn/lib/*:$HADOOP_HOME/share/hadoop/yarn/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*:$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/tools/lib/*"

注意: /home/root/.ivy2是 ivy2 jar 的默认位置,您可以通过设置 spark.jars.ivy 来操纵它在你的spark-defaults.conf ,这可能是个好主意。

关于apache-spark - NoSuchMethodError 使用 Databricks Spark-Avro 3.2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43176394/

相关文章:

java - 使用 java 8 进行 Spark 提交

azure - 有没有办法在不选择导出单元格选项的情况下从databricks单元格中获取所有html代码?

scala - 从 scala 读取 Avro 文件

python - 如何从databricks显示和下载pptx文件?

pip - Databricks CLI 错误 databricks-connect' 无法识别

apache-spark - Spark : read multiple files and ignore the missing ones

python - Python的构建过程工具

azure - 使用 Azure Web API 应用程序中的 C# 查询 Azure Data Lake 中的 Parquet 数据

java - 从 Avro GenericRecord 获取类型值

java - Spring Cloud kafka和avro序列化问题