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

164 阅读4分钟

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

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

1.1 大数据处理技术栈

image.png

1.2 常见大数据处理链路

1.3 常见的大数据处理引擎

1.4 Spark官网介绍

1.4.1 关键特征

  • 多语言支持,统一方式处理流批数据
  • 为看板实现执行快速SQL查询分析
  • 对PB数据进行分析,支持data-science
  • ML:在单机结点训练,在集群上拓展应用

1.4.2 版本变化

1.4.3 生态和特点

1.5 Spark特点

1.5.1 多语言支持

1.5.2 丰富数据源

1.5.3 丰富的API/算子

  • 对于任意一个函数的操作都可以理解为算子

1.6 Spark运行架构&部署方式

1.6.1 介绍

  • Driver Program 负责作业的调度,是一个JVM进程。运行程序的main函数,创建一个SparkContext上下文,来控制应用的生命周期。Executor是slave从结点执行task的

1.6.2 提交作业的流程

  • 创建上下文:用户创建一个SparkContext,提交到Cluster Manager
  • 启动Executor:Cluster Manager根据提交的参数,为本次提交分配计算资源,启动Executor
  • 划分Stage:Driver将用户程序划分为不同的Stage,每个Stage有完全相同的一组task构成。这些task会作用于一些待处理的数据的不同分区
  • 执行task:在阶段划分完成之后和task创建完成之后,Driver会向Executor发送task,同时Executor在接收到task之后会下载task的依赖等准备好运行环境
  • 作业结束:Executor实时将task运行状态发送给Driver,Driver根据收到task运行的状态做转态更新,不断的调用task,将task发送到Executor执行,直到所有的task执行正确,或者超过执行次数,作业就结束了

1.6.3 几种部署模式

  • 其中Spark Standalone是不需要借助外部资源调度的集群部署模式,启动自己的Master,Worker
  • 使用--master选择不同的部署模式

1.7 Spark下载编译

  • 第一种自己下载源码,编译打包。
  • 第二种直接去官网下载包。

1.8 Spakr包概览

  • 官方包结构(jar目录是依赖,conf目录是配置)
  • 第二个是bin目录下的文件(很多提交命令,都是客户端提交作业的命令)

1.9 Spark提交命令

  • 配置环境变量

    • 设置SPARK_HOME和PATH环境变量,和JAVA很类似。
  • 三种提交作业的方式(交互界面)。在本地自测用。线上的时候还是用spark-submit提交。

    • spark-shell
    • spark-sql
    • pyspark

1.10 提交一个简单的任务(spark-submit)

  • 使用蒙特卡罗实验估计π,这里除以n-1是无偏估计
  • 先将程序打包为jar包,使用spark submit --master local运行,前面说的本地测试

1.11 Spark UI

1.12 Spark性能 Benchmark

2、 SparkCore 原理解析

2.1 SparkCore

  • Yarn集群部署:cluster Manager分为Resource Manger和Node Manger
  • 选择一个NodeManger启动Driver,负责task的调度

2.2 RDD介绍

  • RDD:Resilient Distributed Dataset(弹性分布式数据集)分布式内存的一个抽象概念提供了一种高度受限的共享内存模型。 RDD是可恢复的记录分区的数据集合
  • 解释
    • Resilient:具有可恢复的容错特性
    • Distributed:每个RDD可分成多个分区(partition),一个RDD的不同分区可以存到集群中不同的节点上
    • Dataset:每个分区就是一个数据集片段

2.2.1 如何创建RDD

2.2.2 RDD算子

  1. RDD的两类运算:一个生成新的RDD;一个标注转换结束。

2.2.3 RDD依赖

  • 图中父RDD箭头指向子RDD
  • partition是指RDD(矩形框)中的蓝色矩形块
  • 注意区分父RDD中partition和子RDD中partition中的关系和RDD之间的关系
  • NarrowDependency有三个实现

  • 宽依赖会产生shuffle

2.2.4 RDD执行流程-划分Stage

  1. 从后往前推,划分stage,宽依赖划分一个stage,遇到窄依赖合并划分为一个Stage
  2. resultTask和shuffleMap task

2.3 调度器

2.4 内存管理

  • 堆内和堆外
  • Executor内存主要分两类

2.4.1 多任务间内存分配

2.5 Shuffle

2.5.1 SortShuffleManager

2.5.2 External Shuffle Service

  • 运行在每台主机上,管理Executor shuffle的数据

3、 SparkSQL 原理解析

  • 执行流程:下面那个图,和SQL的执行流程类似
  • 其中Catalyst的核心负责逻辑优化过程。

3.1 Catalyst优化器

  • RBO

  • CBO

3.2 自适应查询(AQE)

  • Adaptive Query Execution

  • 三种优化场景

  • Coalescing shuflle Partitions (partition 合并)

  • Switching Join Strategies

  • Optimizing Skew Joins

3.3 Runtime Filter

3.4 Bloom Runtime Filter

  • 布隆过滤器

3.5 Codegen-Expression

4、 业界挑战与实践

4.1 Shuffle 稳定性问题

image.png

  • 解决方案: image.png

4.2 SQL执行性能问题

image.png

4.3 参数推荐/作业诊断

image.png

4、 课堂总结

image.png