spark executor内幕解密
来源:互联网 发布:php开源考试系统 编辑:程序博客网 时间:2024/05/18 01:51
一:Spark Executor工作原理
1, 需要特别注意是在CoarseGrainedExecutorBackend启动时向Driver注册Executor其实质是注册ExecutorBackend实例,和Executor实例之间没有直接的关系!!!
2, CoarseGrainedExecutorBackend是Executor运行所在的进程名称,Executor才是正在处理Task的对象,Executor内部是通过线程池的方式来完成Task的计算的;
3, CoarseGrainedExecutorBackend和Executor是一一对应的;
4, CoarseGrainedExecutorBackend是一个消息通信体(其具体实现了ThreadSafeRPCEndpoint),可以发送信息给Driver并可以接受Driver中发过来的指令,例如启动Task等;
5, 在Driver进程有两个至关重要的Endpoint:
a) ClientEndpoint:主要负责向Master注册当前的程序,是AppClient的内部成员;
b) DriverEndpoint:这是整个程序运行时候的驱动器,是CoarseGrainedExecutorBackend的内部成员;
6, 在Driver中通过ExecutorData封装并注册ExecutorBackend的信息到Driver的内存数据结构executorMapData中:
private[cluster]class ExecutorData(
valexecutorEndpoint: RpcEndpointRef,
valexecutorAddress: RpcAddress,
override valexecutorHost: String,
varfreeCores: Int,
override valtotalCores: Int,
override vallogUrlMap: Map[String,String]
) extendsExecutorInfo(executorHost,totalCores,logUrlMap)
7, 实际在执行的时候DriverEndpoint会把信息吸入CoarseGrainedSchedulerBackend的内存数据结构executorMapData,所以说最终是注册给了CoarseGrainedSchedulerBackend,也就是说CoarseGrainedSchedulerBackend掌握了为当前程序分配的所有的ExecutorBackend进程,而在每一个ExecutorBackend进行实例中会通过Executor对象来负责具体Task的运行。在运行的时候使用synchronized关键字来保证executorMapData安全的并发写操作。
8, CoarseGrainedExecutorBackend收到DriverEndpoint发送过来的RegisteredExecutor消息后会启动Executor实例对象,而Executor实例对象是事实上负责真正Task计算的;
二:Executor具体是如何工作的?
1, 当Driver发送过来Task的时候,其实是发送给了CoarseGrainedExecutorBackend这个RpcEndpoint,而不是直接发送给了Executor(Executor由于不是消息循环体,所以永远也无法直接接受远程发过来的信息);
caseLaunchTask(data) =>
if(executor== null) {
logError("Received LaunchTask command but executor was null")
System.exit(1)
} else{
valtaskDesc = ser.deserialize[TaskDescription](data.value)
logInfo("Got assigned task "+ taskDesc.taskId)
executor.launchTask(this,taskId = taskDesc.taskId,attemptNumber = taskDesc.attemptNumber,
taskDesc.name,taskDesc.serializedTask)
}
2, ExecutorBackend在收到Driver中发送过来的消息后会提供调用launchTask来交给Executor去执行:
caseLaunchTask(data) =>
if(executor== null) {
logError("Received LaunchTask command but executor was null")
System.exit(1)
} else{
valtaskDesc = ser.deserialize[TaskDescription](data.value)
logInfo("Got assigned task "+ taskDesc.taskId)
executor.launchTask(this,taskId = taskDesc.taskId,attemptNumber = taskDesc.attemptNumber,
taskDesc.name,taskDesc.serializedTask)
}
3,
- spark executor内幕解密
- 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
- 第33课: Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
- Spark EXecutor彻底解密
- 大数据IMF传奇行动绝密课程第33课:Spark Executor内幕彻底解密
- 第26课: Spark Runtime(Driver、Masster、Worker、Executor)内幕解密
- Spark RunTime内幕解密
- Spark Broadcast内幕解密
- spark Runtime内幕解密
- spark Broadcast 内幕解密
- Spark Shuffle内幕解密
- Spark技术内幕:Executor分配详解
- Spark技术内幕:Executor分配详解
- Spark技术内幕:Executor分配详解
- 解析Spark Executor内幕,详解CoarseGrainedExecutorBackend
- Spark 2.0内幕深度解密
- spark shuffle 内幕彻底解密
- Spark技术内幕: Task向Executor提交的源码解析
- 不常见但是很有用的 gcc 命令行选项发布啦!
- java.text.SimpleDateFormat的用法
- TreeList获取TreeListNode绑定的数据
- 一次简单的解密
- C++ 注释风格(实例)
- spark executor内幕解密
- JS实现图片的预览及预览图片的宽高获取
- 微信登录
- Uri详解之——Uri结构与代码提取
- nvdimm 新的内存
- 搭建java开发环境
- Linux以外的7种开源操作系统
- JDBC那些事(三)——PreparedStatement预编译对象
- Python零基础入门十九之爬虫基础知识