Hive全面介绍(有点详细)
Hive有关介绍
Hive是什么
(1)由Facebook开源,最初用于解决海量结构化的日志数据统计问题;
(2)构建在Hadoop之上的数据仓库;
(3)Hive定义了一种类SQL查询语言:HQL(类似SQL但不完全相同);
(4)通常用于进行离线数据处理(采用MapReduce);
(5)底层支持多种不同的执行引擎(Hive on MapReduce、Hive on Tez、Hive on Spark);
(6)支持多种不同的压缩格式、存储格式以及自定义函数(压缩:GZIP、LZO、Snappy、BZIP2… ;
(7)存储:TextFile、SequenceFile、RCFile、ORC、Parquet ; UDF:自定义函数)。
使用Hive的好处
(1)简单、容易上手(提供了类似SQL查询语言HQL);
(2)为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储);
(3)统一的元数据管理(可与Presto/Impala/SparkSQL等共享数据)。
Hive的特点
(1)它存储架构在一个数据库中并处理数据到HDFS。
(2)它是专为OLAP设计。
(3)它提供SQL类型语言查询叫HiveQL或HQL。
(4)它是熟知、快速、可扩展的。
Hive架构
下面的组件图描绘了Hive的结构:
该组件图包含不同的单元。下表描述每个单元:
单元名称 | 操作 |
---|---|
用户接口/界面 | Hive是一个数据仓库基础工具软件,可以创建用户和HDFS之间互动。用户界面,Hive支持是Hive的Web UI,Hive命令行,HiveHD洞察(在Windows服务器)。 |
元存储 | Hive选择各自的数据库服务器,用以储存表,数据库,列模式或元数据表,它们的数据类型和HDFS映射。 |
HiveQL处理引擎 | HiveQL类似于SQL的查询上Metastore模式信息。这是传统的方式进行MapReduce程序的替代品之一。相反,使用Java编写的MapReduce程序,可以编写为MapReduce工作,并处理它的查询。 |
执行引擎 | HiveQL处理引擎和MapReduce的结合部分是由Hive执行引擎。执行引擎处理查询并产生结果和MapReduce的结果一样。它采用MapReduce方法。 |
HDFS 或 HBASE | Hadoop的分布式文件系统或者HBASE数据存储技术是用于将数据存储到文件系统。 |
Hive工作原理
下图描述了Hive 和Hadoop之间的工作流程。下表定义Hive和Hadoop框架的交互方式:
Step No. | 操作 |
---|---|
1 | Execute QueryHive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。 |
2 | Get Plan在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。 |
3 | Get Metadata编译器发送元数据请求到Metastore(任何数据库)。 |
4 | Send MetadataMetastore发送元数据,以编译器的响应。 |
5 | Send Plan编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。 |
6 | Execute Plan驱动程序发送的执行计划到执行引擎。 |
7 | Execute Job在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。 |
7(1) | Metadata Ops与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。 |
8 | Fetch Result执行引擎接收来自数据节点的结果。 |
9 | Send Results执行引擎发送这些结果值给驱动程序。 |
10 | Send Results驱动程序将结果发送给Hive接口。 |
Hive的适用场景
Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询。例如:Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用。例如:联机事务处理(OLTP)。
Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业。例如:网络日志分析。
Hive中表的分类
分类包括:内部表、外部表、分区表、桶表
分类 | 内容 |
---|---|
内部表 | 删表时数据和表一起删除。 |
外部表 | (1)数据已经存在于HDFS。(2)外部表只是走一个过程,加载数据和创建表同时完成,不会移动到数据仓库目录中,仅仅是和数据建立了一个连接。(3)删表数据不会删除数据。 |
分区表 | (1)在Hive Select查询中,一般会扫描整个表内容,会消耗很多时间做没必要的工作。 分区表指的是在创建表时,指定partition的分区空间。扫描时可以只扫描某一个分区的数据。(2)分区表存储时分局所设立的分区分别存储数据(分区字段就是一个文件夹的标识)。 |
桶表 | (1)对于每一个表(table)或者分区,Hive可以进一步组织成桶,也就是说捅是更为细粒度的数据范困划分。(2)桶表是对指定的分桶的列进行哈希运算,运算结果模(%)分桶的数量然后把数据根据运算结果分别放入这几个桶中。 |
内部表外部表的区分:
在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!
而内部表则不一样,在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
Hive与HBase的联系和区别
在大数据架构中,Hive和HBase是协作关系。
Hive与HBase的联系
在大数据架构中,Hive和HBase是协作关系,数据流一般如下图:
(1)通过ETL工具将数据源抽取到HDFS存储;
(2)通过Hive清洗、处理和计算原始数据;
(3)Hive清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase
(4)数据应用从HBase查询数据。
Hive与HBase的区别
(1)Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。Hive本身不存储数据,它完全依赖HDFS和MapReduce。这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询功能,并将SQL语句最终转换为MapReduce任务进行运行。 而HBase表是物理表,适合存放非结构化的数据。
(2)Hive是基于MapReduce来处理数据,而MapReduce处理数据是基于行的模式;HBase处理数据是基于列的而不是基于行的模式,适合海量数据的随机访问。
(3)HBase的表是疏松的存储的,因此用户可以给行定义各种不同的列;而Hive表是稠密型,即定义多少列,每一行有存储固定列数的数据。
(4) Hive使用Hadoop来分析处理数据,而Hadoop系统是批处理系统,因此不能保证处理的低迟延问题;而HBase是近实时系统,支持实时查询。
(5) Hive不提供row-level的更新,它适用于大量append-only数据集(如日志)的批任务处理。而基于HBase的查询,支持和row-level的更新。
(6)Hive提供完整的SQL实现,通常被用来做一些基于历史数据的挖掘、分析。而HBase不适用与有join,多级索引,表关系复杂的应用场景。
ps:望多多支持,后续更新中。。。