一、Hive的简介
1.1 出现的原因
facebook团队要管理和分析大量的结构化的日志文件,因为写mapreduce非常麻烦,所以该团队就开发出来一个框架,叫hive.
1.2 hive是什么
hive是一款运行在hadoop上的数据仓库管理工具,可以将具有结构化的数据文件映射成一张数据表,使用类似sql的方式来对这种文件进行读、写、管理(包括元数据)等。这种类sql的语言,称之为Hive SQL,简称HQL。 实际上hive底层是mapreduce或者是spark或者是tez.
如果是mapreduce,则是将hql翻译成对应的mapreduce程序。
1.3 Hive的优缺点
一、优点
1. 学习成本低
2. 扩展性好
3. 适合做离线分析(OLAP)
4. 容错性好(某一个节点宕机,hive依然可以完成)
5. 延展性好(用户可以自定义hive函数)
6. hive的元数据统一管理。
二、缺点:
1. hive的表达能力有限(特别复杂的算法难以实现)
3. hive的效率低(调优不方便,速度慢)
二、hive的框架原理(重点)
2.1 hive的框架结构
1. 用户接口层: 就是供用户链接hive的接口,有三类。
- shell命令行接口
- jdbc/odbc接口
- webui接口
2. Thrift server:hive的可选组件(第三方组件),供编程语言链接hive时使用。
3. metaStore:元数据库
用来存储hive的元数据的,元数据包括库名,表名,表字段,字段类型,表数据所在的目录等。
注意:hive在工作时,会访问元数据库,可能是读取元数据,也可能是更改元数据。
4. Driver: hive的驱动
- 解析器: 解析hql语法
- 编译器: 将没有问题的hql翻译成mr程序
- 优化器: 对翻译好的mr程序进行部分优化(比如去掉不必要的列等)
- 执行器: 提交mr程序job。
2.2 hive的运行原理
1. 用户提交hql语句给Driver.
2. Driver的解析器校验hql,然后传给编译器,由编译器翻译成mr执行计划。
3. 编译器读取元数据库里的元数据
4. 编译器获取元数据后,再次完善mr执行计划,比如设置输入路径等。
5. 将完善后的mr执行计划交由driver。此时,整个解析和翻译过程结束。
6. driver将执行计划交给执行引擎
7. 执行引擎提交作业到yarn上,运行mr程序
8. 运算结果交由执行引擎。
9.执行引擎获取数据后,交给driver
10.driver将结果传递给用户。
2.3 hive和hadoop的关系
hive就像是在hadoop上的一个壳子。 hive要处理的数据存储在hdfs/hbase上。hive的计算基于mapreduce/spark/tez
三、hive的安装模式
3.1 内嵌模式的简介
hive的元数据存储在自带的derby数据库中,就是内嵌模式。缺点,只支持单session。
3.2 本地模式
3.2.1 简介
元数据库是关系型数据库mysql,hive的相关进程都在同一台机器上,与mysql在哪一台机器上无关。
注意:hive在启动客户端时,会内置的自动启动一个元数据服务项。
3.2.2 安装步骤
准备工作. 安装好mysql(任意一台机器即可)
**步骤1:**上传,解压,更名,配置环境变量
步骤2: 修改hive-env.sh
如果不存在,就用hive.env.sh.template复制一个
export HIVE_CONF_DIR=/usr/local/hive/conf
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
步骤3: 修改hive-site.xml
hive2.1.1中默认是没有hive-site.xml
,可以把conf/hive-default.xml.template
拷贝过来使用
<!--配置mysql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--配置登录mysql的密码,注意,注意,注意,要用自己的远程密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>@Mmforu45</value>
</property>
<!-- 该参数主要指定Hive的数据存储目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 该参数主要指定Hive的临时文件存储目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<!-- 一些临时文件夹的配置 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/iotmp/root</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>
步骤4: 导入mysql的驱动包到lib目录下
步骤5:初始化元数据库
]# schematool -initSchema -dbType mysql
步骤6: 使用hive指令运行客户端即可
]# hive
3.3 远程模式
3.3.1 概念
hive的服务项进程必须单独启动,服务项有两个,一个是hiveserver2,一个是metastore。 启动哪一个都可以,注意启动hiveserver2时,其本质还是在内部启动了metastore
3.3.2 hive的服务端的配置
<!--配置mysql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--配置登录mysql的密码,注意,注意,注意,要用自己的远程密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>@Mmforu45</value>
</property>
<!-- 该参数主要指定Hive的数据存储目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 该参数主要指定Hive的临时文件存储目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<!-- 一些临时文件夹的配置 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/iotmp/root</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>
3.3.3 hive的客户端配置
只需要在某台机器上安装了hive即可。
原理:客户端链接服务端,服务端连接mysql数据库
注意,注意,注意,必须配置hadoop的core-site.xml文件,添加以下配置
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
3.3.4 启动客户端连接服务项
1)启动服务项
启动hiveserver2:
方法1:
直接调用hiveserver2。会进入监听状态不退出。
方法2:
hive --service hiveserver2 & 进入后台启动
方法3:
hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。
启动metastore:
方法1:
- hive --service metastore &
方法2:
- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。
2)使用beeline工具连接hiveserver2服务项
方式1:
step1. beeline 回车
step2. !connect jdbc:hive2://ip:10000 回车
step3. 输入用户名 回车
step4. 输入密码 回车
方法2(直连):
1. beeline -u jdbc:hive2://ip:10000 -n 用户名
解析:
hive2,是hive的协议名称
ip: hiveserver2服务所在的主机IP。
10000,是hiveserver2的端口号
3)使用hive指令连接metastore服务项
想要连接metastore服务的客户端必须配置如下属性和属性值
<property>
<name>hive.metastore.uris</name>
<value>thrift://ip:9083</value>
</property>
解析:thrift:是协议名称
ip为metastore服务所在的主机ip地址
9083是默认端口号
配置完,直接使用hive指令即可