在spark-shell中使用avro时的NoClassDefFoundError

时间:2016-06-10 18:50:01

标签: apache-spark spark-dataframe spark-avro

我一直在

  

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

在DataFrame对象上调用show()时。我试图通过shell(spark-shell --master yarn)来做到这一点。我可以看到shell在创建DataFrame对象时识别模式,但是如果我对数据执行任何操作,它将在尝试实例化NoClassDefFoundError时始终抛出AvroWrapper。我尝试在群集上的avro-mapred-1.8.0.jar目录中添加$HDFS_USER/lib,甚至在启动shell时使用--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

2 个答案:

答案 0 :(得分:2)

DataFrame对象本身是在val df =...行创建的,但数据尚未读取。当您要求某种输出时(例如df.count()df.show()),Spark只会开始读取和处理数据。

所以最初的问题是缺少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软件包,但由于某种原因,它无法在您的系统(或类路径)上使用。

答案 1 :(得分:0)

如果有其他人遇到这个问题,我终于解决了。我删除了CDH spark包并从http://spark.apache.org/downloads.html下载了它。之后一切正常。不确定CDH版本的问题是什么,但我不会再浪费时间试图解决它。