Spark原理|青训营笔记

125 阅读4分钟

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

本次笔记重点内容

    1. 大数据处理引擎Spark介绍
    1. 了解SparkCore和SparkSQL原理
    1. 了解目前业界主要遇到的挑战以及解决方案

Spark

用于大规模数据处理的引擎 image.png

生态 & 特点

image.png

  • SparkCore是核心组件,实现了Spark基本功能
  • SparkSQL是操作结构化数据的核心组件,可以交互式查询各种数据源
  • Spark Structured Streaming支持高吞吐、可容错处理的实时流式数据处理
  • MLlib关于机器学习的算法程序库
  • GraphX提供分布式图处理框架 统一引擎,支持多种分布式场景,多语言支持(SQL\Java\R\Python) ,可读写丰富数据源。

Spark运行架构 & 部署方式

image.png 用户会创建一个SparkContext,连接Cluster Manager然后通过它对本次CPU等信息的分析去分配计算资源,Driver分配不同Task去处理数据信息,然后Executor接收到Task会准备好执行环境并执行Task。

SparkCore原理解析

image.png

RDD

它是一个能容错的、能并行执行的分布式数据集,是Spark中的基本单元。它有多个分区,运行在不同节点上;每个RDD都有一个计算函数;RDD之间互相依赖,若一个数据丢失了,Spark会通过这种依赖关系找回丢失的数据,而不用对所有RDD重新计算;每个分区都有个优先的排序列表。RDD提供了各种各样的算子,Transform算子可以生成一个新的RDD,Action算子会触发Job提交。

RDD依赖

窄依赖是指父RDD的每个partition至多对应一个子RDD分区,宽依赖的可能对应多个子RDD分区

RDD执行

image.png 从后往前推,遇到宽依赖就断开,划分为一个Stage,遇到窄依赖,就将这个RDD加入该Stage中,DAG最后一个阶段会为每个结果的Partition生成一个ResultTask,每个Stage里面的Task数量由最后一个RDD的Partition数量决定,其余的阶段会生成ShuffleMapTask。

调度器

RDD触发Job之后,DAG调度器将DAG分为不同stage,每个stage用一个TaskSet集合,TaskScheduler对不同集合进行调度,调度到Executor中。

内存管理

Spark采用统一内存管理机制,重点在于动态占用机制。

Executor内存:Storage & Execution

双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,执行内存和存储内存可以互相借用空间。注意,当Execution需要内存时,可以驱逐被Storage借用的内存,让对方将占用的部分转存到硬盘,然后"归还"借用的空间,反之不行。

SparkSQL原理解析

image.png 将SparkSQL字符串或DataFrame解析为一个抽象语法树,遍历它,并对每个节点进行数据类型的绑定以及函数绑定,然后根据Catalog对数据表中的字段进行解析,将Unresolved Logical Plan解析成Analyzed Logical plan,再把Logic plan转换为多个Physical plans

Catalyst优化器

CBO

根据优化规则对关系表达式进行转换,生成多个执行计划,然后CBO会通过根据统计信息(Statistics)和代价模型(Cost Model)计算各种可能执行计划的代价,从中选用代价最低的执行方案。

AQE

AQE对于整体的SparkSQL的执行过程做了相应的调整和优化,可以根据已经完成的计划结点精确的执行统计结果来不停的反馈并重新优化剩下的执行计划。

  • Partition合并,根据前面运行完的MapStatus中实际的partition大小信息,可以将多个相邻的较小的partition进行动态合并,由一个Task读取处理
  • 动态切换Join
  • 动态优化数据倾斜Join,增加了一个Task,但平均了每个Task执行的时间,不会出现其中一个Task执行过长的情况 image.png

RuntimeFilter

对join算法的优化,减少了大表扫描、shuffle数据量和参加的join的数据量,大大提高性能。

  • 全局优化:从提升全局资源利用率、消除数据倾斜等角度做优化
  • 局部优化:从提高CPU与内存利用率的角度进行优化

Codegen

image.png

业界挑战

image.png 数据存储在本地磁盘无备份,热点数据反复读,MapReduce大量请求,SQL执行性能问题

SQL业界引擎实践

image.png