创建Google Dataproc集群连接远程Hive metastore失败相关问题咨询
Dataproc对接远程Hive Metastore问题解答
问题1:创建集群时的配置方式是否正确且唯一?
- 你当前的配置方式不正确,也不是对接远程Hive Metastore的唯一方式,需要分场景调整配置:
- 如果你要对接已独立部署的远程Hive Metastore服务,不需要配置
hive:javax.jdo.option.*这类元数据库连接参数,直接指定远程Metastore服务地址即可。你当前的配置触发了Dataproc默认的本地Hive Metastore服务启动逻辑,集群会检测本地9083端口是否存活,最终因本地服务未正常启动报错。
正确的集群创建配置示例:
--properties 'spark:spark.sql.hive.metastore.version=2.3.0,spark:spark.sql.hive.metastore.jars=maven,hive:hive.metastore.uris=thrift://<远程Hive Metastore服务地址>:9083'- 如果你要让Dataproc本地Hive Metastore复用远程MySQL的元数据,需要先确认Dataproc集群到远程MySQL的3306端口连通性正常、账号有对应库的读写权限,同时显式添加
--optional-components HIVE_METASTORE参数启动本地Metastore服务,若元数据schema版本不匹配,还需要先执行schematool命令升级schema才能正常启动。
- 如果你要对接已独立部署的远程Hive Metastore服务,不需要配置
- 对接方式不是唯一的,除了集群创建阶段预配置,还可以在作业提交阶段配置,或者手动上传配置文件到集群。
问题2:是否可以在提交Spark作业时配置访问远程Hive Metastore?
可以,不需要在集群创建阶段预配置,操作指引如下:
- 提交spark-sql/spark-submit作业时,通过
--conf参数指定对应配置即可,示例命令:
spark-sql \ --conf spark.sql.hive.metastore.version=2.3.0 \ --conf spark.sql.hive.metastore.jars=maven \ --conf hive.metastore.uris=thrift://<远程Hive Metastore服务地址>:9083
- 如果是在Spark代码中配置,可以在初始化SparkSession时添加对应配置项,示例(Scala):
val spark = SparkSession.builder() .config("spark.sql.hive.metastore.version", "2.3.0") .config("spark.sql.hive.metastore.jars", "maven") .config("hive.metastore.uris", "thrift://<远程Hive Metastore服务地址>:9083") .enableHiveSupport() .getOrCreate()
注意:作业运行节点需要能正常访问远程Metastore的9083端口
问题3:其他可解决该问题的方案
除了上述两种对接方式,还有两种可行方案:
- 方案1:将远程Hive Metastore的配置文件
hive-site.xml上传到Dataproc集群所有节点的/etc/spark/conf/、/etc/hive/conf/目录下,集群所有组件和作业会自动读取配置,不需要额外指定参数。 - 方案2:如果不想自行维护Metastore服务,可直接使用云厂商托管的Hive Metastore服务,创建集群时直接关联对应实例即可,不需要手动配置连接参数。
内容的提问来源于stack exchange,提问作者Joyan
相关产品推荐
相关产品推荐

