Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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 spark workers将数据返回给驱动程序的最佳方式_Apache Spark_Amazon Emr - Fatal编程技术网

Apache spark spark workers将数据返回给驱动程序的最佳方式

Apache spark spark workers将数据返回给驱动程序的最佳方式,apache-spark,amazon-emr,Apache Spark,Amazon Emr,我们在一台机器上运行大数据任务时面临性能问题。设计的任务是内存和计算密集型的,并且在庞大的数据集上运行优化算法(分支定界算法)。一台EC2 c5.24x大型机器(96vCPU/192GiB)现在需要2天以上才能完成任务。我们已经尝试过优化代码(多线程、更多内存、并行性、优化算法),但看起来我们所能达到的程度是有限的,而且随着数据集的增长,我们正在向其中添加更多的用例,这听起来不像是一个可伸缩的选项 考虑将其分配到较小的任务中,并由spark cluster中的多个工作人员执行。任务的输出将是一个

我们在一台机器上运行大数据任务时面临性能问题。设计的任务是内存和计算密集型的,并且在庞大的数据集上运行优化算法(分支定界算法)。一台EC2 c5.24x大型机器(96vCPU/192GiB)现在需要2天以上才能完成任务。我们已经尝试过优化代码(多线程、更多内存、并行性、优化算法),但看起来我们所能达到的程度是有限的,而且随着数据集的增长,我们正在向其中添加更多的用例,这听起来不像是一个可伸缩的选项

考虑将其分配到较小的任务中,并由spark cluster中的多个工作人员执行。任务的输出将是一个单独的Gzip JSON(大小为2-20MB),通过分发,我希望每个工作人员构建更小的JSON或RDD块,这些块稍后可以在驱动程序端合并


这可行吗?每个工作人员可以发送回驱动程序的数据量是否有限制?还是将每个工作输出存储到某个数据库(S3),然后在驱动端合并更好?每种方法的优缺点是什么

我建议不要从执行者到驱动者收集数据,并在那里合并它们。它使驱动程序成为瓶颈,并且会经常遇到与资源相关的问题。最好的选择是让执行者处理数据并生成JSON。您可以让输出JSON保持原样,这将有助于重新处理它们。如果您太担心这些JSON的大小,或者希望将它们合并以发送到另一个进程,那么您可以使用文件实用程序将它们合并,或者使用
dataframe.coleasc(1)
生成一个输出文件。

为什么要在驱动程序中专门合并?在任务结束时,我们需要一个最终的合并输出,我相信驱动程序是最好的组件,因为它可以确保一致性。最好不要将任何结果收集回驱动程序,因为它在几乎所有情况下都是不可伸缩的。你能把代码的相关部分粘贴在这里吗?这将有助于更好地理解。