【问题标题】:If I keep the total number of cores consistent, how should I choose the number of executors and number of cores per executor?如果我保持核心总数一致,我应该如何选择执行器的数量和每个执行器的核心数?
【发布时间】:2019-11-14 23:22:31
【问题描述】:

假设我正在使用具有 2 个 i3.metal 实例的集群,每个实例具有 512GiB 内存和 72 个 vCPU 内核 (source)。如果我想使用所有的核心,我需要对执行器和每个执行器的核心进行一些配置,这样我就有 144 个核心。似乎有很多选择;例如,我可以有 72 个执行器,每个执行器有 2 个核心,或者我可以有 36 个执行器,每个执行器有 4 个核心。无论哪种方式,我最终都会得到相同数量的内核和每个内核相同的内存量。

如何在这两种配置或更多可用配置之间进行选择?两者在功能上有区别吗?

我已阅读 Cloudera's blog post 关于 spark 作业的参数调整,但它没有回答这个问题。我也搜索过相关帖子,但同样没有找到这个问题的答案。

this post 中顶部答案上的 cmets 表示没有单一答案,应针对每项工作进行调整。如果是这种情况,我将不胜感激任何“普遍智慧”!

【问题讨论】:

    标签: apache-spark parallel-processing executor


    【解决方案1】:

    确实,对于所有用例都没有绝对的答案。每个工作都不同。

    当我想执行一项新工作时,我使用的一般智慧是从一个介于瘦执行器和胖执行器之间的默认配置开始:每个执行器有几个核心,每台机器有几个执行器。

    我通常将每台机器的内核数的平方根作为每个执行程序的内核数。然后,我根据工作微调这些参数,比较性能,同时查看硬件瓶颈(内存?内核?磁盘?网络?)。如果作业失败,从数据集的子集开始,然后扩大规模也会有所帮助。

    因此,使用这种配置,我会直观地从 18 个执行器(每台机器 9 个)开始,每个执行器有 8 个核心,但是作为初始配置,我觉得 36 个有 4 个核心的执行器也很合理。

    由于资源和瓶颈方面的各种原因,每个(瘦)执行器一个核心,或者每个节点一个(胖)执行器占用机器的所有核心往往效率低下。

    此外,Spark 对每个执行程序的内存有默认上限。如果执行器数量少且核心数量多,那么除非您分配更多,否则它会未充分利用内存。

    我希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我会说每个执行程序 5 个核心将是一个最佳点,不会对您的输入数据源造成任何 IO 负担。话虽如此,还要确保每个内核的内存不会太少。理想情况下,每个执行器的重量不要少于 8g。

      正如 Ghislain 所说,这取决于您的操作,但这就是我要开始的地方。

      【讨论】:

      • 这就是我感到困惑的地方——为什么每个执行程序的核心数会造成 IO 负担?如果我有 72 个执行器,每个执行器 1 个核心,或者 36 个执行器,每个执行器 2 个核心,我仍然在执行 72 个 IO 任务。为什么按执行者分组会影响任何事情?
      • 如果您使用的是 HDFS 端,那么 IO 负担将落在 HDFS 端。 Hdfs Client 不喜欢有太多的并行线程来打它,但它可能因不同的数据源而异。
      • 现在,如果您使用 36 个执行器,每个执行器有 2 个核心,如果您所做的只是映射任务,它将为您提供更好的性能......但是,如果您引入 shuffle,您现在将输入与随机播放文件块和喜欢......每个核心的内存将发挥更大的作用......所以如果你所做的只是映射器......我建议在内存最少的 nuMOfCores 上使用弹道......但是如果你是洗牌重...你可能想增加每个核心的内存
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      相关资源
      最近更新 更多