Hive简介

1 Hive是什么

(1)由facebook开源,最初用于解决海量结构化的日志数据统计问题;ETL工具。
      注:ETL(Extraction-Transformation-Loading)工具:用来描述将数据从来源端经过萃取(extract,数据抽取,也就是把数据从数据源读出来)、转置(transform,数据转换,把原始数据转换成期望的格式和维度。如果用在数据仓库的场景下,Transform也包含数据清洗,清洗掉噪音数据)、加载(load,数据加载,把处理后的数据加载到目标处,比如数据仓库)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库
(2)构建在Hadoop之上的数据仓库;数据计算使用MapReduce,数据存储使用HDFS。
      :数据仓库的特点:①主题性:不同于传统数据库对应于某一个或多个项目,数据仓库根据使用者实际需求,将不同数据源的数据在一个较高的抽象层次上做整合,所有数据都围绕某一主题来组织。②集成性:数据仓库中存储的数据是来源于多个数据源的集成,原始数据来自不同的数据源,存储方式各不相同。要整合成为最终的数据集合,需要从数据源经过一系列抽取、清洗、转换的过程。③稳定性:数据仓库中保存的数据是一系列历史快照,不允许被修改。用户只能通过分析工具进行查询和分析。④时变性:数据仓库会定期接收新的集成数据,反应出最新的数据变化。这和特点并不矛盾。
(3)Hive 定义了一种类SQL 查询语言——HQL;类似SQL,但不完全相同。
(4)通常用于进行离线数据处理(采用MapReduce的方式)。
(5)可认为是一个HQL是MapReduce的语言翻译器。
      综上所述:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。 相对于MapReduce离线计算需要写很多java代码去实现数据提取,Hive可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用开发程序,更适合数据仓库的统计分析。

2 Hive典型应用场景

(1)日志分析(大部分互联网公司使用Hive进行日志分析,包括百度、淘宝等)
      ① 统计网站一个时间段内的PV(Page View,访问量,具体是指网站的页面浏览量或者点击量,页面被刷新一次就计算一次)和UV(Unique Visitor,独立访客,访问网站的一台电脑客户端为一个访客,00:00-24:00内相同的客户端只被计算一次),一个UV可以用很多PV,一个PV也只能对应一个IP;
      ② 多维度数据分析(多个角度来对数据进行分析)。
(2)其他场景
      ① 海量结构化数据离线分析;
      ② 低成本进行数据分析(不直接编写MapReduce程序。MapReduce程序过于复杂,降低数据分析效率。Hive的SQL语句相对MapReduce程序来说比较简单,让用户将大部分精力用在数据分析上,而不是怎么去写一个MapReduce程序)。

3 Hive的优缺点

3.1 优点

(1)简单容易上手:提供了类SQL查询语言HQL;
(2)可扩展:为超大数据集设计了计算/扩展能力(MapReduce作为计算引擎,HDFS作为存储系统),一般扩展集群,不需要重启Hive服务;
(3)提供统一的元数据管理(HCalalog,可与Pig、Presto等共享);
(4)延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数;
(5)容错:良好的容错性,节点出现问题,SQL仍可完成执行()。

3.2 缺点

(1)Hive的HQL表达的能力有限
      ① 迭代式算法无法表达;
      ② 有些复杂运算用HQL不易表达。
(2)Hive效率较低
      ① Hive自动生成MapReduce作业,通常不够智能;
      ② HQL调优困难,粒度较粗;
      ③ 可控性差。

4 Hive的基本架构

在这里插入图片描述
      从图中可以看出,用户接口主要有三个:CLI、Client和HWI。

4.1 Execution engines(执行引擎)

      默认引擎是MapReduce,目前Hive支持的执行引擎还包括Apache Tez和Spark。在使用MapReduce时,中间作业的输出被物化存储到HDFS上,Tez和Spark则根据Hive规划器的请求,把中间结果写到本地磁盘上,甚至在内存中缓存,以避免额外的复制开销。执行引擎由属性hive.execution.engin来控制,默认值为mr,可以设置为Tez:SET hive.execution.engin=tez。

