我们正在 Iceberg 上进行 POC 并首次对其进行评估。
Spark 环境:
根据 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 依赖,那么它就可以正常工作。
我们使用了错误的 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