Hive-架构、执行

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

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

一、hive架构组件

C/S模式。

Hive-架构、执行_第1张图片

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进行编译,将HSQL转为抽象语法树->查询块->逻辑查询plan->重写逻辑查询plan->生成物理查询plan(MR),并选择最佳策略。

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

5,将最终的物理plan提交给Driver

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)

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

你可能感兴趣的:(hive,架构,hadoop)