You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Apache Spark与Apache Iceberg时遇版本兼容错误求助

问题排查与版本兼容修复方案

核心问题分析

你遇到的两个错误本质都是Spark、Iceberg与Hive Metastore的版本不兼容:

  1. NoSuchMethodError:Spark 3.1.1默认依赖Hive 2.3.x的Metastore API,你引入了Hive 3.1.0的Metastore jar,两者API签名不匹配导致方法找不到。
  2. UnsupportedOperationException:Spark 3.1.1官方不支持Hive 3.1.3版本的Metastore,仅兼容Hive 2.3.x系列。
  3. 额外问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:22:47