Hive 3.1.2
Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化和半结构化的数据文件映射为一张数据库表,并提供简单的 sql 查询功能
Hive的基本概念
《上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费》
Hive简介
Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步可以说hive就是一个MapReduce客户端
思考:计算文件user.txt中张三出现几次,使用mapreduce怎么写,然后再比照下图的hive的实现过程
-
为什么使用Hive
-
直接不使用hadoop
1)人员学习成本太高
2)项目要求周期太短
3)MapReduce实现复杂查询逻辑开发难度太大
-
为什么要使用Hive
1)操作接口采用类SQL语法,提供快速开发能力
2)免去了写MapReduce,减少开发人员学历成本
3)功能扩展很方便
-
-
Hive的特点
-
可扩展性
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务
-
延伸性
Hive支持自定义函数,用户可以根据自己的需要来实现自己的函数
-
容错
即使节点出现错误,SQL仍然可以完成执行
-
-
Hive优缺点
-
优点
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
- 避免了去写MapReduce,减少开发人员的学习成本。
- Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
- Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
- Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
- 集群可自由拓展并且具有良好的容错性,节点出现问题SQL仍可完成执行。
-
缺点
- Hive的HQL表达能力有限
(1)迭代式算法无法表达
(2)数据挖掘方面不擅长
- Hive的效率比较低
(1)Hive自动生成的MapReduce作业,通常情况下不够智能化
(2)Hive调优比较困难,粒度较粗
-
-
Hive和传统数据库对比
-
Hive应用场景
-
日志分析:大部分互联网公司使用hive进行日志分析,包括百度、淘宝等。
- 统计网站一个时间段内的pv、uv
- 多维度数据分析
-
海量结构化数据离线分析
-
Hive架构
Client
Hive允许client连接的方式有三个CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)。JDBC访问时中间件Thrift软件框架,跨语言服务开发。DDL DQL DML,整体仿写一套SQL语句。
-
client--需要下载安装包
-
JDBC/ODBC 也可以连接到Hive
- 现在主流都在倡导第二种 HiveServer2/beeline
- 做基于用户名和密码安全的一个校验
-
Web Gui
- hive给我们提供了一套简单的web页面
- 我们可以通过这套web页面访问hive
- 做的太简陋了
Metastore
元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。
- 一般需要借助于其他的数据载体(数据库)
- 主要用于存放数据库的建表语句等信息
- 推荐使用Mysql数据库存放数据
- 连接数据库需要提供:uri username password driver
Driver
元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中,推荐使用Mysql进行存储。
(1) 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如ANTLR;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2) 编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3) 优化器(Query Optimizer):对逻辑执行计划进行优化。
(4) 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
数据处理
Hive的数据存储在HDFS中,计算由MapReduce完成。HDFS和MapReduce是源码级别上的整合,两者结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
Hive的安装
| 节点\功能 | metastore | hiveserver2 | client |
|---|---|---|---|
| node01 | * | * | |
| node02 | |||
| node03 | * |
PS: 安装前 请确认当前集群已经安装了Mysql数据库和Hadoop的Ha+Yarn
下载上传解压
-
下载地址
- archive.apache.org/dist/hive/
-
[root@node01 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz [root@node01 ~]# mv apache-hive-3.1.2-bin /opt/yjx/ [root@node01 ~]# cd /opt/yjx/apache-hive-3.1.2-bin/conf
修改配置文件
-
配置hive-env.sh
- [root@node01 conf]# cp hive-env.sh.template hive-env.sh
- [root@node01 conf]# vim hive-env.sh
-
export HADOOP_HOME=/opt/yjx/hadoop-3.1.2/ export HIVE_CONF_DIR=/opt/yjx/apache-hive-3.1.2-bin/conf export HIVE_AUX_JARS_PATH=/opt/yjx/apache-hive-3.1.2-bin/lib
-
创建hive-site.xml
- [root@node01 conf]# cp hive-default.xml.template hive-site.xml
- [root@node01 conf]# vim hive-site.xml
- 删除多余的配置文件 6897dd
-
<!-- 数据库相关配置 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> <!-- 自动创建表 --> <property> <name>datanucleus.schema.autoCreateAll</name> <value>true</value> </property> <!-- 元数据校验 --> <property> <name>hive.metastore.schema.verification</name> <value>false</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> <!-- hive server --> <property> <name>hive.server2.webui.host</name> <value>node01</value> </property> <property> <name>hive.server2.webui.port</name> <value>10002</value> </property> <!-- 数据存储位置 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/hive/warehouse</value> </property> <!--指定hive.metastore.uris的port.为了启动metastore服务的时候不用指定端口--> <property> <name>hive.metastore.uris</name> <value>thrift://node01:9083</value> </property>
注意:如果MySQL数据库是8.0那么
<value>com.mysql.jdbc.Driver</value>要改成<value> com.mysql.cj.jdbc.Driver</value> -
修改core-site.xml
- [root@node01 conf]# vim /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml
- 后面添加配置信息
-
<!--该参数表示可以通过httpfs接口hdfs的ip地址限制--> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <!--通过httpfs接口访问的用户获得的群组身份--> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
配置日志组件
-
创建文件目录
- [root@node01 ~]# mkdir -p /opt/yjx/apache-hive-3.1.2-bin/logs
- [root@node01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties
- [root@node01 conf]# vim hive-log4j2.properties
-
24行 property.hive.log.dir = /opt/yjx/apache-hive-3.1.2-bin/logs
添加驱动包
-
Mysql驱动添加到hive的lib目录下(注意数据库的版本)
[root@node01 ~] mv ~/mysql-connector-java-5.1.32-bin.jar /opt/yjx/apache-hive-3.1.2-bin/lib/ # 如果是8.0的数据库,那么 [root@node01 ~] mv ~/mysql-connector-java-8.0.20.jar /opt/yjx/apache-hive-3.1.2-bin/lib/ -
Guava包
- 首先要删除hadoop中的guava-*.jar包
-
[root@node01 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar [root@node01 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar - 将Hive的Guava拷贝给Hadoop
-
[root@node01 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/ [root@node01 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/
配置环境变量
《上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费》
-
vim /etc/profile
-
export HIVE_HOME=/opt/yjx/apache-hive-3.1.2-bin export PATH=$HIVE_HOME/bin:$PATH
-
拷贝到其他节点
-
hive文件夹
-
[root@node02 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/ [root@node03 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
-
-
环境变量
-
[root@node01 ~]# scp /etc/profile root@node02:/etc/profile [root@node01 ~]# scp /etc/profile root@node03:/etc/profile - 【123】source /etc/profile
-
-
core-stie.xml
-
[root@node01 ~]# scp /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml root@node02:/opt/yjx/hadoop-3.1.2/etc/hadoop/ [root@node01 ~]# scp /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml root@node03:/opt/yjx/hadoop-3.1.2/etc/hadoop/
-
-
jar包
-
[root@node02 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar [root@node02 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar [root@node03 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar [root@node03 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar [root@node02 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/ [root@node02 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/ [root@node03 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/ [root@node03 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/
-
客户端配置文件
-
选取node03为客户端节点
- [3] vim /opt/yjx/apache-hive-3.1.2-bin/conf/hive-site.xml
-
<property> <name>hive.metastore.warehouse.dir</name> <value>/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.schema.verification</name> <value>false</value> </property> <property> <name>datanucleus.schema.autoCreateAll</name> <value>true</value> </property> <!--指定hive.metastore.uris的port.为了启动metastore服务的时候不用指定端口--> <!--hive ==service metastore -p 9083 & | hive ==service metastore--> <property> <name>hive.metastore.uris</name> <value>thrift://node01:9083</value> </property>
启动集群
-
启动Zookeeper
- 【123】zkServer.sh start
-
启动Hdfs+Yarn
- [root@node01 ~]# start-all.sh
-
初始化数据库
- [root@node01 ~]# schematool -dbType mysql -initSchema
-
启动Hive
-
启动服务器 二选一
- [root@node01 ~]# hive --service metastore
- [root@node01 ~]# nohup hive --service metastore > /dev/null 2>&1 &
-
[root@node03 ~]# hive
-
-
启动HiveServer2
-
启动服务器 二选一
- nohup hive --service metastore > /dev/null 2>&1 &
- [root@node01 ~]# hiveserver2
- [root@node01 ~]# nohup hiveserver2 > /dev/null 2>&1 &
-
[root@node03 ~]# beeline -u jdbc:hive2://node01:10000 -n root
-
Hive的三种交互方式
1)第一种交互方式
shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。
服务端启动metastore服务:nohup hive --service metastore > /dev/null 2>&1 &
进入命令:hive
退出命令行:quit;
2)第二种交互方式
Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作,这是生产环境用法最多的
hadoop fs -chmod -R 777 /yjx
服务端启动hiveserver2服务:
nohup hive --service metastore > /dev/null 2>&1 &
nohup hiveserver2 > /dev/null 2>&1 &
需要稍等一下,启动服务需要时间:
进入命令:1)先执行beeline,在执行! connect jdbc:hive2://node01:10000
2)或者直接执行 beeline -u jdbc:hive2://node01:10000 -n root
退出命令行:!exit
3)第三种交互方式
- 使用 –e 参数来直接执行hql的语句
bin/hive -e "show databases;"
- 使用 –f 参数通过指定文本文件来执行hql的语句
vim hive.sql
use myhive;
select * from test;
保存退出
hive -f hive.sql
特点:执行完sql后,回到linux命令行。
4)在hive cli和beeline cli的区别
- metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive元数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。 HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。一般来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。 而MetaStore才是用来访问元数据的。
- beeline cli优化了命令行界面
Hive元数据
《上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费》
Hive元数据库中一些重要的表结构及用途,方便Impala、SparkSQL、Hive等组件访问元数据库的理解。
1、存储Hive版本的元数据表(VERSION)
该表比较简单,但很重要。
| VER_ID | SCHEMA_VERSION | VERSION_COMMENT |
|---|---|---|
| ID主键 | Hive版本 | 版本说明 |
| 1 | 1.1.0 | Set by MetaStore |
如果该表出现问题,根本进入不了Hive-Cli。比如该表不存在,当启动Hive-Cli时候,就会报错”Table ‘hive.version’ doesn’t exist”。
2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)
DBS:该表存储Hive中所有数据库的基本信息,字段如下:
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| DB_ID | 数据库ID | 1 |
| DESC | 数据库描述 | Default Hive database |
| DB_LOCATION_URI | 数据HDFS路径 | hdfs://193.168.1.75:9000/test-warehouse |
| NAME | 数据库名 | default |
| OWNER_NAME | 数据库所有者用户名 | public |
| OWNER_TYPE | 所有者角色 | ROLE |
| DATABASE_PARAMS:该表存储数据库的相关参数,在CREATE DATABASE时候用WITH DBPROPERTIES(property_name=property_value, …)指定的参数。 |
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| DB_ID | 数据库ID | 1 |
| PARAM_KEY | 参数名 | createdby |
| PARAM_VALUE | 参数值 | root |
DBS和DATABASE_PARAMS这两张表通过DB_ID字段关联。 3、Hive表和视图相关的元数据表
主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。
TBLS:该表中存储Hive表,视图,索引表的基本信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| TBL_ID | 表ID | 21 |
| CREATE_TIME | 创建时间 | 1447675704 |
| DB_ID | 数据库ID | 1 |
| LAST_ACCESS_TIME | 上次访问时间 | 1447675704 |
| OWNER | 所有者 | root |
| RETENTION | 保留字段 | 0 |
| SD_ID | 序列化配置信息 | 41,对应SDS表中的SD_ID |
| TBL_NAME | 表名 | ex_detail_ufdr_30streaming |
| TBL_TYPE | 表类型 | EXTERNAL_TABLE |
| VIEW_EXPANDED_TEXT | 视图的详细HQL语句 | |
| VIEW_ORIGINAL_TEXT | 视图的原始HQL语句 |
TABLE_PARAMS:该表存储表/视图的属性信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| TBL_ID | 表ID | 1 |
| PARAM_KEY | 属性名 | totalSize,numRows,EXTERNAL |
| PARAM_VALUE | 属性值 | 970107336、21231028、TRUE |
| TBL_PRIVS:该表存储表/视图的授权信息 |
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| TBL_GRANT_ID | 授权ID | 1 |
| CREATE_TIME | 授权时间 | 1436320455 |
| GRANT_OPTION | 0 | |
| GRANTOR | 授权执行用户 | root |
| GRANTOR_TYPE | 授权者类型 | USER |
| PRINCIPAL_NAME | 被授权用户 | username |
| PRINCIPAL_TYPE | 被授权用户类型 | USER |
| TBL_PRIV | 权限 | Select、Alter |
| TBL_ID | 表ID | 21,对应TBLS表的TBL_ID |
4、Hive文件存储信息相关的元数据表
主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。
SDS:
该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的SD_ID与该表关联,可以获取Hive表的存储信息。
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| SD_ID | 存储信息ID | 41 |
| CD_ID | 字段信息ID | 21,对应CDS表 |
| INPUT_FORMAT | 文件输入格式 | org.apache.hadoop.mapred.TextInputFormat |
| IS_COMPRESSED | 是否压缩 | 0 |
| IS_STOREDASSUBDIRECTORIES | 是否以子目录存储 | 0 |
| LOCATION | HDFS路径 | hdfs://193.168.1.75:9000/detail _ufdr_streaming_test |
| NUM_BUCKETS | 分桶数量 | 0 |
| OUTPUT_FORMAT | 文件输出格式 | org.apache.hadoop.hive.ql.io.H iveIgnoreKeyTextOutputFormat |
| SERDE_ID | 序列化类ID | 41,对应SERDES表 |
SD_PARAMS: 该表存储Hive存储的属性信息,在创建表时候使用STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定。
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| SD_ID | 存储配置ID | 41 |
| PARAM_KEY | 存储属性名 | |
| PARAM_VALUE | 存储属性值 |
SERDES:该表存储序列化使用的类信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| SERDE_ID | 序列化类配置ID | 41 |
| NAME | 序列化类别名 | NULL |
| SLIB | 序列化类 | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe |
SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符
| 表字段 | 说明 | 示例数据 | |
|---|---|---|---|
| SERDE_ID | 序列化类配置ID | 41 | |
| PARAM_KEY | 属性名 | field.delim | |
| PARAM_VALUE | 属性值 |
5、Hive表字段相关的元数据表 主要涉及COLUMNS_V2
COLUMNS_V2:该表存储表对应的字段信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| CD_ID | 字段信息ID | 21 |
| COMMENT | 字段注释 | NULL |
| COLUMN_NAME | 字段名 | air_port_duration |
| TYPE_NAME | 字段类型 | bigint |
| INTEGER_IDX | 字段顺序 | 119 |
6、Hive表分分区相关的元数据表
主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS
PARTITIONS:该表存储表分区的基本信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| PART_ID | 分区ID | 21 |
| CREATE_TIME | 分区创建时间 | 1450861405 |
| LAST_ACCESS_TIME | 最后一次访问时间 | 0 |
| PART_NAME | 分区名 | hour=15/last_msisdn=0 |
| SD_ID | 分区存储ID | 43 |
| TBL_ID | 表ID | 22 |
| LINK_TARGET_ID | NULL |
PARTITION_KEYS:该表存储分区的字段信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| TBL_ID | 表ID | 22 |
| PKEY_COMMENT | 分区字段说明 | NULL |
| PKEY_NAME | 分区字段名 | hour |
| PKEY_TYPE | 分区字段类型 | int |
| INTEGER_IDX | 分区字段顺序 | 0 |
PARTITION_KEY_VALS:该表存储分区字段值
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| PART_ID | 分区ID | 21 |
| PART_KEY_VAL | 分区字段值 | 0 |
| INTEGER_IDX | 分区字段值顺序 | 1 |
PARTITION_PARAMS:该表存储分区的属性信息
| 表字段 | 说明 | 示例数据 |
|---|---|---|
| PART_ID | 分区ID | 21 |
| PARAM_KEY | 分区属性名 | numFiles,numRows |
| PARAM_VALUE | 分区属性值 | 1,502195 |
6、其他不常用的元数据表
DB_PRIVS:数据库权限信息表。通过GRANT语句对数据库授权后,将会在这里存储。
IDXS:索引表,存储Hive索引相关的元数据
INDEX_PARAMS:索引相关的属性信息
TBL_COL_STATS:表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里
TBL_COL_PRIVS:表字段的授权信息
PART_PRIVS:分区的授权信息
PART_COL_PRIVS:分区字段的权限信息
PART_COL_STATS:分区字段的统计信息
FUNCS:用户注册的函数信息
FUNC_RU:用户注册函数的资源信息
《上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费》