1 spark on yarn常用属性介绍

属性名 默认值 属性说明
spark.yarn.am.memory 512m 在客户端模式(client mode)下,yarn应用master使用的内存数。在集群模式(cluster mode)下,使用spark.driver.memory代替。
spark.driver.cores 1 在集群模式(cluster mode)下,driver程序使用的核数。在集群模式(cluster mode)下,driver程序和master运行在同一个jvm中,所以master控制这个核数。在客户端模式(client mode)下,使用spark.yarn.am.cores控制master使用的核。
spark.yarn.am.cores 1 在客户端模式(client mode)下,yarn应用的master使用的核数。在集群模式下,使用spark.driver.cores代替。
spark.yarn.am.waitTime 100ms 在集群模式(cluster mode)下,yarn应用master等待SparkContext初始化的时间。在客户端模式(client mode)下,master等待driver连接到它的时间。
spark.yarn.submit.file.replication 3 文件上传到hdfs上去的replication次数
spark.yarn.preserve.staging.files false 设置为true时,在job结束时,保留staged文件;否则删掉这些文件。
spark.yarn.scheduler.heartbeat.interval-ms 3000 Spark应用masteryarn resourcemanager之间的心跳间隔
spark.yarn.scheduler.initial-allocation.interval 200ms 当存在挂起的容器分配请求时,spark应用master发送心跳给resourcemanager的间隔时间。它的大小不能大于spark.yarn.scheduler.heartbeat.interval-ms,如果挂起的请求还存在,那么这个时间加倍,直到到达spark.yarn.scheduler.heartbeat.interval-ms大小。
spark.yarn.max.executor.failures numExecutors * 2,并且不小于3 在失败应用程序之前,executor失败的最大次数。
spark.executor.instances 2 Executors的个数。这个配置和spark.dynamicAllocation.enabled不兼容。当同时配置这两个配置时,动态分配关闭,spark.executor.instances被使用
spark.yarn.executor.memoryOverhead executorMemory * 0.10,并且不小于384m 每个executor分配的堆外内存。
spark.yarn.driver.memoryOverhead driverMemory * 0.10,并且不小于384m 在集群模式下,每个driver分配的堆外内存。
spark.yarn.am.memoryOverhead AM memory * 0.10,并且不小于384m 在客户端模式下,每个driver分配的堆外内存
spark.yarn.am.port 随机 Yarn 应用master监听的端口。
spark.yarn.queue default 应用提交的yarn队列的名称
spark.yarn.jar none Jar文件存放的地方。默认情况下,spark jar安装在本地,但是jar也可以放在hdfs上,其他机器也可以共享。

2 客户端模式和集群模式的区别

  这里我们要区分一下什么是客户端模式(client mode),什么是集群模式(cluster mode)。

  我们知道,当在YARN上运行Spark作业时,每个Spark executor作为一个YARN容器(container)运行。Spark可以使得多个Tasks在同一个容器(container)里面运行。 yarn-clusteryarn-client模式的区别其实就是Application Master进程的区别,在yarn-cluster模式下,driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行。然而yarn-cluster模式不适合运行交互类型的作业。 在yarn-client模式下,Application Master仅仅向YARN请求executorclient会和请求的container通信来调度他们工作,也就是说Client不能离开。下面的图形象表示了两者的区别。

2.1 Spark on YARN集群模式分析

2.1.1 客户端操作

  • 1、根据yarnConf来初始化yarnClient,并启动yarnClient

  • 2、创建客户端Application,并获取ApplicationID,进一步判断集群中的资源是否满足executorApplicationMaster申请的资源,如果不满足则抛出IllegalArgumentException

  • 3、设置资源、环境变量:其中包括了设置ApplicationStaging目录、准备本地资源(jar文件、log4j.properties)、设置Application其中的环境变量、创建Container启动的Context等;

  • 4、设置Application提交的Context,包括设置应用的名字、队列、AM的申请的Container、标记该作业的类型为Spark

  • 5、申请Memory,并最终通过yarnClient.submitApplicationResourceManager提交该Application

  当作业提交到YARN上之后,客户端就没事了,甚至在终端关掉那个进程也没事,因为整个作业运行在YARN集群上进行,运行的结果将会保存到HDFS或者日志中。

