在学习、使用和研究spark的过程中,逐渐会发现:单纯看官方文档对spark参数调优只能解决一小部分的问题,要想进一步的学习spark,进一步调优甚至在spark源码的基础上二次开发,我觉得收益最高的应该是学习执行计划了。
因此在研究spark源码之前,学习执行计划 可以对整个spark执行过程、架构设计都有一个初步的认识。
然而国内网站各大博客,都没有找到一个相关入门教程,笔者打算利用空余时间,在学习的同时做一个笔记,分享一下。
-------
基础篇:
Spark常用算子:https://blog.csdn.net/zyzzxycj/article/details/82706233
内存模型:https://blog.csdn.net/zyzzxycj/article/details/82740733
RDD&Partition:https://blog.csdn.net/zyzzxycj/article/details/82754411
DAG:https://blog.csdn.net/zyzzxycj/article/details/82734453
hive文件存储类型:https://blog.csdn.net/zyzzxycj/article/details/79267635
-------
Spark执行流程与原理:
https://blog.csdn.net/zyzzxycj/article/details/83788647
-------
1、先从最简单的例子开始 select *
场景:select * from test1(普通表 TextFile、一个partition)
== Physical Plan ==
HiveTableScan [instance_id#2, order_id#3, pt#4], HiveTableRelation `heguozi`.`test1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [instance_id#2, order_id#3], [pt#4]
解释:HiveTableScan:扫描hive表,[]内为表中的三个字段(包括了表字段+分区字段)
HiveTableRelation:后面跟了库名.表名,HiveLazySimpleSerDe:TextFile默认的序列化器,[]内为表中两个字段,[]内为分区字段
2、count
场景:select count(*) from test1(普通表 TextFile、多个partition)
== Physical Plan ==
*(2) HashAggregate(keys=[], functions=[count(1)])
+- Exchange SinglePartition
+- *(1) HashAggregate(keys=[], functions=[partial_count(1)])
+- HiveTableScan HiveTableRelation `heguozi`.`test1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [instance_id#8, order_id#9], [pt#10]
解释:执行计划自下而上读,这个时候出现了两个stage,执行计划中 *(1)和*(2)为WholeStageCodegenId 这个会在之后的文章中做介绍。
count操作会触发HashAggregate算子,无论有多少个partition,均会产生shuffle。
总dag-graph:
stage1:
stage2:
PS:WholeStageCodegen 是spark2.X的新优化器,参考:https://blog.csdn.net/zyzzxycj/article/details/82745336
3、简单where查询
场景:select * from test1 where order_id='1'
解释:where作为过滤条件,spark只用了filter一个算子,窄依赖,会在一个stage中完成。
dag-graph:
4、group by & join
场景:
SELECT self_entity_id entity_id
FROM DW_DTL.DTL_T_CM_OD_TP_JOIN a
JOIN
(SELECT entity_id,
code,
name
FROM ods_shop_org.shop
WHERE code IN('C8007797')) b ON(a.self_entity_id = b.entity_id)
WHERE curr_date BETWEEN '2018-07-22' AND '2018-08-22'
GROUP