Hive 3.1.3 生产安装
1.安装用于存储元数据的关系数据库
生产环境中一般存储元数据采用独立的关系型数据库而非Hive本地的嵌入式数据库
本地的嵌入式数据库无法支持多个请求同时访问。
本示例采用Mysql8.0作为示例
具体的支持列表参考官方文档:
https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration#AdminManualMetastoreAdministration-SupportedBackendDatabasesforMetastore
1.安装Mysql8.0
2.设置Mysql的Root账户允许远程登录
需要进入到mysql的shell中执行
update user set host = '%' where user = 'root';
刷新权限
flush privileges;
3.创建用户保存Hive元数据的数据库
create database hive;
4.下载Mysql JDBC连接驱动
地址1(Mysql官方托管):https://downloads.mysql.com/archives/c-j/
地址2(Maven中央仓库托管): https://mvnrepository.com/artifact/com.mysql/mysql-connector-j
2.配置Hive相关
1.解压
mkdir /usr/hive
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /usr/hive
2.配置Hive环境变量
在/etc/profile.d中配置
1.新建hive.sh
vi /etc/profile.d/hive.sh
export HIVE_HOME=/usr/hive/apache-hive-3.1.3-bin
export PATH=$PATH:$HIVE_HOME/bin
2.授予文件执行权限
chmod u+x /etc/profile.d/hive.sh
3.刷新环境变量
source /etc/profile
3.将Mysql JDBC连接驱动拷贝到Hive的lib目录下
cp /home/mysql-connector-j-8.0.33.jar $HIVE_HOME/lib
4.在$HIVE_HOME/conf
目录下新建hive-site.xml文件
vi $HIVE_HOME/conf/hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.58.130:3306/hive?createDatabaseIfNotExist=true&serverTimezone=Asia/Shanghai</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>coreqiwithhs</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>system:user.name</name>
<value>root</value>
</property>
</configuration>
5.初始化元数据库
注:需要保证Hadoop集群是开启状态
schematool -dbType mysql -initSchema -verbose
6.启动Hive
hive
7.测试
show databases;
show tables;
3.配置HiveServer2相关
1.配置Hadoop的代理用户功能
Hive的hiveserver2服务的作用是提供jdbc/odbc接口,为用户提供远程访问Hive数据的功能,例如用户期望在个人电脑中访问远程服务中的Hive数据,就需要用到Hiveserver2
在远程访问Hive数据时,客户端并未直接访问Hadoop集群,而是由Hivesever2代理访问。由于Hadoop集群中的数据具备访问权限控制,若启用Hiveserver2用户模拟的功能,则Hiveserver2会模拟成Hadoop客户端的登录用户去访问Hadoop集群的数据,不启用,则Hivesever2会直接使用当前Hive进程的启动用户去访问Hadoop集群数据。模拟用户的功能,默认是开启的。生产环境,推荐开启用户模拟功能,因为开启后才能保证各用户之间的权限隔离。
Hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户的身份访问Hadoop集群。因此,需要将Hiveserver2的启动用户设置为Hadoop的代理用户
修改配置文件core-site.xml
<!--配置所有节点的root用户都可作为代理用户-->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!--配置root用户能够代理的用户组为任意组-->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!--配置root用户能够代理的用户为任意用户-->
<property>
<name>hadoop.proxyuser.root.users</name>
<value>*</value>
</property>
2.Hive端配置
在hive-site.xml文件中添加如下配置信息
<!-- 指定hiveserver2连接的host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>192.168.58.130</value>
</property>
<!-- 指定hiveserver2连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
3.启动 hiveserver2 服务
1.前台启动
hiveserver2
或者
hive --service hiveserver2
2.后台启动
1.记录日志
nohup hiveserver2 1>/home/fanqi/hiveserver.log 2>/home/fanqi/hiveserver.err &
2.不记录日志
nohup hiveserver2 1>/dev/null 2>/dev/null &
等于
nohup hiveserver2 1>/dev/null 2>&1 &
等于
nohup hiveserver2 >/dev/null 2>&1 &
命令中的 1 和 2 的意义分别是:
1:表示标准日志输出;
2:表示错误日志输出。
如果我没有配置日志的输出路径,日志会生成在当前工作目录,默认的日志名称叫做:
nohup.xxx
nohup 命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用 nohup 命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
nohup 就是不挂起的意思(no hang up)。该命令的一般形式为:
nohup command &
4.连接
1.CLI
hive
2.Beeline
Beeline是Hive新的命令行客户端工具。
Beeline是从 Hive 0.11版本引入的。
HiveServer2 支持一个新的命令行Shell,称为Beeline,它是基于SQLLine CLI的JDBC客户端。
Beeline支持嵌入模式(embedded mode)和远程模式(remote mode)。在嵌入式模式下,运行嵌入式的Hive(类似Hive CLI),而远程模式可以通过Thrift连接到独立的HiveServer2进程上。从Hive 0.14版本开始,Beeline使用HiveServer2工作时,它也会从HiveServer2输出日志信息到STDERR。
beeline -u jdbc:hive2://192.168.58.130:10000 -n root
3.DBeaver,图形化工具【略】
4.Datagrip,图形化工具【略】
4.配置Metastore相关
Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口。
metastore有两种运行模式,分别为嵌入式模式和独立服务模式。
生产环境中,不推荐使用嵌入式模式。因为其存在以下两个问题:
- 嵌入式模式下,每个Hive CLI都需要直接连接元数据库,当Hive CLI较多时,数据库压力会比较大。
- 每个客户端都需要用户元数据库的读写权限,元数据库的安全得不到很好的保证。
1.配置Metastore服务
指定一个节点为Metastore服务提供节点,用于访问元数据并提供Metastore服务
hive-site.xml
配置文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.58.130:3306/hive?createDatabaseIfNotExist=true&serverTimezone=Asia/Shanghai</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>coreqiwithhs</value>
</property>
<property>
<name>system:user.name</name>
<value>root</value>
</property>
</configuration>
2.启动Metastore服务
1.前台启动
hive --service metastore
2.后台启动
1.记录日志
nohup hive --service metastore 1>/home/fanqi/hivemetastore.log 2>/home/fanqi/hivemetastore.err &
2.不记录日志
nohup hive --service metastore 1>/dev/null 2>/dev/null &
等于
nohup hive --service metastore 1>/dev/null 2>&1 &
等于
nohup hive --service metastore >/dev/null 2>&1 &
3.节点连接Metastore服务
在Hiveserver2和每个Hive CLI的配置文件hive-site.xml
中添加访问metastore服务所需的以下参数:
<!-- 指定metastore服务的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.58.130:9083</value>
</property>
注意:主机名需要改为metastore服务所在节点,端口号无需修改,metastore服务的默认端口就是9083。
此时Hiveserver2和每个Hive CLI的配置文件hive-site.xml
中无需包含访问元数据的数据库访问信息。
4.启动客户端节点
hive