今天做的一个梦,梦回大一结束,回高中复读高三,一年下来不思进取做题也是飘的,甚至看不懂题说的意思。高考后,没有上本科分数线,专科是不会去读的。决定继续补习,闲暇时,会有点后悔放弃了985学历回来复读,最后如此结局。梦醒06:38
关键角色
- client:将应用提交的角色,Linux系统中通常执行提交脚本(Spark-submit.sh)的端
- driver:客户端启动driver,由driver向ResourceManager申请启动ApplicationMaster,且driver负责DAG(有向无环图)的运行规划。
根据运行模式的不同,driver启动在不同的节点
yarn-cluster模式,driver启动在ApplicationMaster所在节点上;
yarn-client模式,driver启动在client所在节点,且driver日志直接会输出到启动终端 - Application Master:这个应用运行的管理者,包括所使用资源的申请
- executor:实际的工作执行者,运行在container中
- Resource Manager:资源管理者,负责调度及分配管理所有可用资源
- container:实际的资源容器(由memory和vcore组成)
关键流程
client 提交 submit application
-
执行 main 函数
运行的进程是 Driver,此进程在创建 SparkContext 时会创建 DAGScheduler,创建 TaskScheduler
-
执行ing,遇到 Transform 则记录,直到遇到 Action。
调度 SparkContext.runjob 生成一个新的 job
经过一系列调度,调度到 DAGScheduler.handleJobSubmitted(...) 生成 ResultStage(当前 job 的 FinalStage,这一过程遍历获得该 Stage 的所有父 Stage,遇到 ShuffleMapStage 则递归调用 new ShuffleMapStage() 在内部继续遍历父 Stage,直到没有父 Stage,生成 StageId 从左到右从大到小,这一过程生成了 DAG),创建成功则提交这个 Stage,在 SubmitStage 中,递归调用SubmitStage,先提交 ParentStage 最后提交自己。补充 lineage 机制: each RDD remembers how it was built from other datasets (by transformations like map, join or groupBy) to rebuild itself.
每个 Stage 生成一组 Tasks,TaskScheduler 调用 SubmitTasks 提交 TaskSet(Tasks),在 SubmitTasks(TaskSet) 内部由 SchedulerBackend 完成 Tasks 申请并把 Tasks 分配给 executor。由 TaskScheduler 完成 tasks 和 executor 的资源分配,executor 执行真正的计算任务。