1. ApplicationMaster
// 启动进程
-- main
-- new ApplicationMasterArguments(args):参数对象的封装
// 创建应用管理器对象
-- new ApplicationMaster(amArgs, new YarnRMClient)
// 运行
-- master.run
// Cluster的时候走runDriver方法
-- runDriver
// 启动用户应用
-- startUserApplication
// 获取用户应用的类的main方法
-- userClassLoader.loadClass(args.userClass).getMethod("main", classOf[Array[String]])
args.userClass:就是spark-submit 中的--class的参数
// 启动Driver线程,执行用户类的main方法,
-- new Thread().start()
// 注册AM
-- registerAM(建立与yarn之间的关系) applicationMaster是一个进程,resourceManager也是一个进程,能过rpc进行交互
// 获取yarn资源
-- client.register
// 分配资源
-- allocator.allocateResources()
-- handleAllocatedContainers(处理可分配的资源)
-- runAllocatedContainers(运行可能资源的容器)
-- new ExecutorRunnable().run:(启动executor)
-- startContainer
// command = bin/java org.apache.spark.executor.CoarseGrainedExecutorBackend
-- prepareCommand:向nameManager发送指令