SparkCore和SparkSQL | 青训营笔记

248 阅读3分钟

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

第五节课「Spark 原理与实践」的内容主要包含 4 个方面:Spark 介绍、Spark Core 原理解析、Spark SQL 原理解析、业界挑战与实践。这篇文章为 Spark Core 和 Spark SQL 的介绍。

SparkCore

  • RDD (Resilient Distributed Dataset):弹性分布式数据集,是一个容错的、并行的数据结构

  • RDD 算子:对任何函数进行某一项操作都可以认为是一个算子,RDD 算子是 RDD 的成员函数

  • Transform(转换)算子:根据已有 RDD 创建新的 RDD

  • Action(动作)算子:将在数据集上运行计算后的数值返回到驱动程序,从而触发真正的计算

  • DAG(Directed Acyclic Graph):有向无环图,Spark 中的 RDD 通过一系列的转换算子操作和行动算子操作形成了一个 DAG

  • DAGScheduler:将作业的 DAG 划分成不同的 Stage,每个 Stage 都是 TaskSet 任务集合,并以 TaskSet 为单位提交给 TaskScheduler。

  • TaskScheduler:通过 TaskSetManager 管理 Task,并通过集群中的资源管理器(Standalone 模式下是 Master,Yarn 模式下是 ResourceManager)把 Task 发给集群中 Worker 的 Executor

  • Shuffle:Spark 中数据重分发的一种机制。

RDD执行过程

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

当 RDD 对象创建后,SparkContext 会根据 RDD 对象构建 DAG 有向无环图,然后将 Task 提交给 DAGScheduler。DAGScheduler 根据 ShuffleDependency 将 DAG 划分为不同的 Stage,为每个 Stage 生成 TaskSet 任务集合,并以 TaskSet 为单位提交给 TaskScheduler。TaskScheduler 根据调度算法 (FIFO/FAIR) 对多个 TaskSet 进行调度,并通过集群中的资源管理器 (Standalone 模式下是 Master,Yarn 模式下是 ResourceManager) 把 Task 调度 (locality) 到集群中 Worker 的 Executor,Executor 由 SchedulerBackend提供。

SparkSQL

  • DataFrame: 是一种以 RDD 为基础的分布式数据集,被称为 SchemaRDD

  • Catalyst:SparkSQL 核心模块,主要是对执行过程中的执行计划进行处理和优化

  • DataSource:Spark SQL 支持通过 DataFrame 接口对各种数据源进行操作。

  • Adaptive Query Execution:自适应查询执行

  • Runtime Filter:运行时过滤

  • Codegen:生成程序代码的技术或系统,可以在运行时环境中独立于生成器系统使用

SparkSQL执行过程

  • SQL Parse:将SparkSQL字符串或DataFrame解析为一个抽象语法树/AST,即Unresolved Logical Plan

  • Analysis:遍历整个AST,并对AST上的每个节点进行数据类型的绑定以及函数绑定,然后根据元数据信息Catalog对数据表中的字段进行解析。 利用Catalog信息将Unresolved Logical Plan解析成Analyzed Logical plan

  • Logical Optimization:该模块是Catalyst的核心,主要分为RBO和CBO两种优化策略,其中RBO是基于规则优化,CBO是基于代价优化。 利用一些规则将Analyzed Logical plan解析成Optimized Logic plan

  • Physical Planning:Logical plan是不能被spark执行的,这个过程是把Logic plan转换为多个Physical plans

  • CostModel:主要根据过去的性能统计数据,选择最佳的物理执行计划(Selected Physical Plan)。

  • Code Generation:sql逻辑生成Java字节码

个人总结

学习了 SparkCore 中的 RDD 等概念机制以及 SQL 在 Spark 引擎中执行的详细流程。

参考