Spark 原理与实践 | 青训营笔记

256 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的第6天。

本课程主要有以下几个目标:

  1. 了解大数据处理常见的场景链路

  2. 了解Spark技术栈,包括SparkCore中的RDD/调度/Shuffle/内存管理等概念机制,以及SQL在Spark引擎中执行的详细流程

  3. 了解目前业界主要遇到的挑战以及解决方案

批式计算引擎spark

大数据处理技术栈

image.png

我们的计算引擎Spark等利用YARN平台来处理我们使用HDFS等存储的数据,上传到应用

常见大数据处理链路

image.png

开源大数据处理引擎

image.png

Spark版本演进

image.png

Spark生态和特点

image.png

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运行架构

image.png

标准的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下载编译:

image.png

包概览:

image.png

Spark提交命令:

image.png

提交一个简单任务:

image.png

Spark UI 查看运行信息:

image.png

小结:

  • 学习了Spark的技术栈和特点
  • 从头开始提交一个Spark任务

SparkCore核心原理

目标:

  • 认识spark的核心概念RDD,RDD两种算子处理过程,理解RDD依赖,学习RDD在Spark中的执行流程
  • 了解spark中调度
  • 内存管理机制
  • shuffle机制

image.png

用户提交程序在Spark上做了什么?

用户提交数据,Spark创建AppMaster相当与Driver,Driver通过调度器管理分配任务,其中的数据和任务存储涉及到存储结构RDD。

什么是RDD? 是Spark中一个基本的处理单元

RDD特性:

  • 指定分区个数
  • 有计算函数算子
  • 有依赖
  • 两种类型分区函数
  • 每个分区有优先位置列表

创建RDD

image.png

RDD算子

image.png

RDD依赖

image.png

通过宽窄依赖划分stage

从后往前推,遇到宽依赖将其划分不同的stage,将窄依赖连接在宽依赖之后

image.png

从上图我们要描述如何从一个RDD.action算子到最后的调度

当RDD.action算子触发,创建RDD,Spark构建DAG->RDD.action->runJob()->提交给DAG scheduler-> 根据ShuffleDependency 切分stage,并按依赖顺序调度stage,为每个stage生成并提交TaskSet到TaskScheduler。TaskScheduler根据调度算法多多个TaskSet进行调度,调度过程是通过资源管理器调度到workNode中的Executer上执行。

内存管理

image.png

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 扫描和回收,提升了处理性能。

多任务间内存分配

image.png

shuffle

shuffle:map与reduce之间数据处理,重新分发的过程

image.png

SortShuffleManager hi是ShuffleManager的一个实现 在shuffle 的过程中会对数据排序把临时文件合成一个文件并制作索引。 image.png

SparkSQL原理解析

image.png

Dataframe是role对象集合,每个role代表一行记录

Catalyst优化器

RBO

image.png

对逻辑计划进行遍历,找到满足条件的节点进行模式匹配来转换。

CBO

image.png

自适应查询

根据已经完成的节点进行统计然后反馈

image.png

AQE 切换join策略

image.png

优化方式

  • AQE
  • Bloom Filter
  • codegen

AQE 优化 skew joins

image.png

Bloom Runtime Filter

image.png

codegen - Expression 代码生成 - 表达式

codegen - WholeStageCodegen 代码生成

火山模型

将查询树每个节点看作一个operator,传统的火山模型会把每个operator看作一个迭代器,每个得到其有一个next接口,自顶向下的调用next接口。

小结:

  • 1.SparSQL的执行流程
  • 2.SaprkSQL的核心catalst优化器的优化方式RBO,CBO
  • 3.其他的优化方式
  • 4.代码生成方法

业界挑战与实践

shuflle稳定性问题:

image.png

解决方案:

image.png

SQL执行性能问题:

image.png

参数推荐/作业诊断:

image.png

总结:

  • 1.学习了大数据处理常见链路,Spark特点
  • 2.学习了Spark中核心概念RDD,调度机制,内存管理机制,shuffle机制
  • 3.Sql在Spaark引擎中执行的详细流程与优化方案
  • 4.业界挑战

标题:Exactly Once语义在Flink中的实现| 青训营笔记

网址:juejin.cn/