调整Spark:当可用核心不平衡时,每个节点的执行程序数量

时间:2019-10-14 16:47:41

标签: apache-spark

我已经了解到,Spark中每个执行器具有5个内核可以实现最佳的读/写吞吐量-因此通常需要设置spark.executor.cores = 5。另外,您应该为每个节点减去一个核心,以允许基础守护程序运行。

因此,确定每个节点的执行者数量遵循以下公式:

executors per node = (cores per node - 1) / 5 cores per executor

但是,在每台节点计算机上有8个核心的情况下,最佳方法是什么?

1.4 executors per node = (8 - 1) / 5

第一个问题-Spark / yarn的执行程序会跨越多个节点吗?

如果没有-那么我需要四舍五入。我应该走哪条路?看来我的选择是:

1。)向下舍入为1-表示每个节点只有1个执行程序。我可以增加每个执行器的内核,尽管不知道我是否可以从中受益。

2。)四舍五入到2-这意味着我必须将每个执行程序的内核减少到3(8个可用内核,-1个用于守护程序,不能有1/2个内核),这可以降低效率。

1 个答案:

答案 0 :(得分:0)

此处spark.executor.cores = 5并非硬性规定。拇指法则是# of cores equal to or less than 5

我们需要1个内核用于OS和其他Hadoop守护程序。每个节点剩下7个核心。 请记住,在所有执行者中,我们需要YARN的一位执行者。

spark.executor.cores = 4时,我们不能为YARN保留1个执行器,因此,我建议不要使用此值。

spark.executor.cores = 3spark.executor.cores = 2在将一个节点留给YARN后,我们总是被每个节点遗留1个执行程序。

现在,哪种代码最有效。嗯,这无法解释,它取决于多个其他因素,例如使用的数据量,使用的联接数等。

这是基于我的理解。它为探索其他多种选择提供了开端。

注意:如果您在代码中使用了一些外部Java库和数据集,则每个执行器可能需要1个内核来保护类型安全。

希望这对您有帮助...