这是我参加【第四届青训营】笔记创作活动的第3天
Spark原理 | 青训营笔记
一、Spark概述
1.1.什么是Spark
是基于内存的快速、通用、可扩展的大数据处理引擎
1.2 Spark生态
Spark Core
实现Spark基本功能,包括任务调度,内存管理,错误恢复,与存储系统交互等模块,还包括RDD的API定义
Spark SQL
用来操作结构化数据的程序包,通过Spark SQL,我们可以使用SQL或者Hive来查询数据。Spark SQL支持多种数据源,比如Hive,Parque及JSON
Spark Streaming
实时数据进行流式计算的组件,提供用来操作数据流的API
Spark MLib
提供常见的机器学习功能的程序库,包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能
集群管理
Spark 设计为高效地在一个到数千个计算节点之间进行伸缩计算,为了实现这样的要求,同时获得最大灵活性,支持各种集群资源管理器,包括HADOOP YARN,Meso,及Spark自带独立调度器
二、RDD
2.1 什么是RDD
概念
弹性分布式数据集,是Spark最基本的数据抽象,是更适合分布式计算和并行计算的模型
RDD特点 分区
2.2 两类算子
Transform算法:生成一个新的RDD
Action算法:触发Job提交
2.3 RDD依赖
概念:描述父子RDD之间的依赖关系
窄依赖:父RDD的每个partition至多对应一个子RDD之间依赖关系
宽依赖:父RDD的每个partition可能对应多个子RDD之间依赖关系
三、 Spark运行机制
2.1 Spark工作流程
(1)任何一个Spark应用程序都包含driver代码和execute代码。Spark应用程序首先在driver初始化SparkContext。因为SparkContext是spark应用程序通往集群的唯一路径,在SparkContext包含DAGSheduler和TaskScheduler两个调度器类。在创建SparkContext对象的同时自动创建了这两个类。
(2)SparkContext初始化完成以后,首先根据Spark的相关配置,向Cluster Manager申请所需资源,然后在各个Worker节点初始化相应的Executor。Executor初始化完成以后,Driver将通过对Spark应用程序中的RDD进行解析,生成相应的RDD graph,该图描述了RDD之间的依赖关系。
3)RDD图构建完毕以后,Driver将提交给DAGScheduler进行解析。DAGScheduler在解析RDD图的过程中,当遇到Action算子的时候将进行逆向解析,根据RDD之间的依赖关系以及是否存在Shuffle等,将Job解析成一系列具有先后依赖关系的Stage。
(4)DAGScheduler将划分的一系列的Stage按照先后顺序依次提交给底层的调度器TaskScheduler去执行。
(5)TaskScheduler接收到来自DAGScheduler的stage以后,将会在集群环境中构建一个TaskSetManager实例来管理Stage(TaskSet)的生命周期。
(6)TaskSetManager将会将相关的计算代码、数据资源文件等发送到相应的Executor上,并在相应的Executor上启动线程池执行。TaskSetManager在执行的过程之中,使用了一些优化的算法,用于提高执行的效率,譬如根据数据本地性决定每个Task的最佳位置、推测执行碰到Straggle任务需要放到别的结点上重试、出现Shuffle输出数据丢失时要报告fetch failed错误等机制。
(7)在Task的执行过程中,可能有部分应用程序涉及到I/O的输入输出,在每个Executor由相应的BlockManager进行管理,相关BlockManager的信息将会与Driver中的Block tracker进行交互和同步。
(8)在Task Threads执行的过程中,如果存在运行错误、或其他影响的问题导致失败,TaskSetManager将会默认尝试3次,尝试均失败以后将上报TaskScheduler, TaskSche duler如果解决不了,再上报DAGScheduler,DAGScheduler将根据各个Worker节点 的运行情况重新提交到别的Executor中执行。
(9)Task Threads执行完成以后,将把执行的结果反馈给TaskSetManager,TaskSetManager反馈给TaskScheduler,TaskScheduler反馈给DAGScheduler,DAGScheduler将根据是否还存在待执行的Stage,将继续循环迭代提交给TaskScheduler去执行。
(10)待所有的Stage都执行完成以后,将会最终达到应用程序的目标,或者输出到文件、或者在屏幕上显示等,Driver的本次运行过程结束,等待用户的其他指令或者关闭。
(11)在用户显式关闭SparkContext后,整个运行过程结束,相应的资源被释放或回收。