假设我正在使用一个具有2个i3.metal实例的集群,每个实例具有512GiB内存和72个vCPU内核(source)。如果要使用所有内核,则需要对执行程序进行一些配置,并且每个执行程序需要有144个内核。似乎有很多选择。例如,我可以有72个执行者,每个执行者2个核心,或者我可以有36个执行者,每个执行者4个核心。无论哪种方式,我最终都拥有相同数量的内核,每个内核具有相同的内存量。
如何在这两种配置之间进行选择,或者如何选择更多可用的配置?两者之间在功能上有什么区别吗?
我已阅读Cloudera's blog post的关于火花作业的参数调整的信息,但没有回答这个问题。我也在SO中搜索了相关帖子,但是同样,没有找到该问题的答案。
this post中对最高答案的评论表明没有单个答案,应该针对每个作业进行调整。如果是这样的话,我将不胜感激!
答案 0 :(得分:0)
确实,对于所有用例都没有绝对的答案。每个工作都是不同的。
当我想执行一项新工作时,我所使用的一般智慧是从默认配置开始,介于瘦执行者和胖执行者之间的某个中间位置:每个执行者有多个内核,每台机器有多个执行者。
我通常将每台机器的内核数的平方根用作每个执行器的内核数。然后,我根据工作对这些参数进行微调,比较性能,同时查看硬件瓶颈(内存,内核,磁盘或网络)。如果作业失败,也可以从数据集的子集开始,然后再进行扩展。
因此,使用这种配置,我将直观地从18个执行器(每台机器9个)开始,每个执行器具有8个内核,但是对于我来说,作为初始配置,36个具有4个内核的执行器对于我来说也很合理。
由于资源和瓶颈方面的各种原因,每个(瘦的)执行器使用一个内核,或者每个节点占用一个计算机的所有内核的(肥胖)执行器往往效率低下。
此外,Spark对每个执行程序都有默认的内存上限。如果很少有具有很多核心的执行程序,除非您分配更多的执行程序,否则它将无法充分利用内存。
我希望这会有所帮助!
答案 1 :(得分:0)
我想说,每个执行者5个内核将是一个不错的选择,它不会对您的输入数据源造成任何IO负担。话虽如此,还应确保每个内核的内存不足。理想情况下,每位执行者不要少于8g。
再次如吉斯兰(Ghislain)所述,这取决于您的操作,但这就是我要开始的地方。