spark资源分配
作者:互联网
Spark的资源主要分为两点:memory,cpu core,涉及到的参数主要有以下6个:
spark.executor.instances / —-num-executors
表示启动多少个executor来运行该作业。
spark.executor.cores / —executor.cores
在默认参数spark.task.cpus设置为1时,该参数的值表示在同一个executor里,最多允许多少个task可同时并发运行。
spark.driver.memory / —-driver-memory
表示驱动进程(Drive端)允许使用的内存空间
spark.executor.memory / —-executor-memory
表示每一个executor进程允许使用的内存空间
spark.shuffle.memoryFraction / —conf spark.shuffle.memoryFraction=
表示在shuffle阶段,用于聚合规约数据时,可使用Java堆内存的比例
spark.storage.memoryFraction / —conf spark.storage.memoryFraction=
表示用于spark缓存数据时,可使用Java堆内存的比例
- spark.executor.cores && spark.executor.instances
在Spark on Yarn架构下,这两个值的乘积(spark.executor.cores * spark.executor.instances)决定了Spark App的并发度。
提高并发度,可以使集群同时执行更多的任务;因此当task数一定时,可减少轮询次数。
比如一个Stage有200个task,当并发度为50时,执行这个作业需要轮询4次;当并发度为100时,仅需要轮询2次。
对于并发度(参数乘积)的设置,需要结合队列资源,期望Spark App运行时间,及App每轮Stage的task数决定。
并发度 spark.executor.cores * spark.executor.instances 不可超过队列的最大分配cpu核数。当请求超过最大值,由于频繁的向集群申请资源,反而降低了App的执行效率。
在保证不影响其他App使用队列资源的前提下,可适当提高并发。但当task数量低于并发度,将存在一部分core空间,导致资源浪费。经验值:
当task数很大(千以上级别),建议可设置并发度为队列最大分配cpu核数的1/2或者1/3,避免影响其他作业。
当task数较小时,评估每个task执行时间,在期望运行时间内,可降低并发度,增加轮询次数,减少资源使用。
在并发度过低的情况下,由于同一个executor要处理的task过多,容易造成shuffle阶段reduce过多从同一个executor拉取数据,造成节点响应延时,甚至引发节点失去连接的问题,使得App运行失败。
在保证相同并发量,和内存充足的情况下,可根据作业类型调整core和instance的分配:
作业为IO密集型:若core值较大,容易引起同一个executor的网络IO负载过重,因此建议将core调小;
作业存在大量静态对象,或使用boardcast变量广播数据:由于task序列化及boardcast的分发粒度为executor,且分发过程类似于pipeline的方式,若core值较大,同样的并发下,executor instance减少,则减少分发次数,一定程度上减少task调度执行的时间(申请减少executor,即资源申请,有利于加快task的调度),因此建议将core调大,但最大core值应该小于8:Spark on Yarn:内存分布#
- spark.driver.memory
美团没有单独的spark集群,spark部署在Yarn之上。因此提及driver.memory参数,不得不提到的spark on Yarn的两种模式:
yarn-cluster: 适合运行在生产环境。Spark Driver运行在由Yarn管理的AppMaster进程中,由AM负责将集群申请资源,并监督作业运行状态。Client在完成作业的提交后,并可关掉,不影响作业在集群的运行。Client日志仅显示Job的运行状况,没有详细日志。
yarn-client: 适合交互和调试。在此模式下,Spark Driver运行在Client端,负责与运行executor的container通信,而AppMaster仅负责向集群申请资源。Client端Spark-submit进程被kill,则运行在集群上的作业将被kill。
使用yarn-cluster模式运行,程序代码中应该避免使用collect、take、show等将执行结果返回drive的API,这些结果将打印在driver的日志,本地Client也不可见。所以,此模式下,driver仅用于作业的提交,spark默认配置driver memory 为512M。下图为cluster模式下,driver的资源使用情况(配额10G):
使用yarn-client模式运行,若强需直接看到application返回到driver端的输出,一般不建议使用。此模式下,driver memory主要受返回数据大小的影响,视作业具体情况而定。下图为client模式下,driver的资源使用情况(配额10G,无结果返回driver操作):
标签:task,memory,driver,并发,executor,spark,资源分配 来源: https://blog.csdn.net/qq_18219755/article/details/91348731