添加对 Iceberg 的支持后 Spark Shell 无法工作

问题描述 投票:0回答:1

我们正在 Iceberg 上进行 POC 并首次对其进行评估。

Spark 环境:

  • Spark 独立集群设置(1 个主节点和 5 个工作节点)
  • Spark:spark-3.1.2-bin-hadoop3.2
  • Scala:2010 年 12 月 2 日
  • Java:1.8.0_321
  • Hadoop:3.2.0
  • 冰山0.13.1

根据 Iceberg 官方文档中的建议,为了在 Spark shell 中添加对 Iceberg 的支持,我们在启动 Spark shell 时添加 Iceberg 依赖项,如下所示,

spark-shell --packages org.apache.iceberg:iceberg-spark-runtime-3.2_2.12:0.13.1

使用上述命令启动 Spark shell 后,我们根本无法使用 Spark shell。对于所有命令(甚至非 Iceberg),我们都会得到如下相同的异常,

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/catalyst/plans/logical/BinaryCommand

下面的简单命令也抛出相同的异常。

val df : DataFrame = spark.read.json("/spark-3.1.2-bin-hadoop3.2/examples/src/main/resources/people.json")
df.show()

在 Spark 源代码中,

BinaryCommand
类属于
Spark SQL
模块,因此尝试在启动 Spark shell 时显式添加 Spark SQL 依赖项,如下所示,但仍然出现相同的异常。

spark-shell --packages org.apache.iceberg:iceberg-spark-runtime-3.2_2.12:0.13.1,org.apache.spark:spark-sql_2.12:3.1.2

当我们正常启动

spark-shell
时,即没有 Iceberg 依赖,那么它就可以正常工作。

scala apache-spark apache-iceberg
1个回答
1
投票

我们使用了错误的 Iceberg 版本,选择了 Spark 3.2 Iceberg jar,但运行的是 Spark 3.1。使用正确的依赖版本(即 3.1)后,我们可以使用 Iceberg 启动 Spark shell。也无需使用包指定

org.apache.spark
Spark jar,因为所有这些都将位于类路径中。

spark-shell --packages org.apache.iceberg:iceberg-spark-runtime-3.1_2.12:0.13.1
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.