文章目录
1.YARN产生背景
生产中spark作业几乎都是跑在yarn上,不用Standalone,因为集群中可能有MR、Spark、MPI等各类作业,若跑在各自的资源调度框架上,那么整体集群的资源利用率肯定是有问题的。
为了统一作业调度以及资源管理,yarn就诞生了,当前YARN能支持所有主流作业的资源管理和作业调度(batch、交互式、online、strem、in-memory、机器学习、图计算等框架),它是一个操作系统级别的资源管理和调度框架

2.YARN的架构
- 角色:RM、NM、AM、Container。
- 每个juese的职责以及重试(作业挂了)机制这里不过描述
- YARN的通用执行架构流程如下图

3.Spark on Yarn概述
Spark on yarn模式下,spark仅仅是一个客户端而已,生产中只需要在有gateway权限机器上直接解压部署spark即可,非常的方便。

- MR:在MR作业中每个MAP和REDUCE的task都是一个进程,当task完成后该进程就会注销,任务基于进程,频繁开启进程关闭进程,降低速度
- Spark:Spark中一个Executor进程会跑多个task,该进程会在整个 Application的生命周期存活,即使没有作业运行 ,任务基于线程,内部是线程池,没有,启动和关闭的开销,速度非常快
- Cluster Manager: spark作业启动时driver program会通CM去向Local、Standaone、YARN、Mesos、K8s等资源调度器申请资源,故向哪些资源调度申请的模块一定是pluggable(可插拔)。
- YARN Application:使用yarn框架进行的计算作业,第一启动的容器一定跑的是AM
- Worker node:spark作业运行在yarn环境下是没有Worker node概念,因为spark的executor运行在container内(故container的memory和vcore配置一定要大于executor的设置)
5.Spark on Yarn架构
官网文档:http://spark.apache.org/docs/latest/running-on-yarn.html
5.1 Deploy Mode on YARN的两种模式
client:默认的部署模式,driver跑在提交作业的机器上,此时AM仅仅是做资源请求用的,客户端是不能关闭的。
cluster:driver跑在集群上,driver具体是运行在AM进程中,当应用程序起来后,提交作业的客户端是可以关闭的
故spark on yarn的spark作业的driver program不一定跑在AM中
5.2spark on yarn代码测试
可以通过spark-shell测试,但是spark-shell不能测试集群部署模式
第一步:通过export HADOOP_CONF_DIR=xx or export YARN_CONF_DIR=XX 的配置hadoop配置文件目录
第二:运行环境改为: --master yarn
运行异常,上yarn上查询日志信息如下:
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/spark/util/MutableURLClassLoader : Unsupported major.minor version 52.0
可是我的jdk环境已经是1.8算是较为新的了,头大??
可能是内存不够,加大内存,重启hadoop后,发现 RM没有可用的节点,报local-dirs are bad:错误 ,通过检查,发现磁盘空间超过90%,故删除部分文件,重启yarn即可,此时yarn可用,继续解决spark on yarn运行错误。
通过查找资料,才明白原来spark 运行时会有spark程序 运行的jdk环境, 和本地的jdk1.8没任何关系。 我不知道为啥我这台spark指向的jdk1.7环境。配置后重新运行如下脚本
spark-shell --master yarn --deploy-mode client \
--conf "spark.executorEnv.JAVA_HOME=/usr/java/jdk1.8.0_45" \
--conf "spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8.0_45" \
作业资源计算:

3个container:1个AM容器+2个Executor容器 ,spark on yarn下默认Executor数是2
3个vcore:AM和Executor默认vcore都是1,故总共3个vcore
5120M(5G):? 个人认为是3G
扩展:可通过yarn logs -applicationId 命令查询yarn上作业日,
5.2spark properties
Spark Properties default
spark.yarn.am.memory 512m
spark.yarn.am.cores 1
spark.yarn.max.executor.failures numExecutors * 2, with minimum of 3(二者最小值) executor执行多少次失败算程序失败
spark.yarn.jars none (重要且有用)配置spark的相关jars在hdfs上的位置,如果不配置,每次启动会上传到hdfs,非常耗时间的
spark.yarn.archive none (重要且有用)配置spark的相关配置文件在hdfs上的位置,如果不配置,每次启动会上传到hdfs,非常耗时间的
spark.yarn.queue default 默认使用默认的队列
6.Understanding closures
将要作用到RDD上的操作,不管它们是一个函数还是一段代码片段,它们都是“闭包”,Spark会把这个闭包副本分发到各个worker节点上去执行,但是diver端不会变,即所有executor以及diver的闭包结果互不影响。但是local模式有些区别,是和diver共享的。
spark on yarn总结:
1、driver 跑在local还是cluster有deploy mode决定
2、spark建议driver跑在集群上,但是跑在本地更有利于我们观察日志(我们无法知道集群上的driver跑在哪儿),当然我们可以通过yarn logs -applicationId查询作业运行日志
2、如果driver运行在local,AM仅仅只requesting resource;如果运行在cluster,AM不仅是requesting resource同时也负责job schedule,

6680

被折叠的 条评论
为什么被折叠?



