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

好久没更新了,。。。太懒了。

在跑Spark-On-Yarn程序的时候,往往会对几个参数(num-executors,executor-cores,executor-memory等)理解很模糊,从而凭感觉地去指定值,这是不符合有追求程序员信仰的。因此,搞懂它们,很有必要。
本文翻译自https://spoddutur.github.io/spark-notes/distribution_of_executors_cores_and_memory_for_spark_application.html

译文如下:

是否曾经想要知道如何根据你的集群,配置这些Spark运行参数:--num-executors, --executor-memory and --execuor-cores 呢?

探究思路

  1. 理论引导:首先,有必要了解一些重要建议,能帮助我们更好地理解它;
  2. 实战:其次,以一个集群为例,推演出该集群的参数的推荐值。

理论引导

当配置参数时,请遵循下表,将其推荐建议牢记于心

  • 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的数目低于那个数字。
  • 内存开销:
    下图描绘了spark-yarn的内存使用情况:
    [图片上传失败...(image-fa6806-1536392056623)]
    图中注意两件事情:
       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中运行多任务的好处。

理论够了...开始实战

现在,我们考虑一个10个节点的如下配置的集群,并分析不同参数设置的结果。
集群配置如下:

**集群配置:**
10个节点
每个节点16核
每个节点64G内存

第一种方案: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和内存的资源。对于用户来说,很有必要理解如何去配置它们。希望这篇博客对你有帮助。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AM...
    大佛爱读书阅读 2,750评论 0 20
  • 1.1、 分配更多资源 1.1.1、分配哪些资源? Executor的数量 每个Executor所能分配的CPU数...
    miss幸运阅读 3,140评论 3 15
  • 前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领...
    Alukar阅读 542评论 0 6
  • 五 春草发芽,蝴蝶花也纷纷醒来,那片空地上,绿意盎然。但是兔子奶奶,依旧是兔子奶奶,让它们消失的无影无踪。“我...
    风之影_ab3c阅读 209评论 0 0
  • 一. 什么是CPU的缓存 CPU与高速缓存通过快速通道直接相连,而高速缓存和主存通过数据总线相连 CPU cach...
    coderzc阅读 253评论 0 0