当前位置:  开发笔记 > 运维 > 正文

Spark:为每个节点创建多个执行程序的优势是什么?

如何解决《Spark:为每个节点创建多个执行程序的优势是什么?》经验,为你挑选了1个好方法。

我在AWS-EMR集群上运行我的工作.它是使用cr1.8xlarge实例的40节点集群.每个cr1.8xlarge有240G内存和32个内核.我可以使用以下配置运行:

--driver-memory 180g --driver-cores 26 --executor-memory 180g --executor-cores 26 --num-executors 40 --conf spark.default.parallelism=4000

要么

--driver-memory 180g --driver-cores 26 --executor-memory 90g --executor-cores 13 --num-executors 80 --conf spark.default.parallelism=4000

从作业跟踪器网站开始,同时运行的任务数量主要只是可用的核心数(cpu).所以我想知道我们是否希望每个节点有多个执行程序?

谢谢!



1> Glennie Hell..:

是的,每个节点运行多个执行程序都有优势 - 特别是在像你这样的大型实例上.我建议你阅读Cloudera的这篇博客文章.

您特别感兴趣的帖子片段:

为了使所有这一切更加具体,这里有一个配置Spark应用程序以尽可能多地使用集群的工作示例:想象一个集群有六个运行NodeManagers的节点,每个节点配备16个内核和64GB内存.NodeManager容量,yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores应该分别设置为63*1024 = 64512(兆字节)和15.我们避免将100%的资源分配给YARN容器,因为该节点需要一些资源来运行OS和Hadoop守护进程.在这种情况下,我们为这些系统进程留下了一个千兆字节和一个核心.Cloudera Manager通过计算这些并自动配置这些YARN属性来帮助您.

可能的第一个冲动是使用--num-executors 6 --executor-cores 15 --executor-memory 63G.但是,这是错误的方法,因为:

63GB +执行程序内存开销不适合NodeManager的63GB容量.应用程序主机将占用其中一个节点上的核心,这意味着该节点上没有15核心执行程序的空间.每个执行程序15个核心可能导致错误的HDFS I/O吞吐量.更好的选择是使用--num-executors 17 --executor-cores 5 --executor-memory 19G.为什么?

这个配置在所有节点上产生三个执行器,除了带有AM的节点,它将有两个执行器.--executor-memory派生为(每个节点63/3执行程序)= 21. 21*0.07 = 1.47.21 - 1.47~19.


至于jvm堆大小,GC可能需要暂停更长时间才能压缩的堆大小.此时,EMR使用CMS GC来最小化暂停,即使在较大的堆大小中也是如此,但不要忽略大小对JVM性能的潜在影响.超出内存效率,如Glennie所述,我已经看到用较小的执行程序表现得更好的用例(尽管每个节点的聚合核心是相同的),反之亦然.测试您的用例.
@Edamame是的,我不知道目前通过YARN避免内存浪费的方法.我发现这与应用程序管理器需要在其中一个节点上运行这一事实特别相关,因此您可以尽力减少内存浪费,如Cloudera文章中所述.我相信Spark 1.6已经做了很多事情来优化内存利用率,但在那之前......
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有