Spark原理|青训营笔记

96 阅读2分钟

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

Spark原理

Apache Spark 是专为 大规模数据处理 而设计的快速通用的计算引擎。

Spark Core

Spark-Spark-Core.jpg


RDD(Resilient Distributed Dataset)

在较高的层次上,每个Spark应用程序都由一个驱动程序组成,该程序运行用户的主函数,并在集群上执行各种并行操作。

Spark提供的主要抽象是 弹性分布式数据集(RDD) ,它是跨集群节点划分的元素集合,可以并行操作。

创建RDD的方法是从Hadoop文件系统(或任何其他支持Hadoop的文件系统)中的一个文件或驱动程序中现有的Scala集合开始,并对其进行转换。

用户可能还会要求Spark将RDD持久化到内存中,以便在并行操作中有效地重用它。最后,rdd会自动从节点故障中恢复。


RDD支持两种类型的操作:

  • transformations: 从现有数据集创建一个新数据集
  • actions: 在数据集上运行计算后向驱动程序返回一个值

对于Spark来说所有transformations都是懒惰的,它们并不会立即计算结果,而是当 actions 需要将结果返回驱动程序的时候才会计算。


RDD的依赖描述父子RDD之间的关系:

  • 窄依赖: 父RDD的每个分区最多对应一个子RDD分区,比如map、filter、union之类的操作就是窄依赖。
  • 宽依赖(会产生shuffle): 父RDD的每个分区都有可能对应多个子RDD分区,比如groupByKey就是宽依赖。

调度器

  • 根据ShuffleDependency切分Stage
  • 按照依赖顺序调度Stage,为每个Stage生成TaskSet并提交到TaskScheduler
  • 根据调度算法对多个TaskSet进行调度到Executor执行

内存管理

Executor内存主要分为两类: Storage、Execution

下图展示Executor容器的结构:

Spark-内存管理.jpg

  • Unified Memory Manager 统一管理Execution/Storage内存
  • Execution/Storage内存之间可以动态调整


Spark SQL

Spark-Spark-SQL.jpg

  • DataFrame: 以RDD为基础的分布式数据集, 被称为SchemaRDD
  • Catalyst: 对执行过程中的执行计划进行处理和优化
  • DataSource: 数据源,SparkSQL支持不同的数据源
  • Runtime Filer: 运行时过滤,在第一节SQL优化器也有提及
  • Codegen: 生成程序代码的技术或系统,可以在运行时环境中独立于生成器系统使用