TaskScheduler作用是为创建它的SparkContext调度任务,即从DAGScheduler接受不同Stage的任务,并且向集群提交这些任务,并对未执行、特别慢的任务启动备份任务。主要由2部分组成:
- taskScheduler 任务调度:调度模式有FAIR和FIFO两种, 对应2种模式的队列存放taskset;
- SchedulerBackend: 是TaskScheduler的调度后端接口,SchedulerBackend通过主RPC通信与实际资源管理模块交互实现资源请求; SchedulerBackend的start方法,根据sparkConf创建Driver的Rpc Endpoint用于和master clustor 和excuter 做RPC通信;SchedulerBackend向当前等待分配计算资源的Task分配资源,分配完后与分配Task的Executor进行通信,在该Executor上启动Task,进行计算;该sparkcontext 对应的Executor启动之后,会将自己反向注册到该sparkcontext 的TaskScheduler上去
Spark如何让第三方资源管理系统(k8s,yarn,mesos…)轻松地接入进来?深入到类设计的层面(默认使用StandaloneSchedulerBackend):
第一张图中的RpcEnv是RPC的环境,所有的RpcEndpoint都需要注册到RpcEnv实例对象中,管理着这些注册的RpcEndpoint的生命周期:
- 根据name或者uri注册RpcEndpoint;
- 管理各种消息的处理;
- 停止RpcEndpoint
Spark RPC中最为重要的三个抽象为:RpcEnv、RpcEndpoint、RpcEndpointRef
- driver/excutor 根据RpcEndpoint的name注册到RpcEnv中并返回它的一个引用RpcEndpointRef
- RpcEndpointRef是一个对RpcEndpoint的远程引用对象,通过它可以向远程的RpcEndpoint端发送消息以进行通信
- 进行远程通信时,一般都需要一个client一个server,而RpcEndpointRef就相当于一个client的角色,服务端也就是RpcEndpoint
没有评论