Hive 安装部署
Hive 安装部署
一、安装
1.1 下载解压
- 解压
apache-hive-3.1.3-bin.tar.gz
[root@node01 opt]# tar -xzf apache-hive-3.1.3-bin.tar.gz
- 修改
/etc/profile.d/my_env.sh
,添加环境变量
#HIVE_HOME
export HIVE_HOME=/opt/hive-3.1.3
export PATH=$PATH:$HIVE_HOME/bin
- 解决日志 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.2 配置 Metastore 到 MySQL
- 在$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://node01:3306/metastore?useSSL=false&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>
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node01:9083</value>
</property>
</configuration>
- 登陆mysql 新建元数据库
[root@node01 conf]# mysql -uroot -p's,r)SrtPp3tU'
mysql> create database metastore;
mysql> quit;
- 拷贝驱动
mv mysql-connector-java-8.0.25.jar $HIVE_HOME/lib
- 初始化Hive元数据库
schematool -initSchema -dbType mysql -verbose
碰到Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
处理, 这是因为hive内依赖的guava.jar
和hadoop内的版本不一致造成的
[tpxcer@node01 lib]$ rm $HIVE_HOME/lib/guava-19.0.jar
[tpxcer@node01 lib]$ cp $HADOOP_HOME/share/hadoop/hdfs/lib/guava-27.0-jre.jar $HIVE_HOME/lib/
1.3 启动Hive测试
- 启动hive
/opt/hive-3.1.3/bin/hive
- 使用Hive
hive> show databases;
hive> show tables;
hive> create table test (id int);
hive> insert into test values(1);
hive> select * from test;
二、使用元数据服务的方式访问 Hive
- 在hive-site.xml 文件中添加如下配置信息
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node01:9083</value>
</property>
- 启动 metastore服务
hive --service metastore
- 启动Hive
/opt/hive-3.1.3/bin/hive
三、使用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 实际配置
- 在
/hive/conf/hive-site.xml
文件中添加如下配置信息
<!-- 指定 node01 连接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node01</value>
</property>
<!-- 指定 hiveserver2 连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
- 启动 hiveserver2
$HIVE_HOME/bin/hiveserver2
$HIVE_HOME/bin/hive --service hiveserver2
- 权限配置
hadoop引入了一个安全伪装机制,使得hadoop 不允许上层系统直接将实际用户传递到hadoop层,而是将实际用户传递给一个超级代理,由此代理在hadoop上执行操作,避免任意客户端随意操作hadoop。在/hadoop/etc/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>
- 启动 beeline 客户端 beeline 细节内容可以查看hive客户端
beeline -u jdbc:hive2://node01:10000 -n tpxcer
3.3 其他配置项
- 配置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。
- 临时目录管理
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
五、Hive 常见属性配置
5.1 Hive 运行日志信息配置
- hive 的 log 默认存放在/tmp/username/hive.log 目录下(当前用户名下)
- 修改 hive 的 log 存放日志到/opt/hive/logs
[tpxcer@node01 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties
# 修改log存放位置
hive.log.dir=/opt/hive-3.1.3/logs