这是我参与「第四届青训营 」笔记创作活动的第5天
Spark原理
Apache Spark 是专为 大规模数据处理 而设计的快速通用的计算引擎。
Spark Core
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容器的结构:
- Unified Memory Manager 统一管理Execution/Storage内存
- Execution/Storage内存之间可以动态调整
Spark SQL
- DataFrame: 以RDD为基础的分布式数据集, 被称为SchemaRDD
- Catalyst: 对执行过程中的执行计划进行处理和优化
- DataSource: 数据源,SparkSQL支持不同的数据源
- Runtime Filer: 运行时过滤,在第一节SQL优化器也有提及
- Codegen: 生成程序代码的技术或系统,可以在运行时环境中独立于生成器系统使用