【问题标题】:Spark: what's the advantages of having multiple executors per node for a Job?Spark:一个作业的每个节点有多个执行器有什么好处?
【发布时间】:2015-12-18 03:37:06
【问题描述】:

我正在 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

由于来自job-tracker网站,同时运行的任务数量主要只是可用的核心(cpu)数量。所以我想知道我们希望每个节点拥有多个执行器是否有任何优势或特定场景?

谢谢!

【问题讨论】:

  • 我认为您的意思是针对给定的 Spark 作业?每个节点总是有多个执行器。

标签: memory apache-spark executor


【解决方案1】:

是的,每个节点运行多个执行程序是有好处的——尤其是在像您这样的大型实例上。我建议您阅读 Cloudera 的 this blog post

您会特别感兴趣的帖子的 sn-p:

希望让这一切更具体一点,这里有一个配置 Spark 应用程序以使用尽可能多的集群的工作示例:想象一个集群有六个运行 NodeManagers 的节点,每个节点配备 16 个内核和 64GB 的记忆。 NodeManager 容量,yarn.nodemanager.resource.memory-mb 和 yarn.nodemanager.resource.cpu-vcores,应该分别设置为 63 * 1024 = 64512(兆字节)和 15。我们避免将 100% 的资源分配给 YARN 容器,因为节点需要一些资源来运行操作系统和 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。

【讨论】:

  • 堆大小对垃圾回收的影响也存在权衡。
  • @ChristopherB,您能否详细说明“权衡堆大小对垃圾收集的影响”?谢谢!
  • @Glennie Helles Sindholt:所以在上面的Chouldera示例中,每个节点配置1个执行器每个节点最多使用63G内存,而每个节点配置3个执行器最多使用19Gx3 =每个节点57G内存.在这种情况下,每个节点 3 个执行程序会浪费每个节点的 (63-57) = 6G 内存吗?特别是如果它是一项内存密集型工作?谢谢!
  • 对于 jvm 堆大小,堆大小越大,GC 可能需要暂停更长的时间才能压缩。此时 EMR 使用 CMS GC 来最大限度地减少停顿,即使在较大的堆大小中也是如此,但不要忽视大小对 JVM 性能的潜在影响。除了 Glennie 所指出的内存效率之外,我还看到使用较小的执行器(尽管每个节点的聚合内核是相同的)性能更好的用例,反之亦然。测试您的用例。
  • @Edamame 是的,我不知道目前使用 YARN 避免内存浪费的方法。我发现这与应用程序管理器需要在其中一个节点上运行这一事实特别相关,因此您可以尽最大努力尽量减少 Cloudera 帖子中描述的内存浪费。我相信在 Spark 1.6 中已经做了很多事情来优化内存利用率,但在那之前......
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2018-05-18
  • 2015-12-21
  • 2013-11-23
  • 1970-01-01
  • 2016-10-11
相关资源
最近更新 更多