这是我参与「第四届青训营」笔记创作活动的的第2天
1.大数据处理引擎Spark介绍
Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。
Spark生态组件:
- Spark Core: Spark核心组件,它实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。
- Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可以直接查询Hive、HBase等多种外部数据源中的数据。
- Spark Structured Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理。
- MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能。
- GraphX:Spark提供的分布式图处理框架,拥有对图计算和图挖掘算法的API接口以及丰富的功能和运算符。
- 独立调度器、Yarn、Mesos、Kubernetes:Spark框架可以高效地在一个到数千个节点之间伸缩计算,集群管理器则主要负责各个节点的资源管理工作,为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(Cluster Manager)上运行。
Spark的特点:
- 统一引擎,支持多种分布式场景
- 多语言支持
- 可读写丰富数据源
- 丰富灵活的API/算子
- 支持K8S/YARN/Mesos资源调度
Spark运行架构:
首先用户创建一个SparkContext,SparkContext链接到Cluster Manager,Cluster Manager会根据用户提交设置的参数(CPU,内存)去给用户分配资源,启动Executor。Driver会将用户程序划分为不同的stage,每个stage会有完全相同的一组task,这些task会作用于待处理的数据的不同分区,在阶段划分完成后和task创建完成后,Driver会向Executor发送task,Executor在接受task之后,会下载依赖,准备好执行环境。并将每次运行状态发送给Driver,Driver根据运行状态做状态更新,直到所有task执行正确或超出执行限制。
部署方式:
- Spark Local Mode 本地测试/单进程多线程模式
- Spark Standalone Mode 需要启动Spark的Standalone集群的Master/Worker
- On YARN/K8S 依赖外部资源调度器
2.SparkCore原理解析
RDD:弹性分布式数据集
如何创建RDD:
- 内置RDD
- 自定义RDD
两类RDD算子:
- Transform算子:生成一个新的RDD
- Action算子:触发Job提交
RDD依赖:描述父子RDD之间的依赖关系
窄依赖:父RDD的每个partition至多对应一个子RDD分区
宽依赖:父RDD的每个partition都可能对应多个子RDD分区
RDD执行过程:
3.SparkSQL原理解析
Catalyst优化
- Rule Based Optimizer(RBO): 基于规则优化,对语法树进行一次遍历,模式匹配能够满足特定规则的节点,再进行相应的等价转换。
- Cost Based Optimizer(CBO): 基于代价优化,根据优化规则对关系表达式进行转换,生成多个执行计划,然后CBO会通过根据统计信息(Statistics)和代价模型(Cost Model)计算各种可能执行计划的代价,从中选用COST最低的执行方案,作为实际运行方案。CBO依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择。
AQE
每个Task结束会发送MapStatus信息给Driver
Task的MapStatus中包含当前Task Shuffle产生的每个partition的size统计信息
Driver获取到执行完的Stages的MapStatus信息之后,按照MapStatus中的partition大小信息识别匹配一些优化场景,然后对后续未执行的Plan进行优化
目前支持的优化场景:
- Partition合并,优化shuffle读取,减少reduce task个数
- SMJ->BHJ,动态获取准确Join的leftChild/rightChild的实际大小,将SMJ转换为BHJ
- Skew Join,根据MapStatus信息自动检测是否有倾斜,将大的partition拆分成多个Task进行join
4.业界挑战与实践
- Shuffle稳定性
- SQL执行性能
- 参数推荐/作业诊断