2.1.2 提交到YARN集群,YARN操作

  • 1、运行ApplicationMasterrun方法;

  • 2、设置好相关的环境变量。

  • 3、创建amClient,并启动;

  • 4、在Spark UI启动之前设置Spark UIAmIpFilter

  • 5、在startUserClass函数专门启动了一个线程(名称为Driver的线程)来启动用户提交的Application,也就是启动了Driver。在Driver中将会初始化SparkContext

  • 6、等待SparkContext初始化完成,最多等待spark.yarn.applicationMaster.waitTries次数(默认为10),如果等待了的次数超过了配置的,程序将会退出;否则用SparkContext初始化yarnAllocator

  • 7、当SparkContext、Driver初始化完成的时候,通过amClientResourceManager注册ApplicationMaster;

  • 8、分配并启动Executeors。在启动Executeors之前,先要通过yarnAllocator获取到numExecutorsContainer,然后在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,直到作业运行完成。

2.2 Spark on YARN客户端模式分析

  和yarn-cluster模式一样,整个程序也是通过spark-submit脚本提交的。但是yarn-client作业程序的运行不需要通过Client类来封装启动,而是直接通过反射机制调用作业的main函数。下面是流程。

  • 1、通过SparkSubmit类的launch的函数直接调用作业的main函数(通过反射机制实现),如果是集群模式就会调用Clientmain函数。

  • 2、而应用程序的main函数一定都有个SparkContent,并对其进行初始化;

  • 3、在SparkContent初始化中将会依次做如下的事情:设置相关的配置、注册MapOutputTracker、BlockManagerMaster、BlockManager,创建taskSchedulerdagScheduler

  • 4、初始化完taskScheduler后,将创建dagScheduler,然后通过taskScheduler.start()启动taskScheduler,而在taskScheduler启动的过程中也会调用SchedulerBackendstart方法。 在SchedulerBackend启动的过程中将会初始化一些参数,封装在ClientArguments中,并将封装好的ClientArguments传进Client类中,并client.runApp()方法获取Application ID

  • 5、client.runApp里面的做的和上章客户端进行操作那节类似,不同的是在里面启动是ExecutorLauncheryarn-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、FAILEDKILLED中的一种,那么程序将退出等待。

  • 10、最后有个线程会再次确认Application的状态,当Application的状态是FINISHED、FAILEDKILLED中的一种,程序就运行完成,并停止SparkContext。整个过程就结束了。

3 spark submit 和 spark shell参数介绍

参数名 格式 参数说明
--master MASTER_URL 如spark://host:port
--deploy-mode DEPLOY_MODE Client或者master,默认是client
--class CLASS_NAME 应用程序的主类
--name NAME 应用程序的名称
--jars JARS 逗号分隔的本地jar包,包含在driver和executor的classpath下
--packages   包含在driver和executor的classpath下的jar包逗号分隔的”groupId:artifactId:version”列表
--exclude-packages   用逗号分隔的”groupId:artifactId”列表
--repositories   逗号分隔的远程仓库
--py-files PY_FILES 逗号分隔的”.zip”,”.egg”或者“.py”文件,这些文件放在python app的PYTHONPATH下面
--files FILES 逗号分隔的文件,这些文件放在每个executor的工作目录下面
--conf PROP=VALUE 固定的spark配置属性
--properties-file FILE 加载额外属性的文件
--driver-memory MEM Driver内存,默认1G
--driver-java-options   传给driver的额外的Java选项
--driver-library-path   传给driver的额外的库路径
--driver-class-path   传给driver的额外的类路径
--executor-memory MEM 每个executor的内存,默认是1G
--proxy-user NAME 模拟提交应用程序的用户
--driver-cores NUM Driver的核数,默认是1。这个参数仅仅在standalone集群deploy模式下使用
--supervise   Driver失败时,重启driver。在mesos或者standalone下使用
--verbose   打印debug信息
--total-executor-cores NUM 所有executor总共的核数。仅仅在mesos或者standalone下使用
--executor-core NUM 每个executor的核数。在yarn或者standalone下使用
--driver-cores NUM Driver的核数,默认是1。在yarn集群模式下使用
--queue QUEUE_NAME 队列名称。在yarn下使用
--num-executors NUM 启动的executor数量。默认为2。在yarn下使用

  你可以通过spark-submit --help或者spark-shell --help来查看这些参数。

