当前位置:   article > 正文

Hive运行原理_hive limit 10的原理、执行过程

hive limit 10的原理、执行过程

在执行Hive语句中,难免会好奇Hive的执行原理,通过explain可以查看Hive转换后的抽象语法树和操作符树

hive> explain extended select sum(shopid) from shopt1 limit 10;

生成的语法解析树AST Tree如下所示:

  1. ABSTRACT SYNTAX TREE:
  2. TOK_QUERY
  3. TOK_FROM
  4. TOK_TABREF
  5. TOK_TABNAME
  6. shopt1 ---表名
  7. TOK_INSERT
  8. TOK_DESTINATION
  9. TOK_DIR
  10. TOK_TMP_FILE ---所有的查询的数据会输出到HDFS的一个暂存文件中
  11. TOK_SELECT
  12. TOK_SELEXPR
  13. TOK_FUNCTION
  14. sum ---获取使用到的函数
  15. TOK_TABLE_OR_COL
  16. shopid ----获取select的列
  17. TOK_LIMIT
  18. 10

执行计划如下所示:

  1. STAGE DEPENDENCIES:
  2. Stage-1 is a root stage
  3. Stage-0 depends on stages: Stage-1 ----stage-0依赖stage-1
  4. STAGE PLANS:
  5. Stage: Stage-1
  6. Tez
  7. Edges:
  8. Reducer 2 <- Map 1 (SIMPLE_EDGE)
  9. DagName: work_20160918215757_92e7e39d-b52e-49dc-b0dd-d8807b87c7d2:1
  10. Vertices:
  11. Map 1
  12. Map Operator Tree:
  13. TableScan ----扫描shopt1表
  14. alias: shopt1
  15. Statistics: Num rows: 5 Data size: 42 Basic stats: COMPLETE Column stats: NONE
  16. Select Operator -----筛选select到的列
  17. expressions: shopid (type: bigint)
  18. outputColumnNames: shopid
  19. Statistics: Num rows: 5 Data size: 42 Basic stats: COMPLETE Column stats: NONE
  20. Group By Operator ---分组
  21. aggregations: sum(shopid)
  22. mode: hash ---hash分组
  23. outputColumnNames: _col0
  24. Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
  25. Reduce Output Operator ---Map端的Reduce过程
  26. sort order:
  27. Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
  28. value expressions: _col0 (type: bigint)
  29. Reducer 2
  30. Reduce Operator Tree:
  31. Group By Operator ----reduce端的分组合并
  32. aggregations: sum(VALUE._col0)
  33. mode: mergepartial
  34. outputColumnNames: _col0
  35. Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
  36. Select Operator
  37. expressions: _col0 (type: bigint)
  38. outputColumnNames: _col0
  39. Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
  40. Limit
  41. Number of rows: 10
  42. Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
  43. File Output Operator ---最终文件的输出
  44. compressed: false
  45. Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
  46. table:
  47. input format: org.apache.hadoop.mapred.TextInputFormat ---输入
  48. output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat ---输出
  49. serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe --序列化
  50. Stage: Stage-0
  51. Fetch Operator
  52. limit: 10 ---limit 10
  53. Processor Tree:
  54. ListSink


------------------------------------------------------------------------------------------------

以下是参考美团技术博客Hive的编译过程,摘取核心执行部分share

Sql:

  1. FROM
  2. (
  3. SELECT
  4. p.datekey datekey,
  5. p.userid userid,
  6. c.clienttype
  7. FROM
  8. detail.usersequence_client c
  9. JOIN fact.orderpayment p ON p.orderid = c.orderid
  10. JOIN default.user du ON du.userid = p.userid
  11. WHERE p.datekey = 20131118
  12. ) base
  13. INSERT OVERWRITE TABLE `test`.`customer_kpi`
  14. SELECT
  15. base.datekey,
  16. base.clienttype,
  17. count(distinct base.userid) buyer_count
  18. GROUP BY base.datekey, base.clienttype


1.首先对sql进行语法分析,词法分析,解析SQL生成AST Tree(抽象语法树)


2.根据AST Tree生成QueryBlock


上图是QueryBlock相关对象的类图,AST Tree生成QueryBlock的过程是一个递归的过程,先序遍历AST Tree,遇到不同的Token节点,保存到相应的属性中,主要包含以下几个过程

  • TOK_QUERY => 创建QB对象,循环递归子节点
  • TOK_FROM => 将表名语法部分保存到QB对象的aliasToTabs等属性中
  • TOK_INSERT => 循环递归子节点
  • TOK_DESTINATION => 将输出目标的语法部分保存在QBParseInfo对象的nameToDest属性中
  • TOK_SELECT => 分别将查询表达式的语法部分保存在destToSelExprdestToAggregationExprsdestToDistinctFuncExprs三个属性中
  • TOK_WHERE => 将Where部分的语法保存在QBParseInfo对象的destToWhereExpr属性中

3.Operator逻辑操作符

Hive最终生成的MapReduce任务,Map阶段和Reduce阶段均由OperatorTree组成。逻辑操作符,就是在Map阶段或者Reduce阶段完成单一特定的操作。

基本的操作符包括TableScanOperator,SelectOperator,FilterOperator,JoinOperator,GroupByOperator,ReduceSinkOperator

从名字就能猜出各个操作符完成的功能,TableScanOperator从MapReduce框架的Map接口原始输入表的数据,控制扫描表的数据行数,标记是从原表中取数据。JoinOperator完成Join操作。FilterOperator完成过滤操作

ReduceSinkOperator将Map端的字段组合序列化为Reduce Key/value, Partition Key,只可能出现在Map阶段,同时也标志着Hive生成的MapReduce程序中Map阶段的结束。

Operator在Map Reduce阶段之间的数据传递都是一个流式的过程。每一个Operator对一行数据完成操作后之后将数据传递给childOperator计算。


QueryBlock生成Operator Tree

QueryBlock生成Operator Tree就是遍历上一个过程中生成的QB和QBParseInfo对象的保存语法的属性,包含如下几个步骤:

  • QB#aliasToSubq => 有子查询,递归调用
  • QB#aliasToTabs => TableScanOperator
  • QBParseInfo#joinExpr => QBJoinTree => ReduceSinkOperator + JoinOperator
  • QBParseInfo#destToWhereExpr => FilterOperator
  • QBParseInfo#destToGroupby => ReduceSinkOperator + GroupByOperator
  • QBParseInfo#destToOrderby => ReduceSinkOperator + ExtractOperator
由于Join/GroupBy/OrderBy均需要在Reduce阶段完成,所以在生成相应操作的Operator之前都会先生成一个ReduceSinkOperator,将字段组合并序列化为Reduce Key/value, Partition Key


4. OperatorTree生成MapReduce Job的过程

OperatorTree转化为MapReduce Job的过程分为下面几个阶段

  1. 对输出表生成MoveTask
  2. 从OperatorTree的其中一个根节点向下深度优先遍历
  3. ReduceSinkOperator标示Map/Reduce的界限,多个Job间的界限
  4. 遍历其他根节点,遇过碰到JoinOperator合并MapReduceTask
  5. 生成StatTask更新元数据
  6. 剪断Map与Reduce间的Operator的关系,拆分MR任务。

具体可参考Hive SQL的编译过程


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/148525
推荐阅读
相关标签
  

闽ICP备14008679号