使用DBT执行Nessie命令出现语法错误,Spark环境下运行正常
问题原因与解决方案
核心问题定位
从堆栈跟踪可见,Spark Thrift Server实际加载的Nessie扩展版本为0.51.1,但EMR配置中指定的是0.63.0,版本不一致导致语法解析失败。USE REFERENCE是Nessie较新版本才支持的语法,旧版本解析器无法识别该指令。同时,DBT通过Thrift Server连接Spark时,Thrift Server未正确继承EMR Spark的依赖配置,导致未加载指定版本的Nessie扩展。
解决方案
1. 统一依赖版本并确保Thrift Server加载正确包
修改EMR的spark-defaults配置,强制Thrift Server使用与Spark一致的依赖包:
[ { "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }, { "Classification": "spark-defaults", "Properties": { "spark.jars.packages": "org.apache.iceberg:iceberg-spark-runtime-3.3_2.12:1.3.0,org.projectnessie.nessie-integrations:nessie-spark-extensions-3.3_2.12:0.63.0", "spark.sql.catalog.dev_catalog": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.dev_catalog.auth_type": "NONE", "spark.sql.catalog.dev_catalog.catalog-impl": "org.apache.iceberg.nessie.NessieCatalog", "spark.sql.catalog.dev_catalog.ref": "main", "spark.sql.catalog.dev_catalog.uri": "https://nessie-dev.dev.XYZ.cloud/api/v1", "spark.sql.catalog.dev_catalog.warehouse": "s3://.../nessie_catalog/", "spark.sql.defaultCatalog": "dev_catalog", "spark.sql.execution.pyarrow.enabled": "true", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,org.projectnessie.spark.extensions.NessieSparkSessionExtensions", "spark.hive.thriftserver.jars": "${spark.jars}" } } ]
修改后重启EMR集群,确保Thrift Server加载指定版本的依赖。
2. 临时兼容写法(无需重启集群)
如果无法立即重启集群,可在DBT中使用旧版本兼容的分支切换语法,效果与USE REFERENCE一致:
ALTER SESSION SET spark.sql.catalog.dev_catalog.ref = 'demo_branch2';
3. 验证依赖加载有效性
集群重启后,登录主节点执行以下命令,确认Thrift Server加载的Nessie版本为0.63.0:
ps aux | grep thriftserver | grep nessie
内容的提问来源于stack exchange,提问作者Gleeb
相关产品推荐
相关产品推荐