参考文献

【1】Spark:Yarn-cluster和Yarn-client区别与联系

【2】Spark on YARN客户端模式作业运行全过程分析

【3】Spark on YARN集群模式作业运行全过程分析

spark优化系列一:参数介绍的更多相关文章

  1. mysql性能优化学习笔记-参数介绍及优化建议

    MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...

  2. php-fpm优化参数介绍

    1.php-fpm优化参数介绍他们分别是:pm.pm.max_children.pm.start_servers.pm.min_spare_servers.pm.max_spare_servers. ...

  3. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  4. SSE图像算法优化系列二十三: 基于value-and-criterion structure 系列滤波器(如Kuwahara,MLV,MCV滤波器)的优化。

    基于value-and-criterion structure方式的实现的滤波器在原理上其实比较简单,感觉下面论文中得一段话已经描述的比较清晰了,直接贴英文吧,感觉翻译过来反而失去了原始的韵味了. T ...

  5. SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度

      2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...

  6. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  7. MySQL 数据库性能优化之缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  8. Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手

    图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...

  9. JVM性能优化系列-(1) Java内存区域

    1. Java内存区域 1.1 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.主要包括:程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运 ...

随机推荐

  1. GitLab 数据自动备份

    gitlab自动备份 周期性计划任务: crontab -e * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create service crond ...

  2. Excel-怎样实现行列转置

    有时候,我们为了某些需要,必须把工作表的行列进行转置的方式显示.重新输入很浪费时间,怎样简单的实现转置呢,强大的excel2007提供了此项功能,具体怎么做,下面看我来演示一下. 工具/原料   装有 ...

  3. IOS 多媒体 使用总结

    一.音频播放 1.音效播放(短时间的音频文件)1> AudioServicesCreateSystemSoundID2> AudioServicesPlaySystemSound 2.音乐 ...

  4. 2019.03.19 ZJOI2019模拟赛 解题报告

    得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...

  5. HDU 1853 MCMF

    题意:给定一个有向带权图,使得每一个点都在一个环上,而且权之和最小. 分析:每个点在一个环上,入度 = 出度 = 1,拆点入点,出点,s到所有入点全部满载的最小费用MCMF; #include < ...

  6. Bokeh 学习

    这段时间由于在做K-means对文本进行处理,需要进行绘图,实验室编程大哥向我介绍了Bokeh来进行绘图,一直是根据自己的需求来进行对其探索,今儿个看到一篇博文,对Bokeh进行了详细的解说,做个笔记 ...

  7. POJ 3764 The xor-longest Path 【01字典树&&求路径最大异或和&&YY】

    题目传送门:http://poj.org/problem?id=3764 The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K ...

  8. [18/11/22] 将点分十进制的IP地址化成二进制输出

    #include <stdio.h> void binary(int d){ ,j,n,b[]={}; ){ n=d%; d=d/; b[i++]=n; //不停的除2,余数保存在b[8] ...

  9. java线程池系列(1)-ThreadPoolExecutor实现原理

    前言 做java开发的,一般都避免不了要面对java线程池技术,像tomcat之类的容器天然就支持多线程. 即使是做偏后端技术,如处理一些消息,执行一些计算任务,也经常需要用到线程池技术. 鉴于线程池 ...

  10. java多线程(简单介绍)

    简单介绍 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来 ...