Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

本课主题

  • Spark Executor 工作原理图
  • ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕
  • Executor 具体是如何工作的

Spark Executor 工作原理图

  • 第一步:Master 发指令给 Worker 启动 Executor;
  • 第二步:Worker 接收到 Master 发送过来的指令通过 ExecutorRunner 远程启动另外一个线程来运行 Executor;
  • 第三步:通过发送 RegisterExecutor 向 Driver 注册 Executor,这个时侯Worker 会启动另外一个进程来向 Driver 发送注册的信息,思考题:为什么要多开一个新进程而不在原有的 Worker 进程里发送信息给 Driver 呢?因为Worker 主要是管理当前机器上的资源的,而当前机器上的资源有变动的时候需要汇报给 Master,Worker 不是用来计算的,所以不可以在 Worker 里做计算;而且,在 Spark 中可能有很多不同的的应用程序,有很多应用程序你就需要有很多 Executor,如果你不是为每个 Executor 启动一个进程的话,这会导致当一个程序崩溃时,其他程序也会崩溃。

    需要特别注意的是在 CoarseGrainedExecutorBackend 启动时向 Driver 注册 Executor 其实质上是注册 ExecutorBackend 实例,和 Executor 实例之间没有直接关系! CoarseGrainedExecutorBackend 是 Executor 运行所在的进程名称,Executor 才是真正处理 Task 的对象Executor 内部是通过线程池的方式来完成 Task 的计算的,CoarseGrainedExecutorBackend 和 Executor 是一对一的关系


    CoarseGrainedExecutorBackend 是一个消息通信体(其实现了 (ThreadSafeRpcEndPoint) ,可以发送信息给 Driver 并可以接受 Driver 中发过来的指令,例如启动 Task 等。

  • 第四步:在 DriverEndpoint 中会接受到 RegisterExecutor 信息并完成在 Driver 上的注册,其实际是注册给 CoarseGrainedSchedulerBackend



    在 Driver 进程中有两个至关重要的 Endpoint: (注册的内幕源码可以参考Spark天堂之门解密)
    1) ClientEndpoint: 主要负责向 Master 注册当前的程序,是 AppClient 的内部成员;

    2) DriverEndpoint: 这是整个程序运行时候的驱动器,是CoraseGraninedSchedulerBackend 的内部成员。
  • 在 Driver 中通过 ExecutorData 封装并注册 ExecutorBackend 的信息到 Driver 的内存数据结构 executorMapData 中:
  • 实际在执行的时候DriverEndpoint 会把信息写下CoarseGraninedSchedulerBackend 的内存数据结构executorMapData 中,所以说最终是注册给了CoarseGraninedSchedulerBackend,也就是说CoarseGraninedSchedulerBackend 掌握了为当前程序分配的所有的ExecutorBackend 进程,而每一个ExecutorBackend 进程实例中会通过Executor对象来负责具体Task 的运行。
  • 在运行的时候使用 synchronised 关键字来保证 executorMapData 安全的并发写操作。

ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕

  1. CoarseGrainedExecutorBackend 收到 DriverEndpoint (CoraseGrainedSchedulerBackend) 发送过来的 RegisteredExecutor 消息后会启动 Executor 实例对象,而 Executor 实例对象是事实上负责真正的 Task 的计算的;


  2. Executor在实例化的时候会实例化一个线程池来准备 Task 的计算的。

Executor 具体是如何工作的

  1. 当 Driver 发送过来 Task 的时候,其实是发送给了 CoarseGrainedExecutorBackend 这个 RpcEndpoint ,而不是直接发送给了 Executor (Executor 由于不是消息循环体,所以永远也无法直接接受远程发过来的信息);
  2. ExecutorBackend 在收到 Driver 中发送过来的消息后会通过调用 LaunchTask 来交给 Executor 去执行:

  3. 创建的 threadPool 中以多线程并发执行和线程复用的方式来高效的执行 Spark 发过来的 Task,接收到 Task 执行的命令后,会首先把 Task 封装在 TaskRunner 里面,TaskRunner 其实是 Java 中的 Runnerable 接口的具体的实现,在真正工作的时候会交给线程池中的线池去运行,此时会调用 run 方法来执行 task,TaskRunner 在调用 run 方法的时候会调用 Task run方法,而 Task 的 run 方法会调用 runTask, 而实际 Task 有 ShuffleMapTask 和 ResultTask;

[总结部份]

更新中......

原文地址:https://www.cnblogs.com/sky-sql/p/9079004.html

时间: 2024-08-28 14:24:45

Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕的相关文章

Spark Streaming发行版笔记14:updateStateByKey和mapWithState源码解密

本篇从二个方面进行源码分析: 一.updateStateByKey解密 二.mapWithState解密 通过对Spark研究角度来研究jvm.分布式.图计算.架构设计.软件工程思想,可以学到很多东西. 进行黑名单动态生成和过滤例子中会用到updateStateByKey方法,此方法在DStream类中没有定义,需要在 DStream的object区域通过隐式转换来找,如下面的代码: object DStream {   // `toPairDStreamFunctions` was in Sp

第93课:Spark Streaming updateStateByKey案例实战和内幕源码解密

本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战二.Spark Streaming updateStateByKey源码解密 第一部分: updateStateByKey的主要功能是随着时间的流逝,在Spark Streaming中可以为每一个可以通过CheckPoint来维护一份state状态,通过更新函数对该key的状态不断更新:对每一个新批次的数据(batch)而言,Spark Streaming通过使用updateStateByKey

第88课:Spark Streaming从Flume Pull数据案例实战及内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Pulling from Flume实战 二.Spark Streaming on Pulling from Flume源码解析 先简单介绍下Flume的两种模式:推模式(Flume push to Spark Streaming)和 拉模式(Spark Streaming pull from Flume ) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以连接,就将数据push过去.(简单,耦

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

第85讲:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

MyBatis 源码分析——SqlSession接口和Executor类

mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用.可以说SqlSession接口实例是开发过程中打交道最多的一个类.即是DefaultSqlSession类.如果笔者记得没有错的话,早期是没有什么getMapper方法的.增删改查各志有对应的方法进行操作.虽然现在改进了很多,但是也保留了很多.我们依旧可以看到类似于selectList这样子的方法.源码的例子里面就可以找到.如下 SqlSession session = sqlMapper.openSession(T

站在源码的肩膀上全解Scroller工作机制

站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05

第88课:Spark Streaming从Flume Poll数据案例实战和内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Polling from Flume实战 二.Spark Streaming on Polling from Flume源码 第一部分: 推模式(Flume push SparkStreaming) VS 拉模式(SparkStreaming poll Flume) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以链接,就将数据push过去.(简单,耦合要低),缺点是SparkStreaming

mybatis源码解析9---执行器Executor解析

从前面分析我们知道了sql的具体执行是通过调用SqlSession接口的对应的方法去执行的,而SqlSession最终都是通过调用了自己的Executor对象的query和update去执行的.本文就分析下sql的执行器-----Executor Executor是mybatis的sql执行器,SqlSession是面向程序的,而Executor则就是面向数据库的,先看下Executor接口的方法有哪些,源码如下: 1 public interface Executor { 2 3 Result