这是我参与青训营笔记活动的第五天
大数据处理引擎Spark介绍
大数据处理技术栈
常见的大数据处理链路
开源大数据处理引擎
批式:map reduce Hadoop,Spark
- map reduce Hadoop:解决了数据大规模计算的问题
- spark:离线处理场景
流式:Flink
OLAP:presto,ClinkHourse,Impala,Doris
Spark的生态
)
Spark的特点
多语言支持:支持SQL,Java,Python,scala,R
丰富的数据源
- 内置DataSource:
- 自定义 DataSource
丰富的API/算子
- SparkCore->RDD
- SparkSQL->dataframe
Spark运行架构
- 在application的main函数中创建SparkContext,负责和ClusterManager(集群管理器)通信,进行资源的申请,任务的分配和监控等。
- ClusterManager将任务分配给多个Work Note(工作节点)
- Executer(执行人)作为一个进程运行的Worker节点上,该进程负责运行Task,并且负责将数据存在内存或磁盘上
Spark的三种部署方式
-
Spark Local Modal:本地测试/单进程多线程模式
- 进程:运行中的应用程序称为进程,拥有系统资源(CPU,内存)
- 线程:进程中的一段代码,一个进程中可以有多个代码
-
Spark Standalone Modal(Spark独立模态):需要启动Spark的Standalone的Master/Worker
-
on YARN/K8S:依赖外部的资源调度器(YARN/K8S)
Sparkcore原理解析
SparkCore是Spark的核心,主要负责任务调度等管理功能,其实现依赖于RDD(Resilient Distribute Databases 弹性分布式数据库)的程序抽象概念。
描述RDD的五要素
- Partition:分区列表
- Compute:用于计算每个分割的函数
- Dependencies:对其他RDD的依赖列表
- Partitioner:键值RDD的分区器
- PreferredLocations:计算每个拆分的首选位置列表(eg:HDFS文件的块位置)
创建RDD
- 内置RDD:shuffle RDD ,Hadoop RDD,JDBC RDD
- 自定义RDD
两类RDD算子
- Transform算子:生成一个新的RDD
- Action算子:触发job提交
RDD依赖:描述父子RDD之间的依赖关系
- 窄依赖:父RDD的每个partition至多对应1个子RDD分区
- 宽依赖:父RDD的每个partition都可能对应多个子RDD分区(shuffleDependency)
RDD执行流程
SparkSQL原理解析
- SQL解析器会把字符串解析为一个语法树,即变为Unresolved Logical Plan(未解析的逻辑计划)
- Analysis:遍历整个语法树,对每个节点进行数据类型的绑定,函数的绑定,根据catalog的元数据信息对数据表中的数据字段进行解析。最后变为(Logical plan 解析后的计划)
- Logical Optimization:是catalyst的核心,分为RBO和CBO两种策略。通过这一步后转换为Optimized Logical Plan(优化后的逻辑计划)
- Phyplanning:逻辑计划是不能被spark执行的,通过这一模块转换为Physical Plans(物理执行计划)
- cost Model:根据过去性能统计,选择最佳物理计划(cbo)
- code generation:代码生成,转换为Java实现
Catalyst优化器
-
RBO:基于规则优化
- 实质:对语法树进行遍历,模式匹配,找到满足规则的节点,进行等价转换
- Spark是通过RuleExecuter模块来调度规则
- RuleExecute内部提供batch,定义了RuleExecute的处理步骤
- batch->once:只执行一次
- batch->once:重复执行,直到plan不再改变,或者到固定次数
-
CBO:基于代价优化
- 先收集列,表的统计信息
- 打开CBO进行估算
-
Adaptive Query Execution (AQE)自适应查询
-
边执行边优化
-
目前支持的优化场景
-
partition合并,优化shuffle读取,减少reduce task个数
- 可以把相邻的较小分区合并为一个大的分区,由一个task读取进行处理
-
SMJ->BHJ
- AQE运行过程中动态获取准确join的实际大小,将SortMergeJoin->BroadcastHashJoin
-
Skew join优化(数据倾斜优化)
- 数据倾斜:分区之间的数据分布不均匀,拉慢整体速度
- AQE根据shuffle文件统计自动检查倾斜,将大的分区转换为几个小的分区
-
-
-
Runtime Filter
- 全局优化:从提升全局资源利用率,消除数据倾斜,降低IO等角度优化
- 局部优化:提升某个task的执行效率,主要从提高CPU和内存利用率的角度进行优化