Hive的metastore与hiveserver2
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