2017-04-03 69 views
2

我有一個火花主&工人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工作正常。任何幫助?

+1

這是我的錯誤,'script.py'應'火花submit'參數後走,但不是錯誤的原因。該應用程序確實正在註冊星火網頁UI。我已經發現問題並解決方案和即將發佈它。基本上,Hadoop包含一個avro(1.7.4)庫,如果類路徑設置不正確,可以使用它來代替所需的庫。 – arinarmo

+0

你可以請你發佈你如何解決問題到底?我遇到同樣的問題。 – hiddenbit

+1

剛剛發佈我的解決方案 – arinarmo

回答

0

此錯誤的原因是,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,這可能是一個好主意。

0

我以前也遇到過類似的問題。 嘗試使用--jars {路徑火花avro_2.11-3.2.0.jar}選項火花提交