Day03 Hive基本概念与安装
文章目录
一、Hive基本概念
1. hive简介
Hive:用于解决海量结构化日志的数据统计工具。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
2. hive本质
其本质是将HQL转化为MapReduce程序:
注:(1)Hive处理的数据存储在HDFS
(2)Hive分析数据底层的实现是MapReduce
(3)执行程序运行在Yarn上
3. Hive的优点
-
操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
-
避免了去写MapReduce,减少开发人员的学习成本。
-
Hive常用于数据分析,对实时性要求不高的场合。
-
Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
-
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
4. Hive架构原理
-
解析器:将SQL字符串转换成抽象语法树AST,解析器会对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
-
编译器:将AST编译生成逻辑执行计划。
-
优化器:对逻辑执行计划进行优化。
-
执行器:把逻辑执行计划转换成可以运行的物理计划,也就是断定当前MR的执行是否需要基于上一步MR的结果。对于Hive来说,就是MR/Spark。
**Metastore:**hive元数据(表名,表的数据所在目录等)存储,hive中表的数据不在表中,而是在hdfs中,所以表会与hdfs中的数据产生映射关系。
默认存在自带的derby数据库中,但我们用mysql。
5. hive的运行机制
HQL -> Hive ->数据库查元数据->确定某表与hdfs中某文件存在关联->hive分析数据
Hive不是数据库!!!只是操作起来比较像,Hive的定义是数仓分析工具!并且数据库不能处理海量数据。
二、Hive安装
1. Mysql安装
为啥需要mysql?原因在于Hive默认使用的元数据库为derby,开启Hive之后就会占用元数据库,且不与其他客户端共享数据,如果想多窗口操作就会报错,操作比较局限。以我们需要将Hive的元数据地址改为MySQL,可支持多窗口操作。
tips:检查当前系统是否安装过Mysql并卸载
查询:rpm -qa | grep mariadb (CentOS6->mysql CentOS7 ->mariadb)
卸载:rpm -qa | grep mariadb | xargs -n1 sudo rpm -e –nodeps
-
将MySQL的tar包拷贝到
/opt/soft
目录下 -
解压MySQL安装包(不是gz包,所以不用加参数z)
tar -xvf /… -C /opt/module/
- 在安装目录下执行rpm安装(按顺序执行)
rpm -ivh mysql-common…
(1) common
(2) libs
(3) libs-compat
(4) client
(5) server(安装之前注意安装依赖)
如果第(5)步报错且为依赖问题解决方法->依赖下载:yum install -y libaio**(这个centos7中自带有)**
2. 初始化Mysql配置
-
初始化数据库
sudo mysqld --initialize --user=mysql
-
启动Mysql服务
sudo systemctl start mysqld
-
查看初始随机生成的密码
sudo cat /var/log/mysqld.log
-
登录Mysql数据库
mysql -uroot -p 密码
-
改密码
set password = password("新密码")
-
mysql数据库基础使用
显示所有数据库 show databases; 使用某个数据库 use 库名; 展示所有表 Show tables; 看表的结构 Desc 表名; 展示部分 Select ……… from ……;
-
将用户更改为所有登录
update user set host = '%' where user = 'root';
-
刷新权限
flush privileges;
3. hive解压配置环境变量
-
上传到/opt/soft中并解压hive的tar包(建议修改一下名字)
tar -zxvf /…… -C /opt/module mv apache-hive-…… hive(改名)
-
配置环境变量
vim /etc/profile 添加HIVE_HOME=/opt/module/hive/ PATH=$PATH:/HIVE_HOME/bin export PATH HIVE_HOME
-
解决日志jar包冲突,将hive自带的日志jar包删除(slf4j)
cd /opt/module/hive/lib ls | grep slf4j rm 出来的结果
-
在
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://hadoop101:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc连接的Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.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>123456</value>
</property>
<!-- Hive默认在HDFS的工作目录(存放路径) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</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>
</configuration>
由于hive要连接mysql是需要通过jdbc的方式,所以需要jdbc的驱动包,hive通过jdbc的方式连接mysql,所以需要将驱动包放到lib目录下hive才能找得着。
这里要将驱动包放入linux目录中。(mysql-connector-java-5.1.37)
4. 完善Hive,初始化元数据库
-
登录mysql
-
新建Hive元数据库表空间
metastore
create database metastore;
-
初始化Hive元数据库
schematool -initSchema -dbType mysql -verbose
5. 启动Hive
-
使用群起脚本启动(hadoop)
-
有两种客户端方式选择进入
- 直接敲hive启动普通客户端(格式调整做的很差)
- 启动相对高级的jdbc客户端,继续向下
-
配置
hiveserver2
到hive-site.xml
中cd到bin目录下,其中有个beeline命令,这个家伙就是基于jdbc协议去操作hive的,但hive正常情况下没有提供jdbc协议让咱们去连接,所以非常时期非常操作,hive提供了第二个服务:hiveserver2,它是一个中间商,它能帮助咱们去操作hive。
<!-- 指定hiveserver2连接的host --> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop101</value> </property> <!-- 指定hiveserver2连接的端口号 --> <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property>
-
启动中间商
hiveserver2
hive --service hiveserve2
该方式有个缺陷,会停顿,阻塞,而且不能关闭,关闭的话服务就停了。需要让该服务后台持续进行。
-
启动
beeline
连接中间商beeline -u jdbc:hive2://hadoop101:10000 -n tgm
-u (url) -n (name)
6. 脚本相关
- 如何让服务在后台不关闭运行且不输出日志信息到前台
前台启动的方式导致需要打开多个shell窗口,可以使用如下方式后台方式启动
nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态
0:标准输入
1:标准输出
2:错误输出
2>&1 : 表示将错误重定向到标准输出上
&: 放在命令结尾,表示后台运行
一般会组合使用:
nohup [xxx命令操作]> file 2>&1 &
表示将xxx命令运行的结果输出到file中,并保持命令启动的进程在后台运行。
nohup hive --service hiveserver2 2>&1 &(不要求掌握)
- 给出一个后台启动hiveserver的脚本
#!/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 &"
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
给脚本添加执行权限。
chmod +x 脚本名
启动集群后启动hive后台服务
- hiveserver start
- hiveserver status