3.1 Yarn 模式运行机制
3.1.1 YARN Cluster 模式
执行脚本提交任务,实际是启动一个
SparkSubmit
的 JVM 进程;SparkSubmit
类中的main
方法反射调用Client
的main
方法;Client
创建Yarn
客户端,然后向Yarn
发送执行指令:bin/java ApplicationMaster
;Yarn
框架收到指令后会在指定的NM
中启动ApplicationMaster
;ApplicationMaster
启动Driver
线程,执行用户的作业;AM
向RM
注册,申请资源;获取资源后
AM
向NM
发送指令:bin/java CoarseGrainedExecutorBacken;
ExecutorBackend
进程会接收消息,启动计算对象Executor
并跟Driver
通信,注册已经启动的Executor
;Driver
分配任务并监控任务的执行。
注意:
SparkSubmit
、ApplicationMaster
和CoarseGrainedExecutorBacken
是独立的进程;Client
和Driver
是独立的线程;Executor
是一个对象。
3.1.2 Yarn Client 模式
执行脚本提交任务,实际是启动一个
SparkSubmit
的 JVM 进程;SparkSubmit
伴生对象中的main
方法反射调用用户代码的main
方法;启动
Driver
线程,执行用户的作业,并创建ScheduleBackend
;YarnClientSchedulerBackend
向RM
发送指令:bin/java ExecutorLauncher
;Yarn
框架收到指令后会在指定的NM
中启动ExecutorLauncher
(实际上还是调用ApplicationMaster
的main
方法);object ExecutorLauncher { def main(args: Array[String]): Unit = { ApplicationMaster.main(args) } }
AM
向RM
注册,申请资源;获取资源后
AM
向NM
发送指令:bin/java CoarseGrainedExecutorBacken;
ExecutorBackend
进程会接收消息,启动计算对象Executor
并跟Driver
通信,注册已经启动的Executor
;Driver
分配任务并监控任务的执行。
注意:SparkSubmit
、ExecutorLauncher
和CoarseGrainedExecutorBacken
是独立的进程;Client
和Driver
是独立的线程;Executor
是一个对象。