一、Spark:Yarn-Cluster 与 Yarn-Client 的区别与联系

我们都知道Spark支持在yarn上运行,但是Spark on yarn有分为两种模式yarn-cluster和yarn-client,它们究竟有什么区别与联系?阅读完本文,你将了解。

Spark支持可插拔的集群管理模式(Standalone、Mesos以及YARN ),集群管理负责启动executor进程,编写Spark application 的人根本不需要知道Spark用的是什么集群管理。Spark支持的三种集群模式,这三种集群模式都由两个组件组成:master和slave。Master服务(YARN ResourceManager,Mesos master和Spark standalone master)决定哪些application可以运行,什么时候运行以及哪里去运行。而slave服务( YARN NodeManager, Mesos slave和Spark standalone slave)实际上运行executor进程。

当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器(container)运行。Spark可以使得多个Tasks在同一个容器(container)里面运行。这是个很大的优点。

注意这里和Hadoop的MapReduce作业不一样,MapReduce作业为每个Task开启不同的JVM来运行。虽然说MapReduce可以通过参数来配置。详见 mapreduce.job.jvm.numtasks。关于这个参数的介绍已经超过本篇文章的介绍。

从广义上讲,yarn-cluster适用于生产环境;而yarn-client适用于交互和调试,也就是希望快速地看到application的输出。

在我们介绍yarn-cluster和yarn-client的深层次的区别之前,我们先明白一个概念:Application Master。在YARN中,每个Application实例都有一个Application Master进程,它是Application启动的第一个容器。它负责和ResourceManager打交道,并请求资源。获取资源之后告诉NodeManager为其启动container。

从深层次的含义讲,yarn-cluster和yarn-client模式的区别其实就是Application Master进程的区别,yarn-cluster模式下,driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行。然而yarn-cluster模式不适合运行交互类型的作业。而yarn-client模式下,Application Master仅仅向YARN请求executor,client会和请求的container通信来调度他们工作,也就是说Client不能离开。看下下面的两幅图应该会明白(上图是yarn-cluster模式,下图是yarn-client模式):

图一:yarn cluste

图二:yarn client

二、Spark on YARN cluster 模式作业运行全过程分析

下面是分析Spark on YARN的Cluster模式,从用户提交作业到作业运行结束整个运行期间的过程分析。

客户端进行操作

1、根据yarnConf来初始化yarnClient,并启动yarnClient
  2、创建客户端Application,并获取Application的ID,进一步判断集群中的资源是否满足executor和ApplicationMaster申请的资源,如果不满足则抛出IllegalArgumentException;
  3、设置资源、环境变量:其中包括了设置Application的Staging目录、准备本地资源(jar文件、log4j.properties)、设置Application其中的环境变量、创建Container启动的Context等;
  4、设置Application提交的Context,包括设置应用的名字、队列、AM的申请的Container、标记该作业的类型为Spark;
  5、申请Memory,并最终通过yarnClient.submitApplication向ResourceManager提交该Application。
  当作业提交到YARN上之后,客户端就没事了,甚至在终端关掉那个进程也没事,因为整个作业运行在YARN集群上进行,运行的结果将会保存到HDFS或者日志中。

提交到YARN集群,YARN操作

1、运行ApplicationMaster的run方法;
  2、设置好相关的环境变量。
  3、创建amClient,并启动;
  4、在Spark UI启动之前设置Spark UI的AmIpFilter;
  5、在startUserClass函数专门启动了一个线程(名称为Driver的线程)来启动用户提交的Application,也就是启动了Driver。在Driver中将会初始化SparkContext;
  6、等待SparkContext初始化完成,最多等待spark.yarn.applicationMaster.waitTries次数(默认为10),如果等待了的次数超过了配置的,程序将会退出;否则用SparkContext初始化yarnAllocator;

怎么知道SparkContext初始化完成?
  其实在5步骤中启动Application的过程中会初始化SparkContext,在初始化SparkContext的时候将会创建YarnClusterScheduler,在SparkContext初始化完成的时候,会调用YarnClusterScheduler类中的postStartHook方法,而该方法会通知ApplicationMaster已经初始化好了SparkContext

7、当SparkContext、Driver初始化完成的时候,通过amClient向ResourceManager注册ApplicationMaster
  8、分配并启动Executeors。在启动Executeors之前,先要通过yarnAllocator获取到numExecutors个Container,然后在Container中启动Executeors。如果在启动Executeors的过程中失败的次数达到了maxNumExecutorFailures的次数,maxNumExecutorFailures的计算规则如下:

