运行在YARN上的Spark程序的Executor,Cores和Memory的分配

原文网址: https://www.jianshu.com/p/3716ade93b02

Hadoop/Yarn/OS 守护进程
当利用一个集群管理器(比如YARN)运行spark程序时,存在一些守护进程运行在后台,比如NameNode,Secondary NameNode,DataNode,JobTracker和TaskTracker。因此,当确定num-executor时,我们需要确保有足够的cores(大约每个节点一个core)维持这些守护进程的平稳运行。

Yarn ApplicationMaster (AM)
ApplicationMaster的职责是:向ResourceManager协商资源,与NodeManager一同执行并监控containner及其资源消耗。如果程序运行在Spark-On-Yarn,我们需要预留一些资源给ApplicationMaster,AM大约需要1024MB的内存和一个Executor。

HDFS吞吐
HDFS客户端会遇到大量并发线程的问题。 据观察,HDFS当达到全写入吞吐量时,需要每个executor执行约5个任务。 因此,最好控制每个executor中core的数目低于那个数字。

内存开销

Full memory requested to yarn per executor =
spark-executor-memory + spark.yarn.executor.memoryOverhead
spark.yarn.executor.memoryOverhead =
Max(384MB, 7% of spark.executor-memory)

所以,如果我们申请了每个executor的内存为20G时,对我们而言,AM将实际得到20G+ memoryOverhead = 20 + 7% * 20GB = ~23G内存。
执行拥有太多内存的executor会产生过多的垃圾回收延迟
执行过小的executor(举例而言,一个只有一核和仅仅足够内存跑一个task的executor),将会丢失在单个JVM中运行多任务的好处。

第一种方案:Tiny executors [每个Executor一个Core]

Tiny executors表示一个executor配置一个core。下表描述了该方案下的参数配置。

  • ‘–num-executors’ = ‘该方案下,每个executor配置一个core’
    = ‘集群中的core的总数’
    = ‘每个节点的core数目 * 集群中的节点数’
    = 16 x 10 = 160
  • ‘–executor-cores’ = 1 (每个executor一个core)
  • ‘–executor-memory’ = ‘每个executor的内存’
    = ‘每个节点的内存/每个节点的executor数目’
    = 64GB/16 = 4GB

分析:当一个executor只有一个core时,正如我们上面分析的,我们可能不能发挥在单个JVM上运行多任务的优势。此外,共享/缓存变量(如广播变量和累加器)将复制到节点的每个core,这里是16次。并且,我们没有为Hadoop / Yarn守护进程留下足够的内存开销,我们也没有计入ApplicationManager。因此,这不是一个好的方案!

第二种方案:Fat executors (每个节点一个Executor):

Fat executors表示一个executor独占一个节点。下表描述了该方案下的参数配置:

  • --num-executors = 该方案下,一个executor独占一个节点
    = 集群中的节点的数目
    = 10
  • --executor-cores = 一个节点一个executor意味着每个executor独占节点中所 有的cores
    = 节点中的core的数目
    = 16
  • --executor-memory = 每个executor的内存
    = 节点的内存/节点中executor的数目
    = 64GB/1 = 64GB

分析:每个executor独占16个核心,则ApplicationManager和守护程序进程则无法分配到core,并且,HDFS吞吐量会受到影响,导致过多的垃圾结果。 同样地,该方案不好!

第三种方案:Balance between Fat (vs) Tiny

根据上面讨论的建议:

基于上述的建议,我们给每个executor分配5个core => – executor-cores = 5 (保证良好的HDFS吞吐)
每个节点留一个core给Hadoop/Yarn守护进程 => 每个节点可用的core的数目 = 16 - 1
所以,集群中总共可用的core的数目是 15 * 10 = 150
可用的executor的数目 = (总的可用的core的数目 / 每个executor的core的数目)= 150 / 5 = 30
留一个executor给ApplicationManager => --num-executors = 29
每个节点的executor的数目 = 30 / 10 = 3
每个executor的内存 = 64GB / 3 = 21GB
计算堆开销 = 7% * 21GB = 3GB。因此,实际的 --executor-memory = 21 - 3 = 18GB

因此,推荐的配置如下:29 executors, 18GB memory each and 5 cores
each !
分析:很明显,第三种方案在Fat vs Tiny 两种方案中找到了合适的平衡点。毋庸置疑,它实现了Fat executor的并行性和Tiny executor的最佳吞吐量!

结论:

我们看到:

当为spark程序配置运行参数的时候,应谨记一些推荐事项:
1.为Yarn的Application Manager预留资源
2.我们应该如何为Hadoop / Yarn / OS deamon进程节省一些cores
3.学习关于spark-yarn-memory-usage
另外,检查并分析了配置这些参数的三种不同方法:
1.Tiny Executors - 每个executor配置一个core
2.Fat Executors - 每个executor独占一个节点
3.推荐方案 - 基于建议项的Tiny(Vs)Fat的合适的平衡。

–num-executors, --executor-cores and --executor-memory…这三个参数在spark性能中扮演很重要的角色,他们控制这你的spark程序获得的CPU和内存的资源。对于用户来说,很有必要理解如何去配置它们。希望这篇博客对你有帮助。

作者:phusFuNs
链接:https://www.jianshu.com/p/3716ade93b02
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值