Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如果我保持核心总数一致,我应该如何选择执行器的数量和每个执行器的核心数量?_Apache Spark_Parallel Processing_Executor - Fatal编程技术网

Apache spark 如果我保持核心总数一致,我应该如何选择执行器的数量和每个执行器的核心数量?

Apache spark 如果我保持核心总数一致,我应该如何选择执行器的数量和每个执行器的核心数量?,apache-spark,parallel-processing,executor,Apache Spark,Parallel Processing,Executor,假设我使用的集群有2个i3.metal实例,每个实例都有512GiB内存和72个vCPU内核()。如果我想使用所有的核心,我需要一些执行器的配置,每个执行器的核心可以提供144个核心。这方面似乎有很多选择;例如,我可以有72个执行器,每个执行器有2个核心,或者我可以有36个执行器,每个执行器有4个核心。无论哪种方式,我最终都会得到相同数量的内核和相同数量的内存 如何在这两种配置或更多可用配置之间进行选择?两者在功能上有什么不同吗 我读过spark jobs的参数调整,但它没有回答这个问题。我也搜

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

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

我读过spark jobs的参数调整,但它没有回答这个问题。我也搜索过相关的帖子,但还是没有找到这个问题的答案


中顶部答案上的注释表明没有一个答案,应该针对每个作业进行调整。如果是这样的话,我会感激任何“普遍智慧”的存在

事实上,对于所有用例都没有绝对的答案。每项工作都是不同的

当我想执行一个新的工作时,我使用的一般智慧是从一个默认的配置开始,在瘦执行器和胖执行器中间的某个地方:每个执行器有几个内核,每个机器有几个执行器。 对于每个执行器的核心数,我通常取每台机器核心数的平方根。然后,我根据作业对这些参数进行微调,比较性能,同时查看硬件瓶颈(内存?内核?磁盘?网络?)。如果作业失败,从数据集的子集开始,然后按比例放大也会有所帮助

因此,在这种配置下,我会直观地从18个执行器(每台机器9个)开始,每个执行器有8个内核,但作为初始配置,36个执行器有4个内核对我来说也是合理的

由于资源和瓶颈方面的各种原因,每个(精简)执行器使用一个内核,或者每个节点使用一个(fat)执行器来获取机器的所有内核往往效率低下

此外,Spark对每个执行器的内存具有默认上限。如果有几个执行器有很多内核,那么除非您分配更多,否则它将无法充分利用内存


我希望这有帮助

事实上,对于所有用例都没有绝对的答案。每项工作都是不同的

当我想执行一个新的工作时,我使用的一般智慧是从一个默认的配置开始,在瘦执行器和胖执行器中间的某个地方:每个执行器有几个内核,每个机器有几个执行器。 对于每个执行器的核心数,我通常取每台机器核心数的平方根。然后,我根据作业对这些参数进行微调,比较性能,同时查看硬件瓶颈(内存?内核?磁盘?网络?)。如果作业失败,从数据集的子集开始,然后按比例放大也会有所帮助

因此,在这种配置下,我会直观地从18个执行器(每台机器9个)开始,每个执行器有8个内核,但作为初始配置,36个执行器有4个内核对我来说也是合理的

由于资源和瓶颈方面的各种原因,每个(精简)执行器使用一个内核,或者每个节点使用一个(fat)执行器来获取机器的所有内核往往效率低下

此外,Spark对每个执行器的内存具有默认上限。如果有几个执行器有很多内核,那么除非您分配更多,否则它将无法充分利用内存


我希望这有帮助

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


同样,正如Ghislain所提到的,这取决于您的操作,但这正是我的出发点。

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


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

这就是我感到困惑的地方-为什么每个执行器的内核数量会造成IO负担?如果我有72个执行器,每个执行器有1个内核,或者36个执行器,每个执行器有2个内核,那么我仍然在执行72个IO任务。为什么executor分组会影响任何事情?如果您使用一个,那么IO负担将在HDFS端。Hdfs客户端不喜欢有太多的并行线程,但对于不同的数据源,它可能会有所不同。现在,如果您使用36个执行器,每个执行器有2个内核,那么如果您只需要映射任务,它将为您提供更高的性能。。。。不过,如果您引入了随机播放,您现在将输入与随机播放文件块等相关的内存含义。。。每个核心的内存将发挥更大的作用。。。。所以如果你所做的只是地图绘制。。。我建议使用内存最少的nuMOfCores进行弹道测试。。。然而,如果你是洗牌重。。。您可能想增加每个核心的内存这就是我困惑的地方-为什么每个执行器的核心数量会造成IO负担?如果我有72个执行器,每个执行器有1个内核,或者36个执行器,每个执行器有2个内核,那么我仍然在执行72个IO任务。为什么executor分组会影响任何事情?如果您使用一个,那么IO负担将在HDFS端。Hdfs客户端不喜欢有太多的并行线程,但对于不同的数据源,它可能会有所不同。现在,如果您使用36个执行器,每个执行器有2个内核,那么如果您只需要映射任务,它将为您提供更高的性能。。。。不过,如果您引入了随机播放,您现在将输入与随机播放文件块等相关的内存含义。。。每个核心的内存将发挥更大的作用。。。。所以如果你所做的只是地图绘制。。。我建议在nuMOfCore上使用弹道导弹