hive sql语句执行原理
大致理解为:hive会对写好的sql语句进行拆解,按执行顺序拆分成树结构(AST)交给mapreduce处理;
hive对不同DML/DDL关键字有不同的反应,比较敏感的有select、from、join、group by、distinct、insert等;
对查询语句,hive首先会先根据from找到数据源(metastore),然后从查询内部开始找用到的字段及其类型,看语句要求对字段直接处理(加减乘除等)还是聚合处理(sum等),并检查语句是否正确——扫描表、语法分析、语义分析;
找出需要的字段,剩下的就是对字段下的取值进行的操作了
join的过程,因为涉及两个及以上的表,在map阶段会对不同表打上不同标签来区分,打上标签以后其实就可以按一个表来理解;
group by与distinct的过程,类似map端的combiner与reduce端的功能,就是按不同Key展示结果且key不重复;
order by的过程,只在reduce端执行,也就是只需要一个reducer,耗时耗内存,可以用 (distribute by col sort by col) order by这样的结构代替;
mapjoin用于大小表相连,提高效率;
hive用left semi join代替in
1. left join 的条件,条件不同生成的job数量有什么不同,多个表join生成的job数量有什么不同.
2. group by 生成的任务map阶段和reduce阶段都做了什么
3. dictinct生成的任务map阶段和reduce阶段都做了什么
子查询生成几个job
4. left semi join生成几个job map 阶段和reduce阶段都做什么事儿
5. 数据倾斜是怎么回事,写sql的时候要注意哪些防止数据倾斜
6. 常见的排序有哪些,各有什么优缺点,map阶段和reduce阶段都做了什么
表Course_z:8条记录
表SC_z:13条记录
表Student_z:8条记录
1. Leftjoin
N个表join生成n-1个job,读入几条记录就有几个mapper,在map端执行完后到1个reducer上执行;
内部join的结果看做1条记录所以有1+8个mapper
当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤,时间消耗更多
2. Groupby
Map阶段,group by的参数作key,有combiner的过程
Reduce阶段key去重并reduce
3. Distinct
Map阶段,distinct字段作key,没有combiner的过程
reduce阶段去重
group by比distinct效率高
4. Leftsemi join(效果相当于In,执行的时候按Join处理)
相当于
1个join对应1个job
Map阶段,表加tag,
Reduce阶段按tag操作,只保留左表字段
5. 数据倾斜
表现:某个或少数几个reducer长时间处于未完成状态,任务进度长时间维持在99%(或100%),处理时间远大于平均时长;数据倾斜的Job中reducer个数>1
原因: 1. 小表join大表
优化:我们要看有哪些过程是需要至少两个reducer来执行的,然后去优化那些运算;增加reduce 的jvm内存(不采用);增加reduce 个数(不采用);distinct;customer partition;pipeline;index 尤其是bitmap index;mapjoin;
6. Order by,只在reduce端执行,且1个orderby对应1个reducer
优点:总体有序
缺点:只用1个reducer,数据越大运行越慢
Sort by,在各mapper端排序,reduce端不排序,所以总体是无序的
优点:运行较快
缺点:整体无序
Distribute by,reduce端执行
Cluster by, clusterby的功能就是distribute by和sort by相结合
参考:http://tech.meituan.com/hive-sql-to-mapreduce.html