# Hive 安装部署

# 一、安装

# 1.1 下载解压

  1. 解压apache-hive-3.1.2-bin.tar.gz
[root@master01 opt]# tar -xzf apache-hive-3.1.2-bin.tar.gz
1
  1. 修改/etc/profile.d/my_env.sh,添加环境变量
#HIVE_HOME
export HIVE_HOME=/opt/hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin
1
2
3
  1. 解决日志 Jar 包冲突 (可选)

hive默认日志路径/tmp/username/hive.log

mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
1

# 1.2 配置 Metastore 到 MySQL

  1. 在$HIVE_HOME/conf 目录下新建 hive-site.xml 文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- jdbc 连接的 URL -->
	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:mysql://master01:3306/metastore?useSSL=false&amp;allowPublicKeyRetrieval=true</value>
	</property>
	<!-- jdbc 连接的 Driver -->
	<property>
		<name>javax.jdo.option.ConnectionDriverName</name>
		<value>com.mysql.cj.jdbc.Driver</value>
	</property>
	<!-- jdbc 连接的 username -->
	<property>
		<name>javax.jdo.option.ConnectionUserName</name>
		<value>root</value>
	</property>
	<!-- jdbc 连接的 password -->
	<property>
		<name>javax.jdo.option.ConnectionPassword</name>
		<value>s,r)SrtPp3tU</value>
	</property>
	<!-- Hive 元数据存储版本的验证 -->
	<property>
		<name>hive.metastore.schema.verification</name>
		<value>false</value>
	</property>
	<!-- 元数据存储授权 -->
	<property>
		<name>hive.metastore.event.db.notification.api.auth</name>
		<value>false</value>
	</property>
	<!-- Hive 默认在 HDFS 的工作目录 -->
	<property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive/warehouse</value>
	</property>
    <!-- 打印 当前库 和 表头 -->
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  1. 登陆mysql 新建元数据库
[root@master01 conf]# mysql -uroot -p's,r)SrtPp3tU'
mysql> create database metastore;
mysql> quit;
1
2
3
  1. 拷贝驱动
mv mysql-connector-java-8.0.25.jar $HIVE_HOME/lib
1
  1. 初始化Hive元数据库
schematool -initSchema -dbType mysql -verbose
1

# 1.3 启动Hive测试

  1. 启动hive
/opt/hive-3.1.2/bin/hive
1
  1. 使用Hive
hive> show databases;
hive> show tables;
hive> create table test (id int);
hive> insert into test values(1);
hive> select * from test;
1
2
3
4
5

# 二、使用元数据服务的方式访问 Hive

  1. 在hive-site.xml 文件中添加如下配置信息
<!-- 指定存储元数据要连接的地址 --> 
    <property>
       <name>hive.metastore.uris</name>
       <value>thrift://master01:9083</value>
    </property>
1
2
3
4
5
  1. 启动 metastore服务
hive --service metastore
1
  1. 启动Hive
/opt/hive-3.1.2/bin/hive
1

# 三、使用HiveServer2(JDBC 方式访问 Hive)

# 3.1 概念

HiveServer2(后面简称HS2)是从Hive 0.11版本开始引入的,它提供了一个服务器接口,允许客户端在Hive中执行查询并取回查询结果。当前的实现是一个HiveServer的改进版本,它基于Thrift RPC,支持多客户端身份认证和并发操作,其设计对JDBC、ODBC这样的开放API客户端提供了更好的支持。

HS2使用单一进程提供两种服务,分别是基于Thrift的Hive服务和一个Jetty Web服务器。基于Thrift的Hive服务是HS2的核心,它对Hive查询(例如从Beeline里发出的查询语句)做出响应。