4.2 Hive Services(Hive服务)

(1)CLI:命令行接口,默认服务。
(2)hiveserver2:让Hive以提供Thrift服务的服务器形式执行,允许用不同语言编写的客户端进行访问,并支持认证和多用户并发。通过设置hive.server2.thrift.port配置属性来指明服务器所监听的端口号(默认为10000) 。
(3)beeline:以嵌入方式工作的Hive命令接口,或者使用JDBC连接到一个hiveserver2进程。
(4)HWI:Hive的Web接口。Hue是一个功能更全面的Hadoop Web接口,其中包括运行Hive查询和浏览Hive Metastore的应用程序。
(5)Metastore:默认情况下,Metastore和Hive服务运行在同一个进程里。使用这个服务可以让Metastore作为一个单独的(远程)进程运行。

4.3 Hive clients(Hive客户端)

      如果以服务器方式运行Hive (hive - - service hiveserver2) ,可以在应用程序中以不同机制连接到服务器。
(1)Thrift 客户端
      Hive 服务器提供Thrift 服务的运行,因此任何支持Thrift的编程语言都可与之交互。有些第三方项目还提供Python和Ruby客户端。
(2)JDBC 驱动
      Java应用程序可以在指定的主机和端口连接到在另一个进程中运行的Hive服务器。Beeline CLI使用JDBC驱动和Hive通信。
(3)ODBC 驱动
      Hive 的ODBC 驱动允许支持ODBC 协议的应用程序(比如商业情报软件)连接到Hive。

4.4 Metastore(元数据存储)

      Metastore 是Hive元数据的集中存放地。Metastore 包括两部分:服务(Metastore服务)和后台数据的存储(表的名字,表的列和分区以及它们的属性,表的属性(是否为外部表)和表的数据所在目录等数据存储到数据库中,如MySQL和Derby)。
(1)内嵌模式:Metastore服务和Hive服务运行在同一个JVM中,它包含一个内嵌的以本地磁盘作为存储的Derby数据库实例。缺点:一次只能打开一个会话。
在这里插入图片描述
(2)本地模式: Metastore服务和Hive服务运行在同一个进程中,但连接却是在另外一个进程中运行的数据库。优点:允许多用户访问。
在这里插入图片描述
(3)远程模式:一个或多个Metastore服务器(支持Thrift,也就表明非java客户端也可访问)和Hive服务运行在不同的进程中。优点:允许多用户访问;数据库可以置于防火墙后,客户端则不需要数据库凭据(用户名和密码),从而提供了更好的可管理性和安全性。
在这里插入图片描述
在这里插入图片描述

4.5 Parser(解析器)、Compiler(编译器)、Optimizer(优化器)和Executor(执行器)

      解析器、编译器、优化器和执行器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
(1)解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工 具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否 存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by中是 否有出现);
(2)编译器:将AST编译生成逻辑执行计划;
(3)优化器:对逻辑执行计划进行优化;
(4)执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Tez/Spark。

4.6 Hive查询流程

在这里插入图片描述

4.6.1 图中主要的组件包含:

(1)UI(user interface):用户提交查询或者其他操作;
(2)Driver(驱动):负责接收查询及其他操作,Driver 实现了会话句柄的概念,并提供在基于JDBC / ODBC的execute和fetch API;
(3)Compiler(编译器):解析查询的SQL,对不同的块和不同的查询表达式进行语义分析,借助Metastore中的表和分区的元数据定义生成执行计划;
(4)Metastore:存储所有表及分区的结构信息,包含列名,列的数据类型,读取和写入的序列化器和反序列化器以及相关的HDFS文件存储目录;
(5)Execution Engine(执行引擎):执行Compiler所产生的执行计划。该执行计划是一个阶段的DAG,执行引擎关联执行计划中不同阶段的之间依赖,并负责在不同的系统组件中执行不同的阶段。

