Hive-架构、执行

Hive是基于hadoop的数据仓库工具,将结构化的数据映射为一张表,提供类sql的查询功能。

本质-- SQL解析,将HQL转为MapReduce执行过程。底层的执行引擎有:MapReduce、Tez、Spark

一、hive架构组件

C/S模式。

Client:

Client端有JDBC/ODBC和Thrift Client,可远程访问Hive。

可以通过shell脚本的方式访问,或者通过Thrift协议,按照平时编写JDBC的方式完成对Hive的数据操作。

Server:CLI、Thrift Server、HWI(Hive web Interface)、Driver、Metastore

  • CLI、Thrift Server、HWI是暴露给Client访问的独立部署的Hive服务
  • Driver、Metastore是Hive内部组件

Driver:

解析输入的sql,抽象成语法树,再转成逻辑计划,然后进行优化,生成物理执行计划(序列化反序列化,UDF函数),交给Execution执行引擎-->MR Job/Spark Job。

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

优化器:基于规则的优化:

列过滤:去除查询中不需要的列

行过滤:Where条件判断等在TableScan阶段就进行过滤,利用Partition信息,只读取符合条件的Partition

谓词下推:减少后面的数据量(比如两个表join时,通过优先执行where过滤掉不符合的条件。。后面详细学习)

join方式

  • Map端join: 调整Join顺序,确保以大表作为驱动表,小表载入所有mapper内存中
  • shuffle join:按照hash函数,将两张表的数据发送给join对于数据分布不均衡的表Group by时,为避免数据集中到少数的reducer上,分成两个map-reduce阶段。第一个阶段先用Distinct列进行shuffle,然后在reduce端部分聚合,减小数据规模,第二个map-reduce阶段再按group-by列聚合。
  •  sort merge join:排序,按照顺序切割数据,相同的范围发送给相同的节点(运行前在后台创建立两张排序表,或者建表的时候指定)
  • 在map端用hash进行部分聚合,减小reduce端数据处理规模。

Metastore:

存储和管理元数据:Derby(内置 )、Mysql;

  • Derby:Derby只接受一个Hive的会话访问;
  • Mysql:Hive跑在Hadoop之上的,Mysql进行主备(定时同步操作)

二、Hive的执行过程

1,用户提交查询任务给Driver

2,Driver为查询操作创建session handler,发送查询操作到compiler生成execute plan

3,compiler从metastore获取本次查询需要的元数据,用于后续对抽象查询树中的表达式进行类型检查,以及基于查询谓词修剪分区;

4,compiler基于元数据信息对task进行编译

5,编译器将HSQL转为抽象语法树->查询块->逻辑查询plan->重写逻辑查询plan->生成物理查询plan(MR),并选择最佳策略。

  •  生成的计划是分阶段的DAG,每个阶段是 map/reduce 作业 或者是 一个元数据或者HDFS上的操作。
  • 如果是map/reduce 作业,该计划包括 map operator trees 和一个 reduce operator tree

6,Driver将plan发送给ExecutionEngine执行,元数据信息提交到JobTracker或者yarn的RsourceManager执行,task直接读取到HDFS中进行相应的操作。

  •  步骤6、6.1、6.2、6.3:执行引擎将这些阶段提交给适当的组件。在每个task(mapper/reducer) 中从HDFS文件中读取与表或中间输出相关联的数据,并通过相关算子树传递这些数据。最终这些数据通过序列化器写入到一个临时HDFS文件中(如果不需要 reduce 阶段,则在 map 中操作)。临时文件用于向计划中后面的 map/reduce 阶段提供数据。
  • 步骤7、8、9:最终的临时文件将移动到表的位置,确保不读取脏数据(文件重命名在HDFS中是原子操作)。对于用户的查询,临时文件的内容由执行引擎直接从HDFS读取,然后通过Driver发送到UI。

7,获取执行结果。

8,取得并返回执行结果。

⚠️无论底层的计算引擎是什么,一条SQL在Hive中的逻辑计划都是一样的,不同的计算引擎生成的物理计划就会有所差别。

c7522838ab1d4c6fb57bb1a76d32dd4f.png (949×1675)

三、SQL转化为MR的具体流程

  • 在编译器中,用Antlr语言识别工具对HQL的输入进行词法和语法解析,将HQL语句转换成抽象语法树(AST Tree)的形式;
  • 遍历抽象语法树,转化成QueryBlock查询块。因为AST结构复杂,不方便直接翻译成MR算法程序。其中QueryBlock是一条最基本的SQL语法组成单元,包括输入源、计算过程、和输入三个部分;
  • 遍历QueryBlock,生成OperatorTree(操作树),OperatorTree由很多逻辑操作符组成,如TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator和ReduceSinkOperator等。这些逻辑操作符可在Map、Reduce阶段完成某一特定操作;
  • Hive驱动模块中的逻辑优化器对OperatorTree进行优化,变换OperatorTree的形式,合并多余的操作符,减少MR任务数、以及Shuffle阶段的数据量;
  • 遍历优化后的OperatorTree,根据OperatorTree中的逻辑操作符生成需要执行的MR任务;
  • 启动Hive驱动模块中的物理优化器,对生成的MR任务进行优化,生成最终的MR任务执行计划;
  • 最后,由Hive驱动模块中的执行器,对最终的MR任务执行输出。 

四、Hive HA基本原理

High Availablity——解决端口不响应或者进程丢失问题。


 

原文参考:大数据计算框架及引擎介绍_计算引擎_归去来?的博客-CSDN博客

Hive概述及其基本原理_hive原理_zkyCoder的博客-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值