Scala 内存不足
我有一个包含150g txt文件的文件夹(大约700个文件,平均每个200MB) 我正在使用scala处理文件,并最终计算一些聚合统计数据。我认为有两种可能的方法可以做到这一点:Scala 内存不足,scala,apache-spark,Scala,Apache Spark,我有一个包含150g txt文件的文件夹(大约700个文件,平均每个200MB) 我正在使用scala处理文件,并最终计算一些聚合统计数据。我认为有两种可能的方法可以做到这一点: 手动循环所有文件,对每个文件进行计算,最后合并结果 将整个文件夹读取到一个RDD,在这个RDD上执行所有操作,并让spark执行所有并行化 我倾向于第二种方法,因为它看起来更干净(不需要特定于并行化的代码),但我想知道我的场景是否适合硬件和数据施加的约束。我有一个工作站,有16个线程和64 GB的RAM(因此,不同
- 手动循环所有文件,对每个文件进行计算,最后合并结果
- 将整个文件夹读取到一个RDD,在这个RDD上执行所有操作,并让spark执行所有并行化
我不需要非常快的解决方案(如果需要,它可以轻松运行几个小时甚至几天)。我也没有缓存任何数据,只是最终将它们保存到文件系统中。如果您认为采用手动并行方法更可行,我也可以这样做。我和我的团队已经成功地处理了一个csv数据,该数据大小超过1 TB,每台机器的内存为32GB。这在很大程度上取决于你在做什么样的处理以及如何处理
TextInputFormat.SPLIT\u MINSIZE
和TextInputFormat.SPLIT\u MAXSIZE
(如果您使用的是TextInputFormat)来提升
平行性请注意,Spark是一个通用群集计算系统,因此在单机中使用Spark来添加另一个基于代码的透视图(与配置相反)是无效的(IMHO):有时候,最好弄清楚Spark应用程序在什么阶段超出内存,并查看是否可以进行更改以修复问题。当我学习Spark时,我有一个Python Spark应用程序由于OOM错误而崩溃。原因是我将所有结果收集回主控中,而不是让任务保存输出 例如
- 失败,出现OOM错误。另一方面,
processed\u data.saveAsTextFile(输出目录)
- 很好
collect()
函数用于将数据集的所有元素(从所有节点)检索到驱动程序节点。我们应该在较小的数据集上使用collect()
,通常在filter()
、group()
、count()
等之后。检索较大的数据集会导致内存不足。如果在独立模式下运行Spark,它将无法工作。您需要在资源管理器上运行应用程序,例如在Hadoop集群上运行的Thread
。在一台机器上运行Thread有意义吗?如果不存在分布式群集,独立模式(正确配置时)是否与群集管理器的工作方式相同?如果不打算使用分布式群集,您将如何在64RAM上安装150G?我正在考虑获取一块数据,对其进行处理,并将部分结果存储在磁盘上(如果需要),继续进行下一个块,直到完成所有操作,最后合并部分结果。@Igor通过大量增加您使用的分区数量,可以产生您想要的效果-即一次处理一点。这个答案列出了您可以尝试的所有事情:您有使用有限内存读取大文件的示例代码吗?特别是如何使用TextInputFormat.SPLIT\u MAXSIZE
和mapPartitions
?我使用的是conf.set(“TextInputFormat.SPLIT\u MAXSIZE”,“512M”)
,运气不好。
for item in processed_data.collect():
print(item)