将数据从火花工作者返回给驱动程序的最佳方法

问题描述 投票:0回答:1

我们面临在单台计算机上运行大数据任务的性能问题。设计任务是内存和计算密集型任务,并且正在对大型数据集运行优化算法(分支和绑定算法)。一台EC2 c5.24x大型计算机(96vCPU / 192GiB)现在需要2天以上的时间才能完成任务。我们已经尝试优化代码(多线程,更多内存,并行性,优化算法),但是随着数据集的不断增长,我们似乎可以实现的目标数量是有限的,而且听起来不像是可扩展的选项添加更多用例。

考虑将其分配给较小的任务,并由Spark集群中的多个工作人员执行。任务的输出将是单个Gzip JSON(大小为2-20 MB),并且通过分发,我希望每个工作人员构建较小的JSON或RDD块,然后可以在驱动程序端进行合并。

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

apache-spark amazon-emr
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.