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

132 阅读4分钟

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

课程目录

1.大数据处理引擎Spark介绍

2.SparkCore原理解析

3.SparkSQL原理解析

4.业界挑战与实践

1.大数据处理引擎Spark介绍

1.1 大数据处理技术栈

  • 应用
  • 计算
  • 存储
  • 数据

1.2 常见大数据处理链路

image.png

1.3 开源大数据处理引擎

  • Batch
  • Streaming
  • OLAP

1.4 SPark

1.4.1 什么是Spark

用于大规模数据处理的统一分析引擎,是一种多语言引擎,可用于单机节点或者集群上来执行数据工程、数据科学和机器学习。

features

  • 运用多语言选择用统一的方式处理流批数据
  • 可以用仪表盘等执行快速分布式SQL察觉分析
  • 适用于大规模数据科学,对PV级别的数据进行探索性数据分析
  • 可以在单机上训练机器学习算法,方便拓展到大规模集群上

1.4.2 Spark版本演进

  • 1.0版本:内存计算、丰富API/多语言支持、一站式解决方案、多部署模式
  • 2.0版本
  • 3.0版本
  • 3.3版本

1.4.3 Spark生态&特点

  • 统一引擎,支持多种分布式场景
  • 多语言支持
  • 可读写丰富数据源
  • 丰富灵活的API/算子
  • 支持K8S/YARN/Mesos资源调度

1.5 Spark特点

1.5.1 多语言支持

  • SQL
  • Java/Scala
  • R
  • Python

1.5.2 丰富数据源

  • 内置DataSource
  • 自定义DataSource

1.5.3 丰富的API/算子

  • SparkCore->RDD
  • SparkSQL->DataFrame

1.6 运行架构&部署方式

image.png

  • 具体流程个人理解:用户创建SparkContext,连接到Cluster Manager,Cluster Manager根据用户提交时设置的参数(CPU/内存)分配计算资源,从而启动Executor,Driver Program将用户程序划分不同task来进行构成,task分区待处理数据,在阶段划分完成以及task创建完成后,Driver Program向Executor发送task,Executor接收到task后下载task执行环境开始执行task,实时将task运行状态汇报给Driver Program,Driver Program根据运行状态做状态更新,不断调度执行task,直到所有task执行正确或超过执行次数限制。
  1. Spark Local Mode 本地测试/单进程多线程模式
  2. Spark Standalone Mode 需要启动Spark的Standalone集群的Master/Worker
  3. on YARN/K8S 依赖外部资源调度器

1.7 Spark下载编译

  • 编译
  • 下载

1.8 Spark包概览

image.png

image.png

1.9 Spark提交命令

  • 环境变量
  • spark-shell
  • spark-sql
  • pyspark

1.10 提交一个简单任务

  • SparkIi scala代码
  • 编译成jar包之后,使用spark-submit提交

1.11 Spark UI

  • Job运行中->http://driverhost:{driver_host}:port
  • Job运行完->SparkHistoryServer可查看

image.png

1.12 Spark性能 benchmark

image.png

2.SparkCore原理解析

2.1 SparkCore

image.png

2.2 什么是RDD

描述RDD的五要素

image.png

2.2.1 如何创建RDD

  • 内置RDD
  • 自定义RDD

2.2.2 RDD算子

两类RDD算子

  • Transform算子:生成一个新的RDD
  • Action算子:触发Job提交

2.2.3 RDD依赖

描述父子RDD之间的依赖关系(lineage)

窄依赖:父RDD的每个partition至少对应一个子RDD分区
  • NarrowDependency
  • OneToOneDependency
  • RangeDependency
  • PruneDependency
宽依赖:父RDD的每个partition都可能对应多个子RDD分区

ShuffleDependency

2.2.4 RDD执行流程

  • Job:RDD action算子触发
  • Stage:依据宽依赖执行
  • Task:Stage内执行单个partition任务

image.png

2.3 Scheduler

image.png

2.4 Memory Management

Executor内存主要有两类

  1. Storage
  2. Execution
  • UnifiedMemoryManager统一管理多个并发Task的内存分配
  • 每个Task获取的内存区间为1/(2*N)~1/N【N为当前Executor中正在并发运行的task数量】

2.5 Shuffle

image.png

image.png

image.png

image.png

3.SparkSQL原理解析

image.png

image.png

3.1 Catalyst优化器

image.png

Rule Based Optimizer(RBO)

  • transformDown 先序遍历树进行规则匹配
  • transformUp 后序遍历树进行规则匹配

Cost Based Optimizer(CBO)

image.png

3.2 Adaptive Query Execution(AQE)

image.png

目前支持的优化场景:

  • Partition合并,优化shuffle读取,减少reduce task个数
  • SMJ->BHJ
  • Skew Join优化

3.2.1 Coalescing Shuffle Partitions

Partition合并

image.png

3.2.2 Switching Join Strategies

SortMergeJoin(SMJ)->BroadcastHashJoin(BHJ)

image.png

3.2.3 Optimizing Skew Joins

Skew Join

  • AQE根据MapSatus信息自动检测是否有倾斜
  • 将大的partition拆分成多个Task进行Join

image.png

3.3 Runtime Filter

image.png

3.4 Bloom Runtime Filter

  • tpcds/q16.sql:
  • AND cs1.cs_call_center_sk=cc_call_center_sk

3.5 Codegen-Expression

表达式(Expression)

image.png

image.png

算子/Whole StageCodegen

image.png

image.png

4.业界挑战与实践

4.1 Shuffle稳定性问题

image.png

Shuffle 稳定性解决方案

image.png

4.2 SQL执行性能问题

image.png

压榨CPU资源

  • Photon:C++实现的向量化执行引擎
  • Intel:OAP/gazelle_plugin

4.3 参数推荐/作业诊断

image.png

本次课程个人总结

Spark原理与实践.jpg