問(wèn)題描述:
- 環(huán)境:Hadoop 2.9.2 + Hive 2.3.7 ,集群由三臺(tái)搭載 Centos7 系統(tǒng)的虛擬機(jī)模擬
- 問(wèn)題:HDFS 和 Yarn 成功啟動(dòng)之后,在任意一個(gè)節(jié)點(diǎn)上啟動(dòng) Hive 并使用
show databases;命令查看數(shù)據(jù)庫(kù)列表時(shí),均會(huì)報(bào)錯(cuò):Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
產(chǎn)生原因:
Hive 的核心配置文件 hive-site.xml 中可見(jiàn),元數(shù)據(jù)存放于節(jié)點(diǎn)3的MySQL中:
<!-- hive元數(shù)據(jù)的存儲(chǔ)位置 -->
<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 元數(shù)據(jù)連接方式為 Local 模式,通過(guò) JDBC 直接訪問(wèn)節(jié)點(diǎn)3上的 MySQL,從而獲取元數(shù)據(jù)。
但 hive-site.xml 中還同時(shí)指定了 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>
此時(shí),Hive 的元數(shù)據(jù)連接方式變?yōu)?Remote 模式,即使用 HiveMetaStoreClient 遠(yuǎn)程訪問(wèn)節(jié)點(diǎn)3的9083端口,獲取元數(shù)據(jù)信息。
【參考】Hive 元數(shù)據(jù)的三種連接方式
https://www.cnblogs.com/snowbook/p/5886438.html
但此刻節(jié)點(diǎn)3的9083端口上并沒(méi)有啟動(dòng) matastore 服務(wù),因此集群上的任意節(jié)點(diǎn)都無(wú)法遠(yuǎn)程訪問(wèn),自然無(wú)法讀取元數(shù)據(jù)。
解決方案:
在節(jié)點(diǎn)3上使用如下命令啟動(dòng) metastore 服務(wù):
# 后臺(tái)啟動(dòng) metastore 服務(wù)器端,默認(rèn)使用 9083 端口
nohup hive --service metastore &
# 或者使用指定的端口號(hào):
nohup hive --service metastore -p 9083 &
需要注意:服務(wù)器端口號(hào)需要與客戶端配置文件中配置的監(jiān)聽(tīng)端口號(hào)一致
再次啟動(dòng) Hive 查看數(shù)據(jù)庫(kù)列表,成功!
