Spark简介
Spark Streaming基于Spark Core实现了可扩展、高吞吐和容错的实时数据流处理。现在支持的数据源有Kafka、Flume、Twitter、ZeroMQ、Kinesis、HDFS、S3和TCP socket。处理后的结果可以存储到HDFS、Database或者Dashboard中。
Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark,也就是把Spark Streaming的输入数据按照批处理尺寸(如1秒)分成一段一段的数据(Stream),每一段数据都转换成Spark中的RDD,然后将SparkStreaming中对DStream的转换操作变为针对Spark中对RDD的转换操作,将RDD经过操作变成中间结果保存在内存中。
Spark架构
Application:Spark应用程序
指的是用户编写的Spark应用程序,包含Driver功能代码和分布在集群中多个节点上运行的Executor代码。Spark应用程序,由一个或多个作业Job组成。
Driver Program:驱动程序
Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。
在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。
通常SparkContext代表Driver。
Cluster Manager:资源管理器
集群资源管理中心,负责分配计算资源。
常用的有:
- Local,Spark单机运行,一般用于开发测试;
- Standalone,Spark原生的资源管理器,由Master负责资源的分配;
- Hadoop Yarn,由Yarn中的ResearchManager负责资源的分配;由Messos中的Messos Master负责资源管理。
Worker Note:计算节点
工作节点,负责完成具体计算。
Executor:执行器
Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor
举例类比
- 概念类比
- Cluster Manager在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器负责分配资源,有点像YARN中ResourceManager那个角色,大管家握有所有的干活的资源,属于乙方的总包。
- WorkerNode是可以干活的节点,听大管家ClusterManager差遣,是真正有资源干活的主。从节点,负责控制计算节点,启动Executor或者Driver。
- Executor是在WorkerNode上起的一个进程,相当于一个包工头,负责准备Task环境和执行
- Task,负责内存和磁盘的使用。Task是施工项目里的每一个具体的任务。
- Driver是统管Task的产生与发送给Executor的,运行Application 的main()函数,是甲方的司令员。
- SparkContext是与ClusterManager打交道的,负责给钱申请资源的,是甲方的接口人。
- 交互流程
- 甲方来了个项目,创建了SparkContext,SparkContext去找ClusterManager申请资源同时给出报价,需要多少CPU和内存等资源。ClusterManager去找WorkerNode并启动Excutor,并介绍Excutor给Driver认识。
- Driver根据施工图拆分一批批的Task,将Task送给Executor去执行。
- Executor接收到Task后准备Task运行时依赖并执行,并将执行结果返回给Driver
- Driver会根据返回回来的Task状态不断的指挥下一步工作,直到所有Task执行结束。
Spark工作流程
基础概念
1. Job:作业
由一个或多个调度阶段所组成的一次计算作业;包含多个Task组成的并行计算,往往由Spark Action催生,一个Job包含多个RDD及作用于相应RDD上的各种Operation。
2. Stage:调度阶段
一个任务对应的阶段;
每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;
Satge分成两种类型ShuffleMapStage、ResultStage。
一个stage的所有Task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。下一个stage的Task的输入数据就是上一个stage输出的中间结果。如此循环往复,直到将我们自己编写的代码逻辑全部执行完,并且计算完所有的数据,得到我们想要的结果为止。
3. TaskSet:任务集
由一组关联的,但相互之间没有Shuffle依赖关系的任务所组成的任务集。
1) 一个Stage创建一个TaskSet;
2) 为Stage的每个RDD分区创建一个Task,多个Task分装成TaskSet。
4. Task:任务
被送到某个Executor上的工作任务;单个分区数据集上的最小处理流程单元。
Task也是最小的计算单元,一个TaskSet中的Task负责执行一模一样的计算逻辑(也就是我们自己编写的某个代码片段),只是每个Task处理的数据不同而已
Spark运行流程
- 创建作业(Job):使用spark-submit提交一个Spark作业。
- 启动驱动程序(Driver Program),同时也是创建一个SparkContext
- SparkContext在资源管理器(Cluster Manager)中注册,并申请运行所需的资源(也就是执行器(Executor))
- 资源管理器(Cluster Manager)分配并启动Excutor
- SparkContext构建DAG图
- SparkContext中的DAGScheduler根据DAG图将Job分解成Stage
- TaskScheduler为每个Stage创建一批任务,形成TaskSet
- Executor向SparkContext申请执行的Task
- TaskScheduler将Task发放给Executor,同时SparkContext将应用程序代码发放给Executor
参考资料
- Spark原理篇之工作原理-CSDN
- Spark工作原理-CSDN
- 30分钟理解Spark的基本原理-知乎
- Spark 学习: spark 原理简述 - 知乎 (zhihu.com)
- Spark原理篇之工作原理-CSDN博客
- 张安站,Spark技术内幕:深入解析Spark内核架构设计与实现原理[N].机械工业出版社,2015