这是我参与「第四届青训营 」笔记创作活动的第6天。
本课程主要有以下几个目标:
-
了解大数据处理常见的场景链路
-
了解Spark技术栈,包括SparkCore中的RDD/调度/Shuffle/内存管理等概念机制,以及SQL在Spark引擎中执行的详细流程
-
了解目前业界主要遇到的挑战以及解决方案
批式计算引擎spark
大数据处理技术栈
我们的计算引擎Spark等利用YARN平台来处理我们使用HDFS等存储的数据,上传到应用
常见大数据处理链路
开源大数据处理引擎
Spark版本演进
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/算子
Spark运行架构
标准的master/slave架构
masiter:Cluster Manager slave: worker node
Spark应用在集群上运行时,包括了多个独立的进程,这些进程之间通过驱动程序(Driver Program)中的SparkContext对象进行协调,SparkContext对象能够与多种集群资源管理器(Cluster Manager)通信,一旦与集群资源管理器连接,Spark会为该应用在各个集群节点上申请执行器(Executor),用于执行计算任务和存储数据。Spark将应用程序代码发送给所申请到的执行器,SparkContext对象将分割出的任务(Task)发送给各个执行器去运行。
Spark运行架构流程:
用户创建SparkContext,连接到Cluster Manager,Cluster Manager根据用户提交的参数分配计算资源启动Exceutor。Driver Progrem会将用户划分不同的stage,每个satge会有一组完全相同的task,这些task会作用与不同的待处理数据,stage完成之后。Driver Progrem将这些task发送Exceutor,Exceutor会准备好task依赖和环境,实时将状态返回给Driver Progrem,Driver Progrem会根据状态做更新,不断的将task送入Executor,z直到所有task运行正确。
部署方式:
- Spark Local Mode 本地测试/单线程多线程模式
- Spark Standalone Mdoe 需要情动Spark的Standalone集群的Master/Worker
- on YARN/K8S 依赖外部资源调度器
Spark任务执行
Spark下载编译:
包概览:
Spark提交命令:
提交一个简单任务:
Spark UI 查看运行信息:
小结:
- 学习了Spark的技术栈和特点
- 从头开始提交一个Spark任务
SparkCore核心原理
目标:
- 认识spark的核心概念RDD,RDD两种算子处理过程,理解RDD依赖,学习RDD在Spark中的执行流程
- 了解spark中调度
- 内存管理机制
- shuffle机制
用户提交程序在Spark上做了什么?
用户提交数据,Spark创建AppMaster相当与Driver,Driver通过调度器管理分配任务,其中的数据和任务存储涉及到存储结构RDD。
什么是RDD? 是Spark中一个基本的处理单元
RDD特性:
- 指定分区个数
- 有计算函数算子
- 有依赖
- 两种类型分区函数
- 每个分区有优先位置列表
创建RDD
RDD算子
RDD依赖
通过宽窄依赖划分stage
从后往前推,遇到宽依赖将其划分不同的stage,将窄依赖连接在宽依赖之后
从上图我们要描述如何从一个RDD.action算子到最后的调度
当RDD.action算子触发,创建RDD,Spark构建DAG->RDD.action->runJob()->提交给DAG scheduler-> 根据ShuffleDependency 切分stage,并按依赖顺序调度stage,为每个stage生成并提交TaskSet到TaskScheduler。TaskScheduler根据调度算法多多个TaskSet进行调度,调度过程是通过资源管理器调度到workNode中的Executer上执行。
内存管理
Spark 作为一个基于内存的分布式计算引擎,Spark采用统一内存管理机制。重点在于动态占用机制。
-
设定基本的存储内存(Storage)和执行内存(Execution)区域,该设定确定了双方各自拥有的空间的范围,UnifiedMemoryManager统一管理Storage/Execution内存
-
双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间
-
当Storage空闲,Execution可以借用Storage的内存使用,可以减少spill等操作, Execution内存不能被Storage驱逐。Execution内存的空间被Storage内存占用后,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
-
当Execution空闲,Storage可以借用Execution内存使用,当Execution需要内存时,可以驱逐被Storage借用的内存,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
user memory存储用户自定义的数据结构或者spark内部元数据
Reserverd memory:预留内存,防止OOM,
堆内(On-Heap)内存/堆外(Off-Heap)内存:Executor 内运行的并发任务共享 JVM 堆内内存。为了进一步优化内存的使用以及提高 Shuffle 时排序的效率,Spark 可以直接操作系统堆外内存,存储经过序列化的二进制数据。减少不必要的内存开销,以及频繁的 GC 扫描和回收,提升了处理性能。
多任务间内存分配
shuffle
shuffle:map与reduce之间数据处理,重新分发的过程
SortShuffleManager hi是ShuffleManager的一个实现
在shuffle 的过程中会对数据排序把临时文件合成一个文件并制作索引。
SparkSQL原理解析
Dataframe是role对象集合,每个role代表一行记录
Catalyst优化器
RBO
对逻辑计划进行遍历,找到满足条件的节点进行模式匹配来转换。
CBO
自适应查询
根据已经完成的节点进行统计然后反馈
AQE 切换join策略
优化方式
- AQE
- Bloom Filter
- codegen
AQE 优化 skew joins
Bloom Runtime Filter
codegen - Expression 代码生成 - 表达式
codegen - WholeStageCodegen 代码生成
火山模型
将查询树每个节点看作一个operator,传统的火山模型会把每个operator看作一个迭代器,每个得到其有一个next接口,自顶向下的调用next接口。
小结:
- 1.SparSQL的执行流程
- 2.SaprkSQL的核心catalst优化器的优化方式RBO,CBO
- 3.其他的优化方式
- 4.代码生成方法
业界挑战与实践
shuflle稳定性问题:
解决方案:
SQL执行性能问题:
参数推荐/作业诊断:
总结:
- 1.学习了大数据处理常见链路,Spark特点
- 2.学习了Spark中核心概念RDD,调度机制,内存管理机制,shuffle机制
- 3.Sql在Spaark引擎中执行的详细流程与优化方案
- 4.业界挑战
标题:Exactly Once语义在Flink中的实现| 青训营笔记
网址:juejin.cn/