Spark集群模式下Hive Metastore报错NoSuchFieldError: METASTOREURIS
问题分析与解决:YARN Cluster模式下Spark连接Hive Metastore报
NoSuchFieldError: METASTOREURIS 环境架构
- 边缘节点(容器以
--network host运行):- Hive Metastore
- PostgreSQL(Hive Metastore数据库)
- Jupyter Notebook
- 宿主机部署YARN ResourceManager
- 5个工作节点:运行HDFS与YARN NodeManager
问题现象
Spark任务在client模式下正常运行,切换至cluster模式时失败,报错:
Traceback (most recent call last): File "/usr/local/hadoop/yarn/nodemanager/data/usercache/spark/appcache/application_1738582462412_0011/container_1738582462412_0011_02_000001/test_query.py", line 8, in <module> spark.sql("SHOW DATABASES").show() java.lang.NoSuchFieldError: METASTOREURIS
关键配置
Spark Hive Metastore配置(spark-defaults.conf)
spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.spark_catalog.type=hive spark.sql.catalog.spark_catalog.uri=thrift://hive-metastore:9083
容器与宿主机网络映射
- 容器启动时添加的主机映射:
--add-host hive-metastore:192.168.225.208 --add-host spark-iceberg-notebook:192.168.225.208 --add-host dw2endev01.sme.astro:192.168.225.208 --add-host dw2endev01:192.168.225.208 --add-host dw2nndev01.sme.astro:192.168.225.209 - 宿主机
/etc/hosts配置片段:127.0.0.1 localhost 127.0.0.1 hive-metastore 127.0.0.1 spark-iceberg-notebook 192.168.225.208 dw2endev01.sme.astro dw2endev01 spark-iceberg-notebook hive-metastore 192.168.225.209 dw2nndev01.sme.astro dw2nndev01 sme-hadoop-cluster
已排查操作
- client模式任务执行成功,cluster模式失败
- 工作节点
/etc/hosts中hive-metastore解析正常
原因分析
这个错误不是网络问题,而是典型的类版本冲突/类路径不一致导致的:
METASTOREURIS是Hive Metastore客户端类中的字段,Spark在cluster模式下运行时,容器内的Hive客户端依赖与工作节点上的Spark/Hive依赖版本不匹配,导致加载的类缺少该字段。- Client模式下,驱动程序运行在边缘节点(容器内),直接使用容器内的依赖包,版本一致;而Cluster模式下,驱动程序会被提交到工作节点运行,工作节点上的Hive客户端版本与容器内的Hive Metastore版本不兼容,或者Spark的类路径中混入了不同版本的Hive依赖。
解决方案
1. 统一Hive与Spark依赖版本
- 确认边缘节点容器内的Hive Metastore版本,确保所有工作节点上的Spark配套Hive客户端版本完全一致。
- 如果使用Iceberg,需确保Iceberg的版本与Spark、Hive版本兼容。
2. 配置Spark的依赖包分发
在提交Spark任务时,显式指定Hive Metastore客户端的依赖包,确保Cluster模式下驱动和Executor都使用正确的版本:
spark-submit \ --master yarn \ --deploy-mode cluster \ --jars /path/to/hive-metastore-client-<version>.jar,/path/to/iceberg-spark-runtime-<version>.jar \ test_query.py
或者在spark-defaults.conf中配置spark.jars.packages指定Maven坐标,自动拉取兼容的依赖:
spark.jars.packages=org.apache.hive:hive-metastore-client:<hive-version>,org.apache.iceberg:iceberg-spark-runtime-<spark-version>_<scala-version>:<iceberg-version>
3. 清理工作节点的冲突依赖
检查工作节点的$SPARK_HOME/jars和$HADOOP_HOME/share/hadoop/common/lib目录,移除重复或版本不兼容的Hive相关JAR包(如hive-exec、hive-metastore等),避免类加载冲突。
4. 验证配置一致性
确保工作节点的hive-site.xml配置与边缘节点容器内的一致,特别是hive.metastore.uris字段:
<property> <name>hive.metastore.uris</name> <value>thrift://hive-metastore:9083</value> </property>
将该文件同步到所有工作节点的$SPARK_HOME/conf目录下,确保Cluster模式下驱动能读取到正确的Metastore地址。
内容的提问来源于stack exchange,提问作者Apicha
相关产品推荐
相关产品推荐

