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

116 阅读4分钟

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

01 Spark介绍

1.1 大数据处理技术栈

1.2 常见大数据处理链路

1.3 常见的大数据处理引擎

1.4 Spark官网介绍

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

  1. 版本变化

  1. 生态和特点

1.5 Spark特点

1.5.1 多语言支持

1.5.2 丰富数据源

1.5.3 丰富的API/算子

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

1.6 Spark运行架构&部署方式

  1. 介绍

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

  1. 提交作业的流程
    1. 创建上下文:用户创建一个SparkContext,提交到Cluster Manager
    2. 启动Executor:Cluster Manager根据提交的参数,为本次提交分配计算资源,启动Executor。
    3. 划分Stage:Driver将用户程序划分为不同的Stage,每个Stage有完全相同的一组task构成。这些task会作用于一些待处理的数据的不同分区。
    4. 执行task:在阶段划分完成之后和task创建完成之后,Driver会向Executor发送task,同时Executor在接收到task之后会下载task的依赖等准备好运行环境。
    5. 作业结束:Executor实时将task运行状态发送给Driver,Driver根据收到task运行的状态做转态更新,不断的调用task,将task发送到Executor执行,直到所有的task执行正确,或者超过执行次数,作业就结束了。
  1. 几种部署模式
    1. 其中Spark Standalone是不需要借助外部资源调度的集群部署模式,启动自己的Master,Worker。之前还以为是单机部署的意思呢!
    2. 使用--master选择不同的部署模式

1.7 Spark下载编译

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

1.8 Spakr包概览

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

1.9 Spark提交命令

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

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

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

1.11 Spark UI

\

1.12 Spark性能 Benchmark

02 SparkCore 原理解析

2.1 SparkCore

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

2.2 RDD介绍

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

2.2.1 如何创建RDD

2.2.2 RDD算子

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

2.2.3 RDD依赖

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

  1. 宽依赖会产生shuffle

2.2.4 RDD执行流程-划分Stage

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

2.3 调度器

2.4 内存管理

  1. 堆内和堆外
  2. Executor内存主要分两类

2.4.1 多任务间内存分配

2.5 Shuffle

2.5.1 SortShuffleManager

2.5.2 External Shuffle Service

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

03 SparkSQL 原理解析

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

3.1 Catalyst优化器

  • RBO

  • CBO

\

3.2 自适应查询(AQE)

Adaptive Query Execution

1.三种优化场景

  • Coalescing shuflle Partitions (partition 合并)

  • Switching Join Strategies

  • Optimizing Skew Joins

\

3.3 Runtime Filter

3.4 Bloom Runtime Filter

布隆过滤器

3.5 Codegen-Expression

\

04 业界挑战与实践

\

\