一、课前准备
- 安装好对应版本的hadoop集群,并启动hadoop的HDFS以及YARN服务
- 安装了MySQL服务,并启动MySQL的服务
二、课堂主题
- hive安装部署
三、课堂目标
- 掌握hive的安装部署
四、知识要点
1. Hive的安装部署(10分钟)
注意hive就是一个构建数据仓库的工具,只需要在一台服务器上安装就可以了,不需要在多台服务器上安装。
此处以安装到node03为例;请大家保持统一
使用hadoop普通用户操作
1.1 先决条件
- 搭建好三节点Hadoop集群;
- node03上先安装好MySQL服务;
- 参考文档:《CentOS 7安装MySQL5.7版本》
1.2 准备安装包
-
下载hive安装包, 不要从官网下载
链接:https://pan.baidu.com/s/1P7OhqQiyMci4iEsBfNt4Tg
提取码:NIIT -
规划安装目录
- /kkb/install
-
上传安装包到node03服务器中的/kkb/soft路径下
1.3 解压
-
解压安装包到指定的规划目录/kkb/install
[hadoop@node03 ~]$ cd /kkb/soft/ [hadoop@node03 soft]$ tar -xzvf apache-hive-3.1.2-bin.tar.gz -C /kkb/install
1.4 修改配置文件
- 进入hive安装目录
[hadoop@node03 install]$ cd /kkb/install/
- 重新命名hive目录
[hadoop@node03 install]$ mv apache-hive-3.1.2-bin/ apache-hive-3.1.2
- 修改/kkb/install/conf目录下的hive-site.xml, 默认没有该文件, 需要手动创建
[hadoop@node03 install]$ cd /kkb/install/apache-hive-3.1.2/conf/
[hadoop@node03 conf]$ vim hive-site.xml
- 进入编辑模式, 文件内容如下
javax.jdo.option.ConnectionURL
jdbc:mysql://node03:3306/metastore?useSSL=false
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
hive.metastore.warehouse.dir
/user/hive/warehouse
javax.jdo.option.ConnectionPassword
123456
hive.metastore.schema.verification
false
hive.metastore.event.db.notification.api.auth
false
hive.cli.print.current.db
true
hive.cli.print.header
true
hive.server2.thrift.bind.host
node03
hive.server2.thrift.port
10000
- 修改日志配置文件hive-log4j.properties
- 创建hive日志存储目录
[hadoop@node03 conf]$ mkdir -p /kkb/install/apache-hive-3.1.2/logs/
- 重命名生成文件hive-log4j.properties
[hadoop@node03 conf]$ pwd
/kkb/install/apache-hive-3.1.2/conf
[hadoop@node03 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties
[hadoop@node03 conf]$ vim hive-log4j2.properties # 修改文件
- 修改此文件的hive.log.dir属性的值
#更改以下内容,设置我们的hive的日志文件存放的路径,便于排查问题
property.hive.log.dir=/kkb/install/apache-hive-3.1.2/logs/

1.5 拷贝mysql驱动包
- 上传mysql驱动包,如
mysql-connector-java-5.1.38.jar到/kkb/soft目录中 - 由于运行hive时,需要向mysql数据库中读写元数据,所以==需要将mysql的驱动包上传到hive的lib目录下==
[hadoop@node03 ~]$ cd /kkb/soft/
[hadoop@node03 soft]$ cp mysql-connector-java-5.1.38.jar /kkb/install/apache-hive-3.1.2/lib/
1.6 解决日志Jar包冲突
# 进入lib目录
[hadoop@node03 conf]$ cd /kkb/install/apache-hive-3.1.2/lib/
# 重新命名 或者直接删除
[hadoop@node03 lib]$ mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak
1.6 配置Hive环境变量
- 切换到root用户下
[hadoop@node03 soft]$ su root
Password:
- 打开
/etc/profile文件
[root@node03 soft]# vim /etc/profile
- 末尾添加如下内容
export HIVE_HOME=/kkb/install/apache-hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin
- 切换回hadoop用户,并source
[root@node03 soft]# su hadoop
[hadoop@node03 soft]$ source /etc/profile
1.7 初始化元数据库
- 新建一个node03连接, 登录MySQL
# 连接MySQL, 用户名root, 密码123456
[hadoop@node03 ~]$ mysql -uroot -p123456
- 创建hive元数据, 需要和hive-site.xml中配置的一致
-- 创建数据库, 数据库名为: metastore
create database metastore;
show databases;
- 退出mysql
exit
- 初始化元数据库
[hadoop@node03 ~]$ schematool -initSchema -dbType mysql -verbose

看到schemaTool completed 表示初始化成功
1.7 验证安装
- ==hadoop集群已启动==
- ==mysql服务已启动==
- 在node03上任意目录启动hive cli命令行客户端
[hadoop@node03 ~]$ hive
# 启动成功之后, 警告信息可以忽略
- 查看有哪些数据库
show databases;

- 说明hive安装成功
- 退出cli
quit;
1.8 通过beeline连接代理服务器hiveserver2 操作hive
后期课堂中主要使用这种方式操作hive
- node01修改hadoop的core-site.xml文件
[hadoop@node03 ~]$ cd /kkb/install/hadoop-3.1.4/etc/hadoop
[hadoop@node03 hadoop]$ vim core-site.xml
- 在core-site.xml中添加以下配置信息
- 配置信息
hadoop.proxyuser.hadoop.hosts、hadoop.proxyuser.hadoop.groups中的hadoop用户需要修改为自己的用户名 
- 配置信息
hadoop.proxyuser.hadoop.hosts
*
hadoop.proxyuser.hadoop.groups
*
- 将core-site.xml文件同步到node02和node03
scp /kkb/install/hadoop-3.1.4/etc/hadoop/core-site.xml node02:/kkb/install/hadoop-3.1.4/etc/hadoop/
scp /kkb/install/hadoop-3.1.4/etc/hadoop/core-site.xml node03:/kkb/install/hadoop-3.1.4/etc/hadoop/
- 启动hiveserver2
[hadoop@node03 hive]$ cd /kkb/install/hive/
[hadoop@node03 hive]$ bin/hiveserver2 # 启动警告信息可以忽略

- 新建node03连接, 连接hiveserver2
[hadoop@node03 hive]$ cd /kkb/install/hive/
[hadoop@node03 hive]$ bin/beeline --color=true

- 通过jdbc方式连接hiveserver2, 输入用户名和密码
beeline> !connect jdbc:hive2://node03:10000
- 输入用户名: hadoop、密码: 123456
Enter username for jdbc:hive2://node03:10000: hadoop
Enter password for jdbc:hive2://node03:10000: 123456
- 测试
0: jdbc:hive2://node03:10000> show databases;

创建启停脚本
hive-services.sh
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
mkdir -p $HIVE_LOG_DIR
#检查进程是否运行正常,参数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 &"
cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 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
HiveServer2启动异常处理
一般hiverServer2的启动比较花时间,需等待5分钟左右才能启动,如果长时间还没有启动需要查看日志寻找失败原因:
异常1
Safe mode is ON. The reported blocks 3 needs additional 2 blocks to reach the threshold 0.9990 of total blocks 5. The number of live datanodes 2 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.
说明我们的损坏的文件比例超过了阈值, 这个阈值配置在hdfs中, 也就是说不允许任何一个块损坏掉. 如果我们配置成99%应该就不会触发safemode了.
由于系统断电,内存不足等原因导致dataNode丢失超过设置的丢失百分比,系统自动进入安全模式
解决办法
执行命令退出安全模式:
hadoop dfsadmin -safemode leave`
执行健康检查,删除损坏掉的block
hdfs fsck / -delete
运行后如果出现下面提示,表示修复完毕
The filesystem under path '/' is HEALTHY
如果没有修复则可以多执行一次
hdfs fsck命令
异常2
java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration
Views: 73