Thrift是提供跨平台服务的RPC框架,允许客户端使用包括Java、C++、Ruby和其他很多语言,通过编程的方式远程访问Hive。它由服务器、传输、协议和处理器四层组成。

  • 服务器。对于TCP请求,HS2使用Thrift中的TthreadPoolServer服务器提供响应,对于HTTP请求,会通过Jetty服务器做出响应。TThreadPoolServer会为每个TCP连接分配一个工作线程,该线程和相关的连接绑定在一起,即便是空连接也会分配一个线程。如果因并发连接过多使得线程数太大,会有潜在的性能问题。未来的HS2会可能为TCP请求提供其他类型的服务器,例如TThreadedSelectorServer。
  • 传输。有TCP和HTTP两种传输模式。如果在客户端和服务器之间存在代理服务器(如因为负载均衡或安全方面的需要),那么只能通过HTTP模式访问Hive。这也就是HS2除了TCP方式外,还支持HTTP的原因。可以使用hive.server2.transport.mode配置参数指定Thrift服务的传输模式。
  • 协议。协议的实现是为了进行序列化和反序列化。HS2当前使用TBinaryProtocol作为它的Thrift序列化协议。将来可能会基于性能评估考虑其他协议,如TCompactProtocol。
  • 处理器。负责处理应用逻辑的请求,例如,ThriftCLIService.ExecuteStatement()方法实现编译和执行Hive查询的逻辑。

Hive通过Thrift提供Hive元数据存储的服务。通常来说,用户不能够调用元数据存储方法来直接对元数据进行修改,而应该通过HiveQL语言让Hive来执行这样的操作。用户应该只能通过只读方式来获取表的元数据信息。在5.6节我们配置了SparkSQL通过HS2服务访问Hive的元数据。

# 3.2 实际配置

  1. 在hive-site.xml 文件中添加如下配置信息
    <!-- 指定 master01 连接的 host --> 
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>master01</value>
    </property>
    <!-- 指定 hiveserver2 连接的端口号 --> 
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>
1
2
3
4
5
6
7
8
9
10
  1. 启动 hiveserver2
$HIVE_HOME/bin/hiveserver2
$HIVE_HOME/bin/hive --service hiveserver2
1
2
  1. 权限配置
    hadoop引入了一个安全伪装机制,使得hadoop 不允许上层系统直接将实际用户传递到hadoop层,而是将实际用户传递给一个超级代理,由此代理在hadoop上执行操作,避免任意客户端随意操作hadoop。在hadoop/core-site.xml中加入以下配置
    注意配置中的“root”代表的是一个用户,你异常中User后面的用户写的是哪个,你在这里就配置哪个。hadoop.proxyuser.root.hosts 配置成*的意义,表示任意节点使用 hadoop 集群的代理用户 root 都能访问 hdfs 集群,hadoop.proxyuser.root.groups 表示代理用户的组所属。
    <property>
        <name>hadoop.proxyuser.tpxcer.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.tpxcer.groups</name>
        <value>*</value>
    </property> 
1
2
3
4
5
6
7
8
  1. 启动 beeline 客户端 beeline 细节内容可以查看hive客户端
beeline -u jdbc:hive2://master01:10000 -n tpxcer 
1

# 3.3 其他配置项

  1. 配置HS2

不同版本的HS2,配置属性可能会有所不同。最基本的配置是在hive-site.xml文件中设置如下属性:

  • hive.server2.thrift.min.worker.threads:默认值是5,最小工作线程数。
  • hive.server2.thrift.max.worker.threads:默认值是500,最大工作线程数。
  • hive.server2.thrift.port:默认值是10000,监听的TCP端口号。
  • hive.server2.thrift.bind.host:TCP接口绑定的主机。

除了在hive-site.xml配置文件中设置属性,还可以使用环境变量设置相关信息。环境变量的优先级别要高于配置文件,相同的属性如果在环境变量和配置文件中都有设置,则会使用环境变量的设置,就是说环境变量或覆盖掉配置文件里的设置。可以配置如下环境变量:

  • HIVE_SERVER2_THRIFT_BIND_HOST:用于指定TCP接口绑定的主机。
  • HIVE_SERVER2_THRIFT_PORT:指定监听的TCP端口号,默认值是10000。

HS2支持通过HTTP协议传输Thrift RPC消息(Hive 0.13以后的版本),这种方式特别用于支持客户端和服务器之间存在代理层的情况。当前HS2可以运行在TCP模式或HTTP模式下,但是不能同时使用两种模式。使用下面的属性设置启用HTTP模式:

  • hive.server2.transport.mode:默认值是binary,设置为http启用HTTP传输模式。
  • hive.server2.thrift.http.port:默认值是10001,监听的HTTP端口号。
  • hive.server2.thrift.http.max.worker.threads:默认值是500,服务器池中的最大工作线程数。
  • hive.server2.thrift.http.min.worker.threads:默认值是5,服务器池中的最小工作线程数。

