一. Hive入门简介
1. Hive是什么
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能.
- 构建在Hadoop 之上的数据仓库;
- 使用HQL作为查询接口;
- 使用HDFS存储;
- 使用MapReduce计算;
- 本质是:将HQL转化成MapReduce程序.
基于其本质,也可以将Hive看成是一个SQL的解析引擎,但这样说并不全面,毕竟有时SQL也会不被解析的; - 底层: HDFS负责存储数据;YARN负责进行资源管理;MapReduce负责处理数据;
2. Hive产生的目的
用于解决海量结构化日志的数据统计;
结构化日志: 有统一的规范
- (1) 每一行数据就是一条数据;
- (2) 很多列之间有统一的标识符进行分割;
3. 特点
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手);
- 避免了去写MapReduce,减少开发人员的学习成本;
- 统一的元数据管理,可与impala/spark等共享元数据;
- 灵活性和扩展性比较好:支持UDF,自定义存储格式等;数据存储在hdfs上,存储容量可以平滑扩展;
- 适合离线数据处理;hive本质是跑MapReduce程序,更适合离线数据处理;比如:日志分析,海量结构化数据离线分析…
- Hive的执行延迟比较高,因此hive常用于数据分析的,对实时性要求不高的场合;
- Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
HQL与SQL的区别:
- HSQL:读时模式,也就是读数据做检查操作,比如检查表是否存在,字段是否存在,sql语法是否正确等;但在加载数据时,不对数据进行检查,仅仅是文件的复制或移动,所以加载数据会比较快.HSQL写快读慢.
- SQL:写时模式,就是在加载数据时,会建立索引,字段检查等操作,这些操作都是为了提升查询的性能.所以SQL查询时比较快,而写入时比较慢.SQL读快,写慢.
UDF,UDAF与UDTF的区别:
- UDF:用户自定义普通函数,一对一,用于select语句,对查询字段的结构化处理;比如format操作等;
- UDAF:用户自定义聚合函数,多对一,group by
- UDTF:用户自定义表生成函数,一对多.比如:split,分词
4. 基本概念
4.1 表的概念(类似关系型数据库)
create table bf_log( ip string, user string, date string, ...... )
4.2 HQL(类似SQL)
#HiveQL select * from bf_log limit 10 ; select substring(ip,0,4) ip_prex from bg_log ;
HQL的本质是通过Hive Engine转换为MapReduce任务.
二. Hive知识入门
Hive架构
2.1 架构组成
(1) 用户接口: Client
CLI(hive shell)、JDBC/ODBC(java访问hive),WEBUI(浏览器访问hive)
(2) 元数据: Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/
分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的derby数据库中,推荐使用采用MySQL存储Metastore;
(3) Driver
包含:解析器、编译器、优化器、执行器;
- 解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工
具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否
存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by中是
否有出现); - 编译器:将抽象语法树AST编译生成逻辑执行计划;
- 优化器:对逻辑执行计划进行优化;
- 执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/TEZ/Spark.
(4) HDFS
使用HDFS存储数据.Hive本身不存在数据,Hive虽有表的定义但表是纯的逻辑表,数据是存在HDFS上的.
HIVE中的内容不支持改写和删除,适合读多写少的场景.