Memory 火花:什么';对于一个作业,每个节点有多个执行器有什么好处?

Memory 火花:什么';对于一个作业,每个节点有多个执行器有什么好处?,memory,apache-spark,executor,Memory,Apache Spark,Executor,我正在AWS-EMR集群上运行我的作业。它是一个使用cr1.8XL大型实例的40节点群集。每个cr1.8XL都有240G内存和32个内核。我可以使用以下配置运行: --driver-memory 180g --driver-cores 26 --executor-memory 180g --executor-cores 26 --num-executors 40 --conf spark.default.parallelism=4000 或 从job tracker网站上看,同时运行的任务数量

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

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

从job tracker网站上看,同时运行的任务数量主要是可用的内核(cpu)数量。所以我想知道,我们希望每个节点有多个执行器,这有什么好处或特定场景


谢谢

是的,每个节点运行多个执行器有很多优点,尤其是在像您这样的大型实例上。我建议您阅读Cloudera

您特别感兴趣的文章片段:

为了让这一切更具体一些,下面是一个配置Spark应用程序以尽可能多地使用集群的工作示例:想象一个有六个节点运行NodeManager的集群,每个节点配备16个内核和64GB内存。节点管理器的容量,即Thread.NodeManager.resource.memory-mb和Thread.NodeManager.resource.cpu-vcores,可能应分别设置为63*1024=64512(兆字节)和15。我们避免将100%的资源分配给纱线容器,因为节点需要一些资源来运行OS和Hadoop守护进程。在本例中,我们为这些系统进程保留一个千兆字节和一个内核。Cloudera Manager通过计算和自动配置这些纱线属性来提供帮助

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

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

此配置会在所有节点上产生三个执行器,但具有AM的节点除外,该节点将有两个执行器。 --执行器内存派生为(每个节点63/3个执行器)=21。21 * 0.07 = 1.47. 21-1.47~19


堆大小对垃圾收集的影响也存在权衡。@christopher,您能详细介绍一下“堆大小对垃圾收集的影响权衡”吗?谢谢@Glennie Helles Sindholt:在上面的Couldera示例中,每个节点配置1个执行器最多使用63G内存,而每个节点配置3个执行器最多使用19Gx3=57G内存。在这种情况下,每个节点3个执行器是否会浪费(63-57)=6G内存?特别是如果这是一项记忆密集型工作?谢谢至于jvm堆大小,堆大小越大,GC可能需要暂停更长的时间来压缩。此时,EMR使用CMS GC来最小化暂停,即使在较大的堆大小中也是如此,但不要忽略大小对JVM性能的潜在影响。除了内存效率之外,正如Glennie所指出的,我还看到过使用较小的执行器(尽管每个节点的聚合内核是相同的)执行效果更好的用例,反之亦然。测试您的用例。@Edamame是的,我不知道目前有什么方法可以避免纱线造成的内存浪费。我发现这与应用程序管理器需要在其中一个节点上运行这一事实尤其相关,因此您可以尽最大努力尽量减少Cloudera post中描述的内存浪费。我相信Spark 1.6中已经做了很多事情来优化内存利用率,但在那之前…我想你是说对于给定的Spark作业?每个节点始终有多个执行器。
--driver-memory 180g --driver-cores 26 --executor-memory 90g --executor-cores 13 --num-executors 80 --conf spark.default.parallelism=4000