NoSuchMethodError с использованием Databricks Spark-Avro 3.2.0

У меня есть мастер и рабочий искры, работающие в контейнерах Docker со искрой 2.0.2 и Hadoop 2.7. Я пытаюсь отправить задание из 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. Это мои загруженные пакеты в искре:

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

Я прочитал здесь, что это может быть вызвано "старой версией avro», поэтому я попытался использовать 1.8.1, но все равно получаю ту же ошибку. Чтение авро работает нормально. Любая помощь?


person arinarmo    schedule 03.04.2017    source источник
comment
Это была моя ошибка, script.py должно идти после параметров spark-submit, но не является причиной ошибки. Приложение действительно регистрируется в веб-интерфейсе Spark. Я уже нашел проблему и решение и скоро опубликую его. По сути, Hadoop включает в себя библиотеку avro (1.7.4), которую можно использовать вместо нужной, если путь к классам задан неправильно.   -  person arinarmo    schedule 04.04.2017
comment
Напишите, пожалуйста, как вы решили проблему в итоге? Я сталкиваюсь с той же проблемой.   -  person hiddenbit    schedule 21.04.2017
comment
Только что выложил свое решение   -  person arinarmo    schedule 26.04.2017


Ответы (2)


Причина этой ошибки заключается в том, что apache avro версии 1.7.4 включен в hadoop по умолчанию, и если переменная env SPARK_DIST_CLASSPATH включает общий вид hadoop ($HADOOP_HOME/share/common/lib/ ) до jar-файлов ivy2, вместо требуемой версии может использоваться неправильная версия. от 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/, то вы должны просто включить свои файлы jar ivy2 перед в переменную SPARK_DIST_CLASSPATH env.

Например, в 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.jars.ivy в spark-defaults.conf, что, вероятно, является хорошей идеей.

person arinarmo    schedule 25.04.2017

Я уже сталкивался с подобной проблемой. Попробуйте использовать параметр --jars {путь к spark-avro_2.11-3.2.0.jar} в spark-submit

person shants    schedule 03.04.2017