问题描述:
- 环境:Hadoop 2.9.2 + Hive 2.3.7 ,集群由三台搭载 Centos7 系统的虚拟机模拟
- 问题:HDFS 和 Yarn 成功启动之后,在任意一个节点上启动 Hive 并使用
show databases;
命令查看数据库列表时,均会报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
产生原因:
Hive 的核心配置文件 hive-site.xml
中可见,元数据存放于节点3的MySQL中:
<!-- hive元数据的存储位置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://centos7-3:3306/hivemetadata?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
如果仅有以上配置,则 Hive 元数据连接方式为 Local 模式,通过 JDBC 直接访问节点3上的 MySQL,从而获取元数据。
但 hive-site.xml
中还同时指定了 metastore thrift 连接的 地址&端口:
<!-- 指定 metastore 的地址和端口 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://centos7-3:9083</value>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>3600</value>
</property>
此时,Hive 的元数据连接方式变为 Remote 模式,即使用 HiveMetaStoreClient 远程访问节点3的9083端口,获取元数据信息。
【参考】Hive 元数据的三种连接方式
https://www.cnblogs.com/snowbook/p/5886438.html
但此刻节点3的9083端口上并没有启动 matastore 服务,因此集群上的任意节点都无法远程访问,自然无法读取元数据。
解决方案:
在节点3上使用如下命令启动 metastore 服务:
# 后台启动 metastore 服务器端,默认使用 9083 端口
nohup hive --service metastore &
# 或者使用指定的端口号:
nohup hive --service metastore -p 9083 &
需要注意:服务器端口号需要与客户端配置文件中配置的监听端口号一致
再次启动 Hive 查看数据库列表,成功!
网友评论