问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Hive - 核心原理、特点、以及架构详解(附:与数据库对比)

创作时间:
作者:
@小白创作中心

Hive - 核心原理、特点、以及架构详解(附:与数据库对比)

引用
1
来源
1.
https://www.hangge.com/blog/cache/detail_3462.html

1. 什么是 Hive?

(1)Hive是由Facebook开源的一款数据分析工具,主要用来进行数据提取、转化和加载(ETL),于2010年正式成为Apache的顶级项目。

(2)Hive的出现主要是为了解决MapReduce程序开发复杂的问题,它提供了通过SQL分析HDFS中海量数据的能力,大大减少了开发人员的工作量,提高了数据分析效率。

(3)Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以执行包括Join在内的复杂查询。Hive是建立在Hadoop之上的,因此它可以将SQL语句转换为MapReduce任务执行,使得不熟悉MapReduce的用户可以很方便地利用Hive进行数据统计。

2. Hive 原理

(1)Hive中定义了简单的类SQL查询语言(QL)。它允许熟悉SQL的用户直接查询HDFS中的海量数据。同时,该语言也允许熟悉MapReduce的开发者自定义MapReduce任务来处理内置的SQL函数无法完成的复杂分析任务。

注意:

  • Hive的数据存储是基于HDFS的,它既没有自己的存储系统,也没有专门的数据存储格式。
  • Hive默认可以直接加载普通文本文件(extFile),也支持SequenceFile、RCFile等格式文件。针对文本文件中的数据,在使用Hive创建表时,只需要指定数据的列分隔符和行分隔符,Hive即可解析文件中的数据。