4.6.2 流程步骤

(1)Step 1:UI(user interface)调用的Driver的execute接口;
(2)Step 2:Driver为查询创建会话句柄,并将查询发送给Compiler以生成执行计划;
(3)Step 3和4:Compiler从Metastore获取相关的元数据定义;
(4)Step 5:元数据用于对查询树中的表达式进行类型检查,以及基于查询谓词调整分区,生成计划;
(5)Step 6、6.1、 6.2和6.3:由Compiler生成的执行计划是阶段的DAG,每个阶段都会涉及到Map/Reduce job、元数据的操作或者HDFS文件的操作。在Map/Reduce阶段,执行计划包含Map 操作树(操作树在Mappers上执行)和reduce操作树(Reduce 操作树在 Reducers上执行),Execution Engine 将各个阶段提交给适当的组件执行;
(6)Step 7、8 和9:在每个任务(Mapper / Reducer)中,表或者中间输出相关的反序列化器用于从HDFS读取行,并通过相关的操作树进行传递。一旦这些输出产生,将通过序列化器生成临时的HDFS文件(这种情况不需要Reduce,只发生在Map阶段)。生成的HDFS临时文件为该计划的后续Map/Reduce阶段提供数据。对于DML(Data Manipulation Language,数据操作语言)操作,最终的临时文件被移动到表的位置。该方案确保不出现脏数据读取(文件重命名是HDFS中的原子操作)。对于查询,执行引擎直接从HDFS读取临时文件的内容,作为从驱动程序获取调用的一部分(Step 7、8和9)

5 Hive与传统数据库相比

(1)读时模式 vs写时模式
      传统数据库:表的模式是在数据加载时轻质确定的。如果在加载时发现数据不符合模式,则拒绝加载数据。因为数据是在写入数据库时对照模式进行检查,所以这种情况叫作“写时模式”。优点:有利于提升查询性能。缺点:加载数据会花更多的时间。
      Hive: Hive对数据的验证并不在加载数据时进行的,而在查询时进行的,这种情况称为“读时模式”。优点:数据加载仅仅是文件复制或移动,所以加载数据非常迅速。
(2)数据存储位置
      传统数据库:数据存储在块设备、本地文件系统。
      Hive:数据存储在HDFS上。
(3)数据更新
      传统数据库:支持Update、Insert和Delete操作;
      Hive:支持Update、Insert和Delete操作。支持INSERT (OVERWRITE) INTO TABLE … VALUES插入少量数据。HDFS不提供就地文件更新,因此,插入、更新和删除操作引起的一切变化都被保存在一个较小的增量文件中。由Metastore 在后台运行的MapReduce 作业会定期将这些增量文件合并到"基表" (base table)文件中。
(4)执行延迟
      传统数据库:亚秒级。
      Hive:分钟级。
(5)索引
      1)传统数据库(索引都是不可插拔的,不支持用户自定义):唯一索引,确保数据唯一性;非唯一索引,这些字段可以重复,不要求唯一;主键索引是唯一索引的特定类型,创建主键时自动创建;聚簇索引,表中记录的物理顺序与键值顺序相同,表数据和主键一起存储;非聚簇索引,表数据和索引分两部分存储。目前大部分数据库系统及文件系统采用的是B-Tree或B+Tree。而B+Tree是数据库系统实现索引的首选数据结构(不同引擎对索引的实现不同)。
      聚簇索引优点是查询速度快,主键和索引在一个结构里;缺点是对表进行修改速度慢, 插入新纪录要重排,维持B+树特性需要频繁分裂调整,十分低效;适用场景分为取出一定范围的数据时和无需插入新值时。
      非聚簇索引优点是添加纪录不会引起数顺序重排;适用场合频繁更新的列。
      2)Hive:索引分为两类:紧凑索引和位图索引。索引的实现是可插拔的,所以为了目的而设计的索引会陆续出现(用户可以根据需求定制自己的索引)。
      紧凑索引:存储索引列的值和其blockid。存储每个值的HDFS块号,而不是存储文件内偏移量。因此存储不会用过多的磁盘空间,且对于值被聚簇存储于相近行的情况,索引仍然有效。
      位图索引:位图索引将索引列值和行列表存储为bitmap。使用压缩的位集合来高效存储具有某个特殊值的行。这种索引一般适用于具有较小取值可能的列。
