的NoSuchMethodError使用Databricks星火的Avro 3.2.0
我有一个火花主&工人Docker容器火花2.0.2和Hadoop 2.7运行。我试图通过运行的NoSuchMethodError使用Databricks星火的Avro 3.2.0
df = spark.read.json("/data/test.json")
df.write.format("com.databricks.spark.avro").save("/data/test.avro")
从不同的容器(同一网络)pyspark提交一份工作,但我得到这个错误:
java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter;
这没有什么区别,如果我尝试交互式或者用spark-submit。这些都是我装包火花:
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.
阶版本是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 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工作正常。任何帮助?
此错误的原因是,Apache的版本的Avro 1.7.4包含在默认情况下的hadoop,并且如果SPARK_DIST_CLASSPATH
环境变量包括ivy2罐子之前Hadoop的公共($HADOOP_HOME/share/common/lib/
),错误的版本能习惯,而不是由火花阿夫罗(> = 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/
那么你必须简单之前,包括你的ivy2罐在SPARK_DIST_CLASSPATH
环境变量共同Hadoop的。
例如,在一个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罐子的默认位置,你可以操纵,通过在你的spark-defaults.conf
设置spark.jars.ivy
,这可能是一个好主意。
我以前也遇到过类似的问题。 尝试使用--jars {路径火花avro_2.11-3.2.0.jar}选项火花提交
这是我的错误,'script.py'应'火花submit'参数后走,但不是错误的原因。该应用程序确实正在注册星火网页UI。我已经发现问题并解决方案和即将发布它。基本上,Hadoop包含一个avro(1.7.4)库,如果类路径设置不正确,可以使用它来代替所需的库。 – arinarmo
你可以请你发布你如何解决问题到底?我遇到同样的问题。 – hiddenbit
刚刚发布我的解决方案 – arinarmo