概述
spark on yarn 的优势是每个Spark executor作为一个Yarn容器(container)运行,Spark可以使得多个Task在同一个容器(container)里面运行;有两种模式:yarn-client和yarn-cluster
- yarn-client:driver运行在client端;适用于调式,能直接看到各种日志;连接断了,任务就挂了
- driver运行在am中;日志需要登录到某个节点才能看到;client断开,任务不受影响,继续运行
Spark on Yarn的优势
- Spark支持动态资源共享,运行于Yarn的框架都共享一个集中配置好的资源池
- 可以很方便的利用Yarn的资源调度特性来做分类·,隔离以及优先级控制负载,拥有更灵活的调度策略
- Yarn可以自由地选择executor数量
- .Yarn是唯一支持Spark安全的集群管理器,使用Yarn,Spark可以运行于Kerberized Hadoop之上,在它们进程之间进行安全认证
名词解释
- Application:Application是指用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码(1 Diver + n Executor)
- Driver:Application的main函数并且创建SparkContext;当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver
- Executor:某个Application运行在worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存到内存或磁盘
- Worker:集群中任何可以运行Application的代码节点,Spark on yarn就是NodeManager
- Task:被送到某个Executor上的工作单元,即最小执行单元,也就是map…
- Job:包含多个Task组成的并行计算,由Spark Action触发,一个Application中会产生多个Job,一个job包含了多个stage
- Stage:每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方
Job=多个stage,Stage=多个同种task, Task分为ShuffleMapTask和ResultTask,Dependency分为ShuffleDependency和NarrowDependency
Spark On Yarn注意事项
确保环境变量配置HADOOP_CONF_DIR or YARN_CONF_DIR,也就是需要访问到/etc/hadoop目录,否则报错如下
提交Job命令如下
spark-submit \
--class com.feidata.bigdata.SparkWC \
--name wc \
--master yarn \
--deploy-mode client \
--jars /home/hadoop/lib/feidata-spark-utils-1.0.jar \
/home/hadoop/lib/feidata-spark-core-1.0.jar \
/wordcount /wordcount/output
yarn-client的工作流程步骤为
- Driver运行在Client
- AM职责就是去YARN上申请资源
- Driver会和请求到的container/executor进行通信
- Driver是不能退出的
- 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申请注销并关闭自己
因为是与Client端通信,所以Client不能关闭。
客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和executor,另外ApplicationMaster和executor都 是装载在container里运行,container默认的内存是1G,ApplicationMaster分配的内存是driver- memory,executor分配的内存是executor-memory。同时,因为Driver在客户端,所以程序的运行结果可以在客户端显 示,Driver以进程名为SparkSubmit的形式存在。
yarn-cluster的工作流程步骤为
- Driver运行位置在AM
- Client提交上去了 它退出对整个作业没影响
- AM(申请资源)+Driver(调度DAG,分发任务)
执行过程:
- Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等
- ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化
- ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束
- 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,而Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark
Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等 - ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
- 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己
Yarn Client和Yarn cluster关于网卡流量激增以及无法看日志的问题,需要综合选择
具体参考:https://www.cnblogs.com/ITtangtang/p/7967386.html