// Default to numExecutors * 2, with minimum of 3``private` `val` `maxNumExecutorFailures ``=` `sparkConf.getInt(` `"spark.yarn.max.executor.failures"` `,``  ` `sparkConf.getInt(` `"spark.yarn.max.worker.failures"` `, math.max(args.numExecutors *` `2` `,` `3` `)))

那么这个Application将失败,将Application Status标明为FAILED,并将关闭SparkContext。其实,启动Executeors是通过ExecutorRunnable实现的,而ExecutorRunnable内部是启动CoarseGrainedExecutorBackend的。
  9、最后,Task将在CoarseGrainedExecutorBackend里面运行,然后运行状况会通过Akka通知CoarseGrainedScheduler,直到作业运行完成。

三、Spark on YARN client 模式作业运行全过程分析

在前篇文章中我介绍了Spark on YARN集群模式(yarn-cluster)作业从提交到运行整个过程的情况(详情见《Spark on YARN集群模式作业运行全过程分析》),我们知道Spark on yarn有两种模式:yarn-cluster和yarn-client。这两种模式作业虽然都是在yarn上面运行,但是其中的运行方式很不一样,今天我就来谈谈Spark on YARN yarn-client模式作业从提交到运行的过程剖析。
  和yarn-cluster模式一样,整个程序也是通过spark-submit脚本提交的。但是yarn-client作业程序的运行不需要通过Client类来封装启动,而是直接通过反射机制调用作业的main函数。下面就来分析:
  1、通过SparkSubmit类的launch的函数直接调用作业的main函数(通过反射机制实现),如果是集群模式就会调用Client的main函数。
  2、而应用程序的main函数一定都有个SparkContent,并对其进行初始化;
  3、在SparkContent初始化中将会依次做如下的事情:设置相关的配置、注册MapOutputTracker、BlockManagerMaster、BlockManager,创建taskScheduler和dagScheduler;其中比较重要的是创建taskScheduler和dagScheduler。在创建taskScheduler的时候会根据我们传进来的master来选择Scheduler和SchedulerBackend。由于我们选择的是yarn-client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend,并将YarnClientSchedulerBackend的实例初始化YarnClientClusterScheduler,上面两个实例的获取都是通过反射机制实现的,YarnClientSchedulerBackend类是CoarseGrainedSchedulerBackend类的子类,YarnClientClusterScheduler是TaskSchedulerImpl的子类,仅仅重写了TaskSchedulerImpl中的getRackForHost方法。
  4、初始化完taskScheduler后,将创建dagScheduler,然后通过taskScheduler.start()启动taskScheduler,而在taskScheduler启动的过程中也会调用SchedulerBackend的start方法。在SchedulerBackend启动的过程中将会初始化一些参数,封装在ClientArguments中,并将封装好的ClientArguments传进Client类中,并client.runApp()方法获取Application ID。
  5、client.runApp里面的做是和前面客户端进行操作那节类似,不同的是在里面启动是ExecutorLauncher(yarn-cluster模式启动的是ApplicationMaster)。
  6、在ExecutorLauncher里面会初始化并启动amClient,然后向ApplicationMaster注册该Application。注册完之后将会等待driver的启动,当driver启动完之后,会创建一个MonitorActor对象用于和CoarseGrainedSchedulerBackend进行通信(只有事件AddWebUIFilter他们之间才通信,Task的运行状况不是通过它和CoarseGrainedSchedulerBackend通信的)。然后就是设置addAmIpFilter,当作业完成的时候,ExecutorLauncher将通过amClient设置Application的状态为FinalApplicationStatus.SUCCEEDED。
  7、分配Executors,这里面的分配逻辑和yarn-cluster里面类似,就不再说了。
  8、最后,Task将在CoarseGrainedExecutorBackend里面运行,然后运行状况会通过Akka通知CoarseGrainedScheduler,直到作业运行完成。
  9、在作业运行的时候,YarnClientSchedulerBackend会每隔1秒通过client获取到作业的运行状况,并打印出相应的运行信息,当Application的状态是FINISHED、FAILED和KILLED中的一种,那么程序将退出等待。
  10、最后有个线程会再次确认Application的状态,当Application的状态是FINISHED、FAILED和KILLED中的一种,程序就运行完成,并停止SparkContext。整个过程就结束了。

