温馨提示
本节主要来理解以下五个组件,是怎么相互连接,并配合起来实现我们的Spark应用程序的运行架构原理。
1、Driver
2、Master
3、Worker
4、Executor
5、Task
Driver是一个进程,我们提交编写好的Spark程序就是在Driver上,由Driver进程执行,充当Driver的可能是Spark集群的某个节点、也有可能是你提交Spark程序的机器,这个需要取决于你的Spark运行模式,他是有不一样的。也就是说我们在哪台机器提交运行程序,Spark将会使用它充当Driver角色。
在某些公司正式集群是有专门的提交程序运行的机器,有的也是直接拿集群的Master节点来充当Driver运行程序,也有选举集群某个节点来充当Driver节点。
Master,它也是一个进程,我们可以在搭建好的集群通过最简单的命令jps来查看我们已经运行了哪些进程。Master主要是负责资源的调度和分配,还有集群的监控等职责。
Worker,也是一个进程,主要是负责有,一是用自己的内存,存储RDD的某些partition数据;另一个是启动其他进程和线程,来对RDD上的partition进行运行的处理和计算
Executor,也是一个进程,在一个Executor进程里面会有多个task线程。这里的Executor和task就主要负责执行对RDD的partition进行并行的计算,也就是执行我们队RDD算子,如map、flatMap、reduceByKey等。
Task,是一个线程,主要是负责实际的执行算子任务。
每个组件进行简单介绍后,那这些组件是如何相互调用配合来完成运行一个Spark应用程序呢,结合下图进行直观讲解。
这里我们通过搭建最小测试集群来分析Spark运行架构原理,这里我们有3个节点,1个master、2个worker节点。机器的选举主从节点,是可以在搭建环境的时候,配置文件里面指定机器为Master,还是Worter节点。
A,每当Driver进程被启动之后,都会做哪些事情来初始化操作呢?首先它将发送请求到Master上,进行Spark应用程序的注册,也就是我们要让Master知道,现在有一个新的Spark应用程序要运行了。
B,那Master在接收到Spark应用程序的注册申请之后,会发送给Worker,让其进行资源的调度和分配。这也说明资源分配是由executor来分配管理。
C,Worter接收Master的请求之后,会为Spark应用启动Executor,来给分配资源。
D,Executor启动分配资源好后,就会向Driver进行反注册,这也Driver就会知道哪些Executor是为他进行服务的了。
E,当Driver得到注册了Executor之后,就可以开启正式执行我们的spark应用程序了。首先第一步,就是创建初始RDD,读取数据源,再执行之后的一系列算子。HDFS文件内容被读取到多个worker节点上,形成内存中的分布式数据集,也就是初始RDD 。
F,这时候,Driver就会根据Job任务中的算子形成对应的task,最后提交给Executor,来分配task进行计算的线程。
G,这时的task就会去调用对应自己任务的数据(也就是第一步初始化RDD的partition)来计算,并且task会对调用过来的RDD的partition数据执行指定的算子操作,形成新的RDD的partition,这时一个大的循环就结束了。
后面新的RDD的partition数据又通过Driver形成新一批task提交给Executor执行,循环这个操作,直到所有算子执行结束。
这时候我们回顾前几节的原理分析和WordCount程序运行原理,结合到本节的Spark运行原理中来就会感觉更进一步的理解Spark整体架构了。
希望对你我他有用
有不足之处请多多指教
欢迎留言评论!!!
欢迎关注大数据之谜
领取专属 10元无门槛券
私享最新 技术干货