本篇内容介绍了“Spark on yarn执行流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
很多公司都是通过Yarn来进行调度,mapreduce on yarn、spark on yarn、甚至storm on yarn。
Yarn集群分成两种节点:
Spark on yarn执行流程
我们写的spark程序,打成jar包,用spark-submit来提交。jar包中的一个main类,通过jvm的命令启动起来。JVM进程,这个进程,其实就是咱们的Driver进程。Driver进程启动起来以后,执行我们自己写的main函数,从new SparkContext()。。。
在客户端给我们启动一个driver
去ResourceManager申请启动container(资源)
通知一个NodeManager在container里面启动ApplicationMaster
ApplicationMaster去找ResourceManager申请Executor
ResourceManager返回可以启动的NodeManager的地址
ApplicationMaster去找NodeManager启动Executor
Executor进程会反过来去向Driver注册上去
最后Driver接收到了Executor资源之后就可以去进行我们spark代码的执行了
执行到某个action就触发一个JOB
DAGScheduler会划分JOB为一个个Stage
TaskScheduler会划分Stage为一个个Task
Task发送到Executor执行
Driver就来进行Task的调度
Application-Master???
yarn中的核心概念,任何要在yarn上启动的作业类型(mr、spark),都必须有一个。每种计算框架(mr、spark),如果想要在yarn上执行自己的计算应用,那么就必须自己实现和提供一个ApplicationMaster相当于是实现了yarn提供的接口,spark自己开发的一个类
spark在yarn-client模式下,application的注册(executor的申请)和计算task的调度,是分离开来的。standalone模式下,这两个操作都是driver负责的。
ApplicationMaster(ExecutorLauncher)负责executor的申请;driver负责job和stage的划分,以及task的创建、分配和调度
yarn-client模式下,会产生什么样的问题呢?
由于咱们的driver是启动在本地机器的,而且driver是全权负责所有的任务的调度的,也就是说要跟yarn集群上运行的多个executor进行频繁的通信(中间有task的启动消息、task的执行统计消息、task的运行状态、shuffle的输出结果)。
咱们来想象一下。比如你的executor有100个,stage有10个,task有1000个。每个stage运行的时候,都有1000个task提交到executor上面去运行,平均每个executor有10个task。接下来问题来了,driver要频繁地跟executor上运行的1000个task进行通信。通信消息特别多,通信的频率特别高。运行完一个stage,接着运行下一个stage,又是频繁的通信。
在整个spark运行的生命周期内,都会频繁的去进行通信和调度。所有这一切通信和调度都是从你的本地机器上发出去的,和接收到的。这是最要人命的地方。你的本地机器,很可能在30分钟内(spark作业运行的周期内),进行频繁大量的网络通信。那么此时,你的本地机器的网络通信负载是非常非常高的。会导致你的本地机器的网卡流量会激增!!!
你的本地机器的网卡流量激增,当然不是一件好事了。因为在一些大的公司里面,对每台机器的使用情况,都是有监控的。不会允许单个机器出现耗费大量网络带宽等等这种资源的情况。运维人员不会允许。可能对公司的网络,或者其他(你的机器还是一台虚拟机),如果你是一台虚拟机的话,和其他机器共享网卡的话,可能对其他机器,公司整个网络环境,都会有负面和恶劣的影响。
解决的方法:
“Spark on yarn执行流程是怎样的”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注天达云网站,小编将为大家输出更多高质量的实用文章!