Spark on YARN cluster client 模式作业运行全过程分析相关推荐

  1. 2021年大数据Spark(九):Spark On Yarn两种模式总结

    目录 Spark On Yarn两种模式 引入 一.当一个MR应用提交运行到Hadoop YARN上时 二.当一个Spark应用提交运行在集群上时 注意 client 模式 cluster 模式 总结 ...

  2. Spark on YARN :yarn-cluster模式如何查看日志

    Spark on YARN 两种模式yarn-cluster yarn-client 一:yarn-client 在运行时是可以看到日志的 而yarn-cluster是看不懂的,那么问题来了,如何查看 ...

  3. Spark on YARN 两种模式yarn-cluster yarn-client 面试题

    Spark On YARN:目前很有前景的部署模式, 支持两种模式 1)yarn-cluster:适用于生产环境 2)yarn-client:适用于交互.调试.希望立即看到 app 的输出 Spark ...

  4. 【spark基础】之client模式下--conf读取外部文件

    P1 需求描述 在做spark程序开发的时候,我们经常会遇到需要从外部文件读入数据,进而在程序中进行解析.处理,比如以下场景: 1)读入要处理的数据: 2)为了不写死代码,将需要的数据以K.V的形式保 ...

  5. 图解Spark On Yarn cluster模式运行机制

  6. Spark深入解析(三):Spark基础解析之Spark环境搭建(不同模式)

    学习目标 Local本地模式 安装 启动spark-shell 初体验-读取本地文件 初体验-读取HDFS文件 Standalone集群模式 集群角色介绍 集群规划 修改配置并分发 启动和停止 查看w ...

  7. Spark on YARN - Clinet模式运行spark报错问题

    应用场景 安装部署完完全分布式的spark后,发现yarn-cluster模式可以运行不报错,但是yarn-client报错,无法进行计算PI的值,导致spark并不能使用,报错信息如下所示,只需要修 ...

  8. Spark Standalone -- 独立集群模式、Spark 提交任务的两种模式、spark在yarn上运行的环境搭建、自己写的spark代码如何提交到yarn上并运行...

    目录 Spark Standalone -- 独立集群模式 Standalone 架构图 Standalone 的搭建 1.上传.解压.重命名 2.配置环境变量 3.修改配置文件 conf 4.同步到 ...

  9. Spark On Yarn 运行项目

    在spark中,支持4中运行模式: Local:往往使用本地开发的时候使用. StandAlone:是spark自带的,如果一个集群是StandAlone模式的话,那么就需要在多台机器上同时部署Spa ...

最新文章

  1. 分享memcache和memcached安装过程
  2. 管理活动目录域服务实训_酒店管理专业开展酒店实训活动
  3. 2021年春季学期-信号与系统-第三次作业参考答案
  4. autowired 与 resources 注解的区别
  5. IIS配置网站定时任务必设参数图文教程
  6. what should we learn from Magnetite?
  7. [Leetcode][第315题][JAVA][计算右侧小于当前元素的个数][暴力][归并排序+索引数组]
  8. 切记!这样洗头最伤身
  9. 大学英语期末考计算机上答卷,英语期末考试总结范文(精选5篇)
  10. 【白皮书】2020中国MCN行业发展研究白皮书.pdf(附下载链接)
  11. nefu 120 梅森素数
  12. 怎么用matlab显示噪声,怎么用MATLAB产生噪声调频信号
  13. maxvalue mysql自动分区_深入解析MySQL分区(Partition)功能
  14. HTML做一个个人博客页面(纯html代码)
  15. XMPP 即时通讯协议介绍
  16. 2017年6月14日中午 java.io.IOException: Premature EOF
  17. stm32 jlink Unexceped core id found 0x00000000,excepted 0X3BA00477,MASK 0XFFFFFFFF
  18. itunes显示无法更新服务器失败怎么办啊,更新iTunes出现错误 iTunes更新失败解决方案...
  19. 告别2018:人间值得,你更值得!
  20. Photoshop辅助线和标尺的技巧

热门文章

  1. erlang精要(17)-匿名函数多子句-多个激活函数实现
  2. tensorflow随笔-读取图像文件数据(1)
  3. 最新!中国内地大学 ESI 排名出炉:362 所高校上榜!
  4. 【NLP】让AI读懂法律文书:一种基于多分类的关键句识别方法
  5. 【数据竞赛】2020首届海洋目标智能感知国际挑战赛冠军方案分享
  6. 科普:目标检测Anchor是什么?怎么科学设置?[附代码]
  7. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升|ICLR 2021
  8. 对样本不均衡一顿操作
  9. Docker文件系统实战
  10. MCtalk教育快报 | 0824