我已经了解到,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个内核),这可以降低效率。
答案 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 = 3
或spark.executor.cores = 2
在将一个节点留给YARN后,我们总是被每个节点遗留1个执行程序。
现在,哪种代码最有效。嗯,这无法解释,它取决于多个其他因素,例如使用的数据量,使用的联接数等。
这是基于我的理解。它为探索其他多种选择提供了开端。
注意:如果您在代码中使用了一些外部Java库和数据集,则每个执行器可能需要1个内核来保护类型安全。
希望这对您有帮助...