(2)Hive通过给用户提供的一系列交互接口,接收到用户的指令(QL),使用自己的Driver,结合元数据 (MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出 到用户交互接口。

也可以这样理解:Hive要做的就是将SQL翻译成MapReduce程序代码。实际上,Hive内置了很多Operator,每个Operator完成一个特定的计算过程,Hive将这些Operator构造成一个有向无环图DAG,然后根据这些Operator之间是否存在shuffle将其封装到map或者reduce函数中,之后就可以提 交给MapReduce执行了。

(3)Hive中最核心的一个组件就是SQL解析引擎,它会将SQL语句解析成MapReduce任务,具体的解析流程如下图所示:

    1. 进入程序,利用Antlr框架定义HQL的语法规则,对HQL完成词法语法解析,将HQL转换为为AST(抽象语法树);
    1. 遍历AST,抽象出查询的基本组成单元QueryBlock(查询块),可以理解为最小的查询执行单元;
    1. 遍历QueryBlock,将其转换为OperatorTree(操作树,也就是逻辑执行计划),可以理解为不可拆分的一个逻辑执行单元;
    1. 使用逻辑优化器对OperatorTree(操作树)进行逻辑优化。例如合并不必要的ReduceSinkOperator,减少Shuffle数据量;
    1. 遍历OperatorTree,转换为TaskTree。也就是翻译为MR任务的流程,将逻辑执行计划转换为物理执行计划;
    1. 使用物理优化器对TaskTree进行物理优化;
    1. 生成最终的执行计划,提交任务到Hadoop集群运行。

3. Hive 的特点

(1)Hive主要具备以下几个优点:

  • 易上手:提供了类SQL查询语言HQL,避免开发MapReduce任务,减少了学习成本。
  • 可扩展:底层基于Hadoop,扩展性比较好。
  • 延展性:支持自定义函数来解决内置函数无法实现的功能。

(2)Hive也存在一些缺点:

  • Hive SQL 表达能力有限:SQL无法表达迭代式算法,以及数据挖掘方面的需求。
  • 计算效率一般:Hive底层会默认生成MapReduce任务,计算效率一般,但是稳定性较高。

注意:Hive的底层计算引擎默认是MapReduce。从Hive3.x版本开始,官方建议使用Tez引擎或者Spark引擎,这样可以进一步提升Hive的计算性能。

4. Hive 与数据库对比

(1)在刚开始接触Hive时,可以把Hive当成数据库来使用,这样便于理解。但是Hive并不是一个数据库,它实际上是一个数据仓库。Hive侧重的是数据分析,而不是增删改查功能,它是不支持修改和删除操作的。

(2)为了加深对Hive的理解,下面针对Hive和MySQL中的一些特性进行对比:

比较项
Hive
MySQL
数据存储位置
HDFS
本地磁盘
数据格式
用户自定义
系统决定
数据更新
不支持
支持
索引
有,较弱,很少使用
有,经常使用
执行引擎
MapReduce
Executor
执行延迟
可扩属性
数据规模

5. Hive 架构

(1)Hive的整个体系架构都是构建在Hadoop之上的,Hive的元数据被存储在MySQL中,普通数据被存储在HDFS中,SQL语句在底层会被转化为MapReduce任务,最终在YARN上执行。

(2)具体说明如下:

  • 用户接口:包括CLI、JDBC/ODBC、WebUI
  • CLI,即Shell命令行,表示我们可以通过shell命令行操作Hive
  • JDBC/ODBC是Hive的Java操作方式,与使用传统数据库JDBC的方式类似
  • WebUI是通过浏览器访问Hive
  • 元数据存储(Metastore):一个存储系统,主要负责存储Hive中的元数据。元数据包括:表的名字、表的列、表的分区、表的属性(是否为外部表)、表的数据所在的HDFS目录等。目前Metastore只支持Derby和MySQL,而且Derby只能用于测试环境,在生产环境中需要使用MySQL。

Metastore默认使用内嵌的derby数据库,但是Derby数据库存在如下缺点:

  • 在同一个目录下一次只能打开一个会话

  • 使用derby存储方式时,Hive会在当前目录生成一个derby.log文件和一个metastore_db目录,metastore_db里面会存储具体的元数据信息

  • 如果下次切换到一个另一个新目录访问Hive,则会重新生成derby.log文件和metastore_db目录,这样就没有办法使用之前的元数据信息了。

  • 推荐使用MySQL作为外置存储引擎,可以支持多用户同时访问以及元数据共享。

  • Driver:包括编译器、优化器和执行器。可以完成HiveSQL的词法分析、语法分析、编译、优化,以及查询计划的生成,属于Hive中的核心组件。

  • Hadoop:Hive会使用HDFS进行存储,利用MapReduce进行计算。

注意:大部分的查询由MapReduce完成,但存在特例select*fromtable不会生成MapRedcue任务,如果在SQL语句后面再增加where过滤条件就会生成MapReduce任务了。

附:对比 Hive、Impala 和 Kylin

Hive、Impala和Kylin都适合应用于离线OLAP数据分析领域,不过它们各有特色,在技术选型时需要结合具体业务需求进行考虑。这3个离线OLAP引擎的对比如下。

说明:

  • 计算引擎:Hive的计算引擎默认是MapReduce,也支持Tez或者Spark。Impala的计算引擎是通过C++自研的MPP引擎。Kylin的计算引擎可以使用MapReduce或者Spark。
  • 计算性能:Hive底层会使用MapReduce,所以计算性能相对一般,不过可以考虑使用Tez或者Spark引擎来提高性能。Impala是基于内存计算的,计算性能比较好。Kylin底层可以使用MapReduce或者Spark引擎,使用Spark引擎时计算性能也比较好。
  • 稳定性:Impala是全部基于内存的,所以稳定性较差。Hive和Kylin底层都可以使用MapReduce,所以稳定性相对较高。
  • 数据规模:Hive比较适合TB级别的数据分析,数据规模太大会导致计算时间过长。Impala也比较适合TB级别的数据分析,如果数据规模太大则内存会出现瓶颈。Kylin比较适合TB和PB级别的数据分析,因为它会提前对数据进行预计算,在海量数据下也可以提供较好的性能。
  • SQL支持程度:在Hive中定义了简单的类SQL查询语言(QL)。Impala可以兼用HQL。Kylin支持标准SQL。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号