Spark 执行基本原理(一切的核心)

最近在负责Spark Streaming 结合 Spark Sql的相关项目,语言是Java,留下一些笔记,也供大家参考,如有错误,请指教!

执行逻辑:

jar -> Application -> Driver -> Worker -> Executor -> Task


通过SparkSubmit提交job后,Client就开始构建spark context,即 application 的运行环境(使用本地的Client类的main函数来创建spark context并初始化它)

yarn client提交任务,Driver在客户端本地运行;yarn cluster提交任务的时候,Driver是运行在集群上

SparkContext连接到ClusterManager(Master),向资源管理器注册并申请运行Executor的资源(内核和内存)

**Master**根据SparkContext提出的申请,根据worker的心跳报告,来决定到底在那个worker上启动executor

Worker节点收到请求后会启动executor

executor向SparkContext注册,这样driver就知道哪些executor运行该应用

SparkContext将Application代码发送给executor(如果是standalone模式就是StandaloneExecutorBackend)

同时SparkContext解析Application代码,构建DAG图,提交给DAGScheduler进行分解成stage,stage被发送到TaskScheduler

TaskScheduler负责将Task分配到相应的worker上,最后提交给executor执行

executor会建立Executor线程池,开始执行Task,并向SparkContext汇报,直到所有的task执行完成

所有Task完成后,SparkContext向Master注销




基本概念:

Application =>Spark的应用程序,包含一个Driver program和若干Executor

SparkContext => Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor

Driver Program => 运行Application的main()函数并且创建SparkContext

Executor => 是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executor来处理任务

Cluster Manager =>在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn)

Worker Node => 集群中任何可以运行Application代码的节点,运行一个或多个Executor进程

Task => 运行在Executor上的工作单元

Job => SparkContext提交的具体Action操作,常和Action对应

Stage => 每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet

RDD => 是Resilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类

DAGScheduler => 根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler

TaskScheduler => 将Taskset提交给Worker node集群运行并返回结果

Transformations => 是Spark API的一种类型,Transformation返回值还是一个RDD,所有的Transformation采用的都是懒策略,如果只是将Transformation提交是不会执行计算的

Action => 是Spark API的一种类型,Action返回值不是一个RDD,而是一个scala集合;计算只有在Action被提交的时候计算才被触发。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容