NoClassDefFoundError при использовании avro в spark-shell

я продолжаю получать

java.lang.NoClassDefFoundError: org/apache/avro/mapred/AvroWrapper

при вызове show() для объекта DataFrame. Я пытаюсь сделать это через оболочку (spark-shell --master yarn). Я вижу, что оболочка распознает схему при создании объекта DataFrame, но если я выполняю какие-либо действия с данными, она всегда будет выдавать NoClassDefFoundError при попытке создать экземпляр AvroWrapper. Я попытался добавить avro-mapred-1.8.0.jar в свой каталог $HDFS_USER/lib в кластере и даже включил его с помощью параметра --jar при запуске оболочки. Ни один из этих вариантов не сработал. Мы будем очень признательны за любые советы. Ниже приведен пример кода:

scala> import org.apache.spark.sql._
scala> import com.databricks.spark.avro._
scala> val sqc = new SQLContext(sc)
scala> val df = sqc.read.avro("my_avro_file") // recognizes the schema and creates the DataFrame object
scala> df.show // this is where I get NoClassDefFoundError

person Pudge    schedule 10.06.2016    source источник


Ответы (2)


Сам объект DataFrame создается на строке val df =..., но данные еще не считываются. Spark начинает читать и обрабатывать данные только тогда, когда вы запрашиваете какой-либо вывод (например, df.count() или df.show()).

Таким образом, исходная проблема заключается в том, что пакет avro-mapred отсутствует. Попробуйте запустить Spark Shell следующим образом:

spark-shell --packages org.apache.avro:avro-mapred:1.7.7,com.databricks:spark-avro_2.10:2.0.1 Пакет Spark Avro помечает пакет Avro Mapred как предоставленный, но он недоступен в вашей системе (или пути к классам) по той или иной причине.

person Daniel Zolnai    schedule 10.06.2016
comment
кажется, что он просто сидит там. дальше не пойдет. org.apache.avro#avro-mapred added as a dependency com.databricks#spark-avro_2.10 added as a dependency :: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0 confs: [default] - person Pudge; 11.06.2016
comment
Это странно. Можете ли вы вставить всю команду, которую вы используете для запуска spark-shell? - person Daniel Zolnai; 11.06.2016
comment
Извиняюсь за задержку с ответом, пару дней пришлось поменять задачи. Вот команда, которую я запускаю spark-shell --master yarn --packages org.apache.avro:avro-mapred:1.7.7,com.databricks:spark-avro_2.10:2.0.1. Кроме того, не уверен, что это имеет значение, но мы используем CDH 5.6. Спасибо еще раз. - person Pudge; 14.06.2016
comment
Это может показаться странным, но попробуйте использовать --packages в качестве первого аргумента и --master в качестве второго. Также вы попробовали использовать локальный мастер? - person Daniel Zolnai; 14.06.2016
comment
Прождав значительное количество времени, я наконец получил ошибку: Server access error at url https://repo1.maven.org/maven2/org/apache/avro/avro-mapred/1.7.7/avro-mapred-1.7.7.pom (java.net.ConnectException: Connection timed out). Я уверен, что это как-то связано с нашим прокси. - person Pudge; 14.06.2016
comment
Некоторый прогресс. Используя spark-shell --conf "spark.driver.extraJavaOptions=-Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=9000 -Dhttps.proxyHost=myproxy.com -Dhttps.proxyPort=9000" --packages org.apache.avro:avro-mapred:1.7.7,com.databricks:spark-avro_2.10:2.0.1 --master yarn, я могу получить зависимости, но теперь это не работает на [download failed: org.mortbay.jetty#jetty;6.1.26!jetty.zip] - person Pudge; 14.06.2016
comment
Я решил все проблемы с зависимостями, но все равно получаю тот же java.lang.NoClassDefFoundError: org/apache/avro/mapred/AvroWrapper. Если я запускаю локально, он работает нормально, но это противоречит цели, поскольку я пытаюсь проанализировать большой объем данных. На данный момент я меняю тактику и собираюсь развернуть вместо использования оболочки. Спасибо за вашу помощь. - person Pudge; 15.06.2016