Executor是Spark中执行任务的进程,它能被不同的调度模式所调度,例如Standalone、Mesos、Yarn。本章主要讲解Standalone调度模式下的Executor,在Standalone调度模式下的Executor中,有一个RPC(Remote Procedure Call)远程过程调用接口的引用,Spark 1.6.x版本中,该RPC接口有两种不同的实现,分别是Akka和Netty,目前默认使用Netty框架实现这个PRC接口,当然也可以通过spark.rpc配置项指定RPC接口的实现框架,Executor正是通过该RPC接口和Driver通信的。为了让大家从整体上了解Spark中Executor的启动过程,给出如图5-1所示的时序图。
图5-1 Executor启动时序图(www.xing528.com)
使用spark-submit提交程序到集群,Master会接收到RequestSubmitDriver请求,之后将会调用schedule方法把Driver程序发送到Worker结点上运行。当Driver程序在一个线程中运行起来后,SparkContext得到初始化,之后会创建TaskScheduler和TaskSchedulerBackend(Standalone模式下)。在启动TaskSchedulerBackend时创建AppClient,AppClient是一个Ac-tor,在其peStart方法中向Master注册。Master收到RegisterApplication注册请求后,完成Application的注册,同时调用schedule方法,向Worker结点发送LaunchExecutor请求,满足请求的Worker结点启动线程运行ExecutorRunner,在ExecutorRunner中启动CoarseGrainedEx-ecutorBackend,在CoarseGrainedExecutorBackend中创建Executor,并完成向Driver的注册。
Executor中存在一个线程池,该线程池是缓存线程池(CachedThreadPool),其特点是如果线程池长度超过处理需要,池中有空闲线程,可灵活回收空闲线程;若不能满足任务处理,则新建线程。任务被分发到Executor并以TaskRunner的形式运行于线程池中的线程之上。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。