这次讲的是Executor,啥是Executor呢?Executor是干什么的?
当我们在生产环境中提交spark作业时,用spark-submit shell脚本里,往往需要指定一个参数:–num-executors,你可以指定为3,5。。。这难道是随便指定的?爱设多少就设多少?很显然,答案是no,首先你得根据你集群的资源情况来设定。那我们就有必要来弄清楚这个是什么。Executor是Worker节点上的进程,用来执行程序任务的。咳咳,注意了,下面开始画今天的重点:
1.怎么启动Executor进程的;
2.Executor是怎么进行任务调度的。
首先,来个概览图,以下我们讲的都是
Standalone模式。1.CoarseGrainedExecutorBackend线程起来后会向driver发RegisteredExecutor消息,告诉driver我这边即将要起Executor进程啦,好让driver上有记录在哪个worker上起了Executor进程;driver注册成功后,会返回RegisteredExecutor消息,告诉说你可以起Executor了;
2.CoarseGrainedExecutorBackend线程接受到RegisteredExecutor消息,就会创建executor对象;
3.Driver内taskScheduler会向CoarseGrainedExecutorBackend线程发送lauchTask消息,就是调用executor的lauchTask方法启动一个TaskRunner线程,这个就是更细粒度的,其实真正执行任务的就是这些线程啦;
4.然后每来一个task就从线程池里拿出一个线程运行。
可以先稍微整理一下,感兴趣的可以继续往下看,从源码角度一步步跟踪下去。