可以配置hive.server2.global.init.file.location属性指定一个全局初始化文件的位置(Hive 0.14以后版本),它或者是初始化文件本身的路径,或者是一个名为“.hiverc”的文件所在的目录。在这个初始化文件中可以包含的一系列命令,这些命令会在HS2实例中运行,例如注册标准的JAR包或函数等。

如下参数配置HS2的操作日志:

  • hive.server2.logging.operation.enabled:默认值是true,当设置为true时,HS2会保存对客户端的操作日志。
  • hive.server2.logging.operation.log.location:默认值是${java.io.tmpdir}/${user.name}/operation_logs,指定存储操作日志的顶级目录。
  • hive.server2.logging.operation.verbose:默认值是false,如果设置为true,HS2客户端将会打印详细信息。
  • hive.server2.logging.operation.level:默认值是EXECUTION,该值允许在客户端的会话级进行设置。有四种日志级别,NONE忽略任何日志;EXECUTION记录完整的任务日志;PERFORMANCE在EXECUTION加上性能日志;VERBOSE记录全部日志。

默认情况下,HS2以连接服务器的用户的身份处理查询,但是如果将下面的属性设置为false,那么查询将以运行HS2进程的用户身份执行。当遇到无法创建临时表一类的错误时,可以尝试设置此属性:

  • hive.server2.enable.doAs:作为连接用户的身份,默认值为true。

为了避免不安全的内存溢出,可以通过将以下参数设置为true,禁用文件系统缓存:

  • fs.hdfs.impl.disable.cache:禁用HDFS缓存,默认值为false。
  • fs.file.impl.disable.cache:禁用本地文件系统缓存,默认值为false。
  1. 临时目录管理

HS2允许配置临时目录,这些目录被Hive用于存储中间临时输出。临时目录相关的配置属性如下。

  • hive.scratchdir.lock:默认值是false。如果设置为true,临时目录中会持有一个锁文件。如果一个Hive进程异常挂掉,可能会遗留下挂起的临时目录。使用cleardanglingscratchdir工具能够删除挂起的临时目录。如果此参数为false,则不会建立锁文件,cleardanglingscratchdir工具也不能删除任何挂起的临时目录。
  • hive.exec.scratchdir:指定Hive作业使用的临时空间目录。该目录用于存储为查询产生的不同map/reduce阶段计划,也存储这些阶段的中间输出。
  • hive.scratch.dir.permission:默认值是700。指定特定用户对根临时目录的权限。
  • hive.start.cleanup.scratchdir:默认值是false。指定是否在启动HS2时清除临时目录。在多用户环境下不使用该属性,因为可能会删除正在使用的临时目录。

# 四、Hive启动脚本

#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
    mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口
function check_process()
{
   pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print$2}')
   ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
   echo $pid
   [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
    metapid=$(check_process HiveMetastore 9083)
    cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    [ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动"
    server2pid=$(check_process HiveServer2 10000)
    cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
}
function hive_stop()
{
    metapid=$(check_process HiveMetastore 9083)
    [ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动"
    server2pid=$(check_process HiveServer2 10000)
    [ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动"
}
case $1 in
"start")
    hive_start
    ;;
"stop")
    hive_stop
    ;;
"restart")
    hive_stop
    sleep 2
    hive_start
    ;;
"status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行正常" || echo "Metastore 服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2 服务运行异常"
    ;;
*)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status'
    ;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 五、Hive 常见属性配置

# 5.1 Hive 运行日志信息配置

  1. hive 的 log 默认存放在/tmp/username/hive.log 目录下(当前用户名下)
  2. 修改 hive 的 log 存放日志到/opt/hive/logs
[tpxcer@master01 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties
# 修改log存放位置
hive.log.dir=/opt/hive-3.1.2/logs
1
2
3
更新时间: 9/23/2021, 7:22:06 PM