1. metastore
metastore
有兩個意思,一是指存放元數據
的地方,一般是用MySQL數據庫,二是指metastore server
。
1.1 元數據(metastore)
如果默認不配置元數據,那則使用本地Derby數據庫,這是個僅限單用戶訪問的數據庫,僅適用於入門,不推薦在開發或生產環境使用,因此建議使用關係型數據庫存放元數據
以下修改爲MySQL存放元數據:
<!-- MySQL URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1:3306/hive_metastore</value>
</property>
<!-- MySQL Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!-- MySQL username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- MySQL password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hkl0419!mysql</value>
</property>
1.2 metastore server
指定MySQL作爲元數據的數據庫,便於多用戶訪問,但每個hive客戶端均需要配置MySQL的連接信息,一是不安全,二是一旦MySQL有改動,則所有hive配置均需要改動,因此就有了metastore server
,配置metastore server
並啓動一個該服務後,其他hive客戶端僅需要配置連接到此服務即可
配置:
<!-- metastore server,默認9083 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://ubuntu:9083</value>
</property>
啓動服務:
nohup hive --service metastore 2>&1 &
2. hiveserver2
hiveserver2
是一個服務端接口,使得其它客戶端(Java、beeline)可以連接到此服務執行HQL,得到返回結果
配置:
<!-- hiveserver2 連接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>ubuntu</value>
</property>
<!-- hiveserver2 連接的端口號,默認10000 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
啓動服務:
nohup hive --service hiveserver2 2>&1 &
3. metastore與hiveserver2的啓動關係
3.1 local metastore server
如果不配置metastore server,而直接啓動hiveserver2,那麼hiveserver2將會直連mysql,如果有多個hiveserver2,則都需要配置mysql連接信息,顯然不安全且繁瑣
3.2 remote metastore server
如果配置metastore server,則必須先啓動metastore server,且僅啓動一次,之後其他所有的hiveserver2都連到指定的metastore server
即可
4. 常見的連接流程
bin/hive --> mysql --> hdfs
bin/hive --> metastore server --> mysql --> hdfs
beeline --> hiveserver2 --> metastore server --> mysql --> hdfs
其它客戶端 --> hiveserver2 --> metastore server --> mysql --> hdfs