零、序言
- 角色:分布式的框架(比如hdfs、yarn、zookeeper等)大多都会设计成不同的几套程序扮演不同的角色协同工作,比如最简单的master、slaver两种角色。
一、 spark on yarn
1.1 yarn
- yarn 是分布式资源管理框架,相当于分布式的操作系统,会有程序运行在上面。
涉及到以下几个角色:- RM:resource manager 资源管理者。全局只有一个,统一管理集群资源。
- NM:node mananger 节点管理者。分布在每一个节点,向RM汇报节点的信息。
yarn分配资源都是以container作为资源的分配单位,yarn的应用程序都会被装到container中去运行。每个节点可能有很多个大小不一的container都有NM控制并向RM汇报。
- Yarn 上运行的程序涉及到的角色(每个yarn程序都需要有的):
- AC: application client 。负责提交任务到yarn,监控程序运行状态。可以在不属于yarn管理的集群中的机器上运行。
- AW: application worker。分布在yarn各个container中去执行具体的工作。
- AM: application master 应用程序管理者。负责和NM交付申请container分配任务,收集结果。
1.2 spark on yarn
1.2.1 spark的结构

- Driver : 用户编写的程序的main函数就运行在driver上面,用户调用spark的api驱动driver进行工作,比如计划任务(schedule)、分发任务、收集结果等。
- Cluster Manager :只yarn、Mesos等集群管理者。
- Executor :实际执行任务的进程,运行在集群中的节点上。
上图是spark的结构,那spark on yarn 如何把spark的这一套东西运行在yarn上的呢。它有两种部署模式,client模式和cluster模式。
1.2.2 yarn client模式

- Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend;
- ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派;
- Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container);
- 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task;
- Client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
- 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己。
1.2.3 yarn cluster模式

- Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等;
- ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化;
- ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束;
- 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等;
- ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
- 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己。
pyspark
spark 是如何和python结合的呢

参考文献
http://www.it610.com/article/4021749.htm
加我信微 Zeal-Zeng 费免拉你进 知识星球、大数据社群、众公号(曾二爷) 和优秀的人一起学习
网友评论