配置Apache Spark与Apache Iceberg时遇版本兼容错误求助
问题排查与版本兼容修复方案
核心问题分析
你遇到的两个错误本质都是Spark、Iceberg与Hive Metastore的版本不兼容:
NoSuchMethodError:Spark 3.1.1默认依赖Hive 2.3.x的Metastore API,你引入了Hive 3.1.0的Metastore jar,两者API签名不匹配导致方法找不到。UnsupportedOperationException:Spark 3.1.1官方不支持Hive 3.1.3版本的Metastore,仅兼容Hive 2.3.x系列。- 额外问题:Iceberg的
iceberg-spark-runtime-3.1(1.3.0)和iceberg-hive-metastore(1.3.1)版本不一致,可能引发依赖冲突。
具体修复步骤
1. 统一Iceberg模块版本
确保所有Iceberg相关依赖版本一致,避免跨版本冲突:将iceberg-spark-runtime-3.1版本从1.3.0改为1.3.1,和iceberg-hive-metastore保持统一。
2. 替换兼容的Hive Metastore版本
Spark 3.1.1仅支持Hive 2.3.x系列的Metastore,将hive-metastore版本改为2.3.9(Spark 3.1.1默认绑定的Hive版本)。
3. 修正SparkSession配置
- 指定兼容的Hive Metastore版本为
2.3.9 - 本地运行时添加
spark.sql.hive.metastore.jars配置,让Spark自动拉取兼容的jar包
4. 调整Jackson版本兼容
Spark 3.1.1默认使用Jackson 2.11.x,将依赖覆盖改为匹配版本,避免序列化/反序列化冲突。
修改后的配置代码
build.sbt
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.12.15" lazy val root = (project in file(".")) .settings( name := "iceberg" ) val sparkVersion = "3.1.1" libraryDependencies ++= Seq( "com.github.pureconfig" %% "pureconfig" % "0.14.0", "org.apache.spark" %% "spark-core" % sparkVersion % Compile, "org.apache.spark" %% "spark-sql" % sparkVersion % Compile, "org.apache.hadoop" % "hadoop-aws" % sparkVersion % Compile, "com.github.housepower" % "clickhouse-integration-spark_2.12" % "2.7.1", "com.github.housepower" % "clickhouse-native-jdbc" % "2.7.1", // 统一Iceberg版本为1.3.1 "org.apache.iceberg" %% "iceberg-spark-runtime-3.1" % "1.3.1" % Compile, "org.apache.spark" %% "spark-hive" % sparkVersion % Compile, // 使用Spark 3.1.1兼容的Hive Metastore版本 "org.apache.hive" % "hive-metastore" % "2.3.9", "org.apache.iceberg" % "iceberg-hive-metastore" % "1.3.1" ) dependencyOverrides ++= Seq( // 改为Spark 3.1.1兼容的Jackson版本 "com.fasterxml.jackson.module" % "jackson-module-scala_2.12" % "2.11.4", "com.fasterxml.jackson.core" % "jackson-databind" % "2.11.4", "com.fasterxml.jackson.core" % "jackson-core" % "2.11.4" )
修改后的SparkSession配置
val spark = SparkSession.builder() .appName("MyJob") .master("local") // Iceberg扩展配置 .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") .config("spark.sql.catalog.spark_catalog", "org.apache.iceberg.spark.SparkSessionCatalog") .config("spark.sql.catalog.spark_catalog.type", "rest") .config("spark.sql.catalog.spark_catalog.uri", "https://iceberg.foo.org") // S3配置 .config("spark.sql.catalog.hadoop_prod.hadoop.fs.s3a.endpoint", "http://s3.foo.org:9000") .config("spark.sql.catalog.hadoop_prod.hadoop.fs.s3a.access.key", appConfig.s3.accessKey) .config("spark.sql.catalog.hadoop_prod.hadoop.fs.s3a.secret.key", appConfig.s3.secretKey) .config("spark.sql.catalog.spark_catalog.warehouse.dir", "s3a://foo-iceberg-prod") // 指定兼容的Hive Metastore版本 .config("spark.sql.hive.metastore.version", "2.3.9") // 让Spark自动从Maven拉取兼容的Metastore jar包(本地运行时需要) .config("spark.sql.hive.metastore.jars", "maven") .config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog") .config("spark.sql.catalog.local.type", "hadoop") .config("spark.sql.catalog.local.warehouse", "./warehouse") .config("spark.sql.defaultCatalog", "spark_catalog") .enableHiveSupport() .getOrCreate()
额外说明
- Spark 3.2+版本开始支持Hive 3.x的Metastore,若后续需要升级Hive Metastore版本,建议同步升级Spark到3.2及以上。
- 集群环境下需确保集群中的Hive Metastore版本与配置的
spark.sql.hive.metastore.version一致,避免客户端与服务端版本不匹配。
内容的提问来源于stack exchange,提问作者mrkoloev
相关产品推荐
相关产品推荐