(6)执行
      传统数据库:通过Executor执行操作。
      Hive:通过MapReduce执行操作。
(7)可扩展性
      传统数据库:可扩展性低,一般只能扩展20个服务器。
      Hive:可扩展性高,可以扩展到上百个服务器。
(8)数据规模
      传统数据库:适应于小数据规模。
      Hive:适用于大数据规模。
(9)多表插入
      传统数据库:不支持多表插入。
      Hive:支持多表插入。
(10)子查询
      传统数据库:在任何子句中支持相关的(correlated)或不相关的(noncorrelated)。
      Hive:只能在FROM 、WHERE 或HAVING 子句中(不支持非相关子查询)。
      不相关子查询是指子查询独立于外层语句(主查询),他不依赖于其外层语句的操作结果,他们执行时可分为两个独立的步骤,即先执行子查询,在执行外层查询。
      相关子查询是一种子查询和外层相互交叉的数据检索方法。从概念上讲包含相关子查询的语句在执行时能分为一先一后两个步骤。
(11)事务
      传统数据库:支持事务。
      Hive:有限支持。由Hive0.13.0引入事务,当涉及到增量文件合并到基表的时候,使用的表必须启用事务,以保证这些表进行读操作的查询可以看到表的一致性快照。Hive的0.7.0版本引入了表级和分区级的锁,可以防止一个进程删除正在被另一个进程读取的表。
(12)CREATE TABLE AS SELECT
      传统数据库:SQL-92 中不支持,但有些数据库支持。
      Hive:支持。
(13)SELECT
      传统数据库:SQL-92。
      Hive:支持偏序的SORT BY。可限制返回行数量的LIMIT。
(14)连接
      传统数据库:SQL-92 支持或变相支持FROM 子句中列出连接表,在WHERE 子句中列出连接条件)。
      Hive:内连接、外连接、半连接、映射连接、交叉连接。
(15)视图
      传统数据库:可更新(是物化的或非物化的)。
      Hive:只读(不支持物化视图)。
      普通视图是不存储任何数据的,它只有定义,在查询中是转换为对应的定义SQL去查询。
      物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。
(16)扩展点
      传统数据库:用户定义函数(存储过程)。
      Hive:用户定义函数(MapReduce脚本)。
(17)数据类型
      传统数据库:整数、浮点数、。定点数、文本、二进制和时间。
      Hive:布尔型、整数、浮点数、文本、二进制串、时间戳、数组、映射和结构。

6 为什么说Hive 是Hadoop 的数据仓库,从【数据存储和分析】 方面理解。

      (1)Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。可以将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
      (2)Hive 没有专门的数据存储格式,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:表(Table),外部表(External Table),分区(Partition),桶(Bucket)
      (3)Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。
      Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中 Partition 的组织方式和数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。例如:pvs 表中包含 ds 和 city 两个 Partition,则对应于 ds = 20090801, ctry = US 的 HDFS 子目录为:/wh/pvs/ds=20090801/ctry=US;对应于 ds = 20090801, ctry = CA 的 HDFS 子目录为;/wh/pvs/ds=20090801/ctry=CA。

参考文章:
[1]《Hadoop权威指南》
[2] https://www.cnblogs.com/zimo-jing/p/9028949.html
[3] https://blog.csdn.net/qq_36864672/article/details/78648248
[4] https://blog.51cto.com/flyfish225/2096881
[5] https://www.jianshu.com/p/c977c7906b86
[6] http://www.pianshen.com/article/2692132805/
[7] https://cwiki.apache.org/confluence/display/Hive/Design#Design-HiveArchitecture

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值