Spark on YARN 笔记

来源:互联网 发布:网络博客游戏怎么举报 编辑:程序博客网 时间:2024/06/05 04:37

一直对hadoop这套局限在会用就好,没有对hadoop生态有个系统性的深入了解,也就导致在用的时候出问题很难找到关键的原因,都得google so 各种找相关信息。所以现在觉得,还是得花一些时间,至少把与平时用到的相关部分的原理、概念理解清楚。

只要是用hadoop生态的组件,很多都会用YARN来管理资源与任务分配。而资源分配的合理与否,直接关系到任务的执行效率,甚至决定成功或失败。spark又是现在主流的大数据计算框架,所以就把理解清楚yarn的架构以及spark与yarn的结合作为学习的起始点吧。

YARN的架构

YARN是(Yet Another Resource Negotiator,另一种资源协调者)的缩写。主要用来管理分布式集群的资源,理解YARN主要得理解4个抽象的组件。ResourceManager、ApplicationMaster、NodeManager与Container。

ResourceManager:可以理解为整个分布式集群的主管,负责管理整个集群的资源分配。

ApplicationMaster:一个集群中可以运行有多个应用,可以是map reduce, 可以是spark应用等,只要是适用YARN做资源分配的每一个应用都会有一个ApplicationMaster,它负责向ResourceManager申请资源,以及与NodeManager协调执行具体的任务。

NodeManager:作为ResourceManager的slave(worker),启动container,管理资源以及向ResourceManager汇报资源使用情况。

Container:一个包含内存、CPU、网络、磁盘,以后可能还有GPU资源的容器。每个容器圈定了物理机器上的一部分资源,再把它们分配给运行在容器里的进程,每个容器可以运行多个进程,这些参数都是可配置的。所以也可以把容器看做一个实际执行计算任务的虚拟机。

下面这张图清晰的反映了YARN的架构,以及各组件间是如何协调工作的。

YARN_Architect

这幅图中有两个client提交了各自的应用程序,紫色应用程序的ApplicationMaster运行在第一个节点上,棕色应用程序的ApplicationMaster则被分配在第二个节点上。它们都向ResourceManager申请资源,ResourceManager则为紫色应用程序分配了一个位于第二个节点上的Container,为棕色应用程序分配了位于第一个与第三个节点上共3个Container。Container与对应的ApplicationMaster通信汇报任务状态,ApplicationMaster再与ResourceManager通信。NodeManager管理Container的启动与回收,同时向ResourceManager汇报状态。

Spark 架构

Spark_cluster

spark集群的架构如上图所示,driver program就是运行用户逻辑代码的程序,并维护spark运行时的context,以及处理与cluster manager的通信,请求资源来运行spark应用。

cluster manager顾名思义就是集群管理员,管理整个集群的资源分配。

worker node就是集群的slave,它们是实际运行executor的物理机器。一个worker上可以启动多个executor,每个executor有固定量可配置的资源,其实就是一个JVM。

spark会根据driver program中的逻辑代码生成一个执行若干action与transformation操作的DAG,然后把DAG分解成若干stage,再分解成若干task。driver根据具体的task向cluster manager申请资源,cluster manager与worker node通信确定可用的闲置资源,然后把worker node的信息告诉driver。driver再将需要执行的操作以及对应的闭包(具体方法代码)序列化后传给worker node,然后worker node选择合适的executor去执行这些task。

Spark on YARN

了解了YARN的架构以及spark集群的架构之后,就可以了解spark在YARN上是如何运行的。

client mode

根据deployment mode的不同有两种形式,一种是client一种是cluster, 先上图, client mode的架构如下图所示。

spark_yarn_client

在这里Spark Driver的角色与spark架构中的Driver Program的角色是一致的,且Spark Driver运行在客户端,它的资源使用与YARN没有关系。YARN为Spark起的Application Master与YARN ResourceManager共同扮演spark架构中的Cluster Manager的角色。AM向RM申请资源,RM将空闲节点的信息反馈给AM,AM再与NodeManager通信,让NodeManager来启动executor。spark的worker node在YARN中的对应是Container,假如YARN管理的集群有3台服务器,但是每台服务器可以启动很多Container,所以对应到spark的概念中就是这个spark集群有很多worker node而不仅仅是3个。

cluster mode

cluster mode的架构如下图所示
spark_yarn_cluster

其实不管client mode还是cluster mode,实际的job都是在集群上执行的。唯一的区别就是driver program在集群上还是在客户端。从cluster mode的架构图可以看出,Spark Driver与ApplicationMaster都是运行在YARN分配的容器中,这对于client不是集群的机器,而是远程机器是有好处的,可以减少很多数据传输的时间。并且client在提交完任务之后,stdout的信息是RUNNING的时候,断开也不会影响任务的执行。

client mode还是cluster mode没有绝对的好坏,看实际情况而定。对于client在远程的,建议选用cluster mode。对于client就是集群的某台机器的情况,可以使用client mode,因为这样在客户端就可以看到任务的运行情况,比如使用airflow做调度系统的时候,使用client mode在airflow的web页面上直接就可以看到总体的日志,而不用登录ApplicationMaster的Web UI查看。

选用mode的方式可以在提交任务的时候通过参数--deploy-mode来指定。

原创粉丝点击