Spark:对于一个Job,每个节点有多个执行程序的优点是什么?

时间:2015-12-18 03:37:07

标签: memory apache-spark executor

我在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 个答案:

答案 0 :(得分:8)

是的,每个节点运行多个执行程序都有优势 - 特别是在像你这样的大型实例上。我建议你阅读Cloudera的this blog post

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

  

为了使所有这些更加具体,这里有一个配置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。