今天也要加油鸭!
前言
Hive是基于Hadoop的数据仓库构架,最大的特点是提供了类SQL的语法,封装了底层MapReduce过程。它可以将结构化的数据文件映射为数据库表,并提供SQL查询功能(类查询语言,HQL),并将SQL语句转换为MapReduce任务运行;可以进行数据提取转化加载(ETL),这是一种存储、查询和分析在Hadoop中的大规模数据的机制。
- 那么:Hive的本质就是大数据离线分析工具,用SQL+MapReduce即可实现啦~
Hive与关系数据库的区别:
- 数据存储不同:hive基于hadoop的HDFS,关系数据库则基于本地文件系统
- 计算模型不同:hive基于hadoop的mapreduce,关系数据库则基于索引的内存计算模型
- 应用场景不同:hive是OLAP数据仓库系统提供海量数据查询的,实时性很差;关系数据库是OLTP事务系统,为实时查询业务服务
- 扩展性不同:hive基于hadoop很容易通过分布式增加存储能力和计算能力,关系数据库水平扩展很难,要不断增加单机的性能
体系结构
主要分为以下几个部分:
- 用户接口,包括 命令行CLI,Client,Web界面WUI,JDBC/ODBC接口等
- 中间件:包括thrift接口和JDBC/ODBC的服务端,用于整合Hive和其他程序。
- 元数据metadata存储,通常是存储在关系数据库如 mysql, derby 中的系统参数
- 底层驱动:包括HiveQL解释器、编译器、优化器、执行器(引擎)。
- Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算。
- 用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。
- Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
- 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。
- Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from tbl 不会生成 MapRedcue 任务)。
适用场景
- 大数据集的离线批处理作业,比如网络日志分析
由于Hive构建在静态(也就是离线)批处理的Hadoop之上,Hadoop通常有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive并不能够在大规模数据集上实现低延迟快速查询,故不适用需要低延迟的应用,Hive并不提供实时查询和基于航迹的数据更新操作。
执行流程
1、通过客户端提交一条hql语句
2、通过complier(编译组件)对hql进行词法分析、语法分析。编译器需知道执行哪张表
3、去元数据库找表信息
4、得到信息
5、complier编译器提交hql语句分析方案
6、执行流程
a.executor 执行器收到方案后,执行方案(DDL过程)。注意,执行器在执行方案时,会进行判断:如果当前方案不涉及到MR组件,比如为表添加分区信息、比如字符串操作等,比如简单的查询操作等,此时就会直接和元数据库交互,然后去HDFS上去找具体数据;如果方案需要转换成MR job,则会将job 提交给Hadoop的JobTracker
b.MR job完成,并且将运行结果写入到HDFS上
c.执行器和HDFS交互,获取结果文件信息
7.如果客户端提交Hql语句是带有查询结果性的,则会发生:7-8-9步,完成结果的查询
数据存储
首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:Table,External Table,Partition,Bucket。
1)表table:一个表就是hdfs中的一个目录
2)区Partition:表内的一个区就是表的目录下的一个子目录
3)桶Bucket:如果有分区,那么桶就是区下的一个单位,如果表内没有区,那么桶直接就是表下的单位,桶一般是文件的形式。
基本概念
1、数据单元
按照数据的粒度大小,hive数据可以被组织成:
1)databases: 避免不同表产生命名冲突的一种命名空间
2)tables:具有相同scema的同质数据的集合
3)partitions:一个表可以有一个或多个决定数据如何存储的partition key
4)buckets(或clusters):在同一个partition中的数据可以根据某个列的hash值分为多个bucket。partition和bucket并非必要,但是它们能大大加快数据的查询速度。
2、数据类型
(1)简单类型
TINYINT - 1 byte integer
SMALLINT - 2 byte integer
INT - 4 byte integer
BIGINT - 8 byte
BOOLEAN - TRUE/ FALSE
FLOAT - 单精度
DOUBLE - 双精度
STRING - 字符串集合
(2)复杂类型
Structs: structs内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域a。
Maps(Key-Value对):访问指定域可以通过['element name']进行,例如,一个Map M包含了一个group->gid的k-v对,gid的值可以通过M['group']来获取。
Arrays:array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b'。
3、内建运算符和函数
包括关系运算符(A=B, A!=B, A<B等)
算术运算符(A+B, A*B, A&B, A|B等)
逻辑运算符(A&&B, A|B等)
复杂类型上的运算符(A[n], M[key], S.x)
各种内建函数:round,floor,substr
4、语言能力
hive查询语言提供基本的类sql操作,这些操作基于table和partition,包括:
1. 使用where语句过滤制定行
2. 使用select查找指定列
3. join两张table
4. group by
5. 一个表的查询结果存入另一张表
6. 将一个表的内容存入本地目录
7. 将查询结果存储到hdfs上
8. 管理table和partition(creat、drop、alert)
9. 在查询中嵌入map-reduce程序