Spark Executor原理
来源:互联网 发布:店宝宝软件可靠吗 编辑:程序博客网 时间:2024/05/22 04:30
Master发指令给Worker启动Executor。
Worker接收到Master发送来的指令通过ExecutorRunner启动另外一个进程来启动Executor。
CoarseGrainedExecutorBackend通过发送RegisterExecutor向Driver注册,Driver在Executor注册成功后会返回RegisterExecutor信息给CoarseGrainedExecutorBackend。
一:Spark Executor工作原理
1. 需要特别注意是在CoarseGrainedExecutorBackend启动时向Driver注册Executor其实质是注册ExecutorBackend实例,和Executor无关。
2.CoarseGrainedExecutorBackend是Executor运行所在的进程名称,CoarseGrainedExecutorBackend本身并不会完成具体任务的计算,Executor才会完成计算。Executor才是处理Task的对象,Executor内部是通过线程池的方式来完成Task的计算的;
3.CoarseGrainedExecutorBackend是一个进程,里面有一个Executor对象,CoarseGrainedExecutorBackend和Executor是一一对应的;
4.CoarseGrainedExecutorBackend是一个消息通信体(其实现了ThreadSafeRpcEndPoint)。可以发送消息给Driver并可以接受Driver中发过来的指令,例如启动Task等;
5. 在Driver进程有两个至关重要的Endpoint:
a) ClientEndpoint: 主要负责向Master注册当前的程序,是AppClient的内部成员;
b) DriverEndpoint:这是整个程序运行时候的驱动器,例如接收CoarseGrainedExecutorBackend的注册,是CoarseGrainedExecutorBackend的内部成员。
Executor内幕原理和运行流程解密
- CoarseGrainedExecutorBackend通过onStart()发送RegisterExecutor向Driver注册。这里面的ref也就相当于Driver。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
RegisterExecutor此时的命名是有问题的,因为向Driver端注册并不是注册Executor,而是注册ExecutorBackend.
2. Driver要接受ExecutorBackend的注册,也就是接受CoarseGrainedExecutorBackend发来的请求。在DriverEndpoint中会接收到RegisterExecutor信息并完成在Driver的注册。
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
接收到请求之后Driver是怎么办的?
在Driver中通过ExecutorData封装并注册ExecutorBackend的信息到Driver的内存数据结构executorMapData中;
- 1
- 1
为啥是ExecutorBackend?
因为CoarseGrainedExecutorBackend是继承ThreadSafeRpcEndpoint,而Executor没有继承ThreadSafeRpcEndpoint,因此在Driver接收参数里面有RpcEndpoint,肯定是CoarseGrainedExecutorBackend发过来的。与Driver通信请求注册的是CoarseGrainedExecutorBackend,并不是Executor。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
实际在执行的时候DriverEndpoint会把信息吸入CoarseGrainedSchedulerBackend的内存数据结构executorMapData,所以说最终注册给了CoarseGrainedSchedulerBackend,也就是说,CoarseGrainedSchedulerBackend掌握了当前程序分配的所有的ExecutorBackend进程,而在每个ExecutorBackend进行实例中会通过Executor对象来负责具体Task的运行。在运行的时候使用synchronized关键字来保证executorMapData安全的并发写操作。
为什么说注册信息其实给了CoarseGrainedSchedulerBackend?
executorMapData属于CoarseGrainedSchedulerBackend的成员,在注册的时候,把信息注册给CoarseGrainedSchedulerBakend的成员的数据结构中。
synchronized关键字?
因为集群中会有很多ExecutorBackend向Driver注册,为了避免写冲突,所以用同步代码块。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3 Driver会在Executor注册成功后,返回RegisteredExecutor信息给
CoarseGrainedExecutorBackend
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
4 CoarseGrainedExecutorBackend收到DriverEndpoint发送过来的RegisteredExecutor消息后会启动Executor实例对象,而Executor实例对象是事实上负责真正Task计算的;
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
其在实例化的时候会实例化一个线程池来准备Task的计算。
- 1
- 2
- 3
- 1
- 2
- 3
5 创建的threadPool中以多线程并发执行和线程复用的方式来高效的执行Spark发过来的Task。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
现在线程池准备好了,那么就等任务了。
6. 当Driver发送过来Task的时候,其实是发送给了CoarseGrainedExecutorBackend这个RpcEndpoint,而不是直接发送给了Executor(Executor由于不是消息消息循环体,所以永远也无法直接接受远程发过来的信息);attemptNumber executor可以重试的次数.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ExecutorBackend在收到Driver中发送过来的消息后会提供调用LaunchTask来交给Executor去执行;
LaunchTask来执行任务,接收到Task执行的命令之后,会首先把Task封装在TaskRunner里面,然后交给线程池中的线程处理。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
7 TaskRunner是Java中的Runnable的接口的具体实现,在真正工作的时候会交给线程池中的线程去运行,此时会调用Run方法来执行Task。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
8 TaskRunner在调用run方法的时候会调用Task的run方法,而Task的run方法会调用runTask。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
Task的run方法:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 1
- 2
总结流程图如下:
- Spark Executor原理
- 32 Spark中的Executor工作原理
- Spark-executor
- Spark Executor
- spark executor
- Spark executor.memory
- Spark Executor 长时间空闲
- Spark Executor on YARN
- spark core 2.0 Executor
- spark executor内幕解密
- Spark维护Executor列表
- Spark EXecutor彻底解密
- spark动态分配executor
- spark中executor执行Driver发送的task,放入线程池中执行原理
- juc.Executor实现原理
- jmx监控spark executor配置
- spark中的动态executor分配
- spark core 2.0 Executor ClassLoader
- 详解基于java的Socket聊天程序——服务端(附demo)
- mysql编译安装MySQL5.5.32
- 数据库表查询优化
- iOS中button 的图片和文字的位置
- magento paypal your session has timed out. please try again
- Spark Executor原理
- [python3教程]第六章.模块(Modules)
- 1022. Digital Library 解析
- 服务化框架技术选型实践
- Java中格式化字符串方法总结
- JQuery环境配置
- 基于dubbo框架下的RPC通讯协议性能测试
- 欢迎使用CSDN-markdown编辑器
- 使用多边形绘制图像(MATLAB)