1

我不断得到

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

调用show()DataFrame 对象时。我正在尝试通过外壳(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
4

2 回答 2

2

DataFrame 对象本身是在该val df =...行创建的,但尚未读取数据。Spark 仅在您请求某种输出(如 adf.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 包标记为已提供,但由于某种原因,它在您的系统(或类路径)上不可用。

于 2016-06-10T20:34:32.220 回答
0

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

于 2016-06-21T17:35:15.513 回答