【发布时间】:2018-12-17 06:42:02
【问题描述】:
我的程序是这样工作的:
- 将大量文件作为数据帧读入。在这些文件中有一组大约 60 个文件,每个文件有 5k 行,我为每个文件创建一个单独的数据框,进行一些简单的处理,然后将它们全部合并到一个数据框中,用于进一步加入。
- 我最终对多个数据帧执行了多次连接和列计算,最终生成了一个目标数据帧。
- 我将目标数据框保存为 Parquet 文件。
- 在同一个 spark 应用程序中,我加载了 Parquet 文件并进行了一些繁重的聚合,然后对该数据帧进行了多次自联接。
- 我将第二个数据帧保存为另一个 Parquet 文件。
问题
如果我在上面提到的一组文件中只有一个文件而不是 60 个文件,那么一切都适用于具有 8g 内存的驱动程序。对于 60 个文件,前 3 个步骤工作正常,但驱动程序在准备第二个文件时内存不足。只有当我将驱动程序的内存增加到 20g 时,情况才会有所改善。
问题
这是为什么呢?在计算第二个文件时,我不使用用于计算第一个文件的 Dataframe,因此如果第一个 Parquet 文件的大小保持不变,它们的数量和内容应该无关紧要,不是吗?这 60 个数据帧是否会以某种方式被缓存并占用驱动程序的内存?我自己不做任何缓存。我也从不收集任何东西。我不明白为什么 8g 的内存对于 Spark 驱动程序来说是不够的。
【问题讨论】:
-
嗨,我遇到了同样的问题。我不使用持久化或缓存,看起来镶木地板文件保留在驱动程序内存中。在不增加内存的情况下找到解决方案了吗?
-
很高兴知道我并不孤单。不,恐怕我还没有找到任何合适的解决方案,除了增加驱动程序内存和读取更少的文件。幸运的是,我能够在我的情况下限制它们。但这并不是一个真正好的长期解决方案(文件的数量无论如何都会随着时间的推移而增长),我仍然不太明白这是由 Spark 中的一些错误还是它对内存的特殊处理引起的,而我没有调整它正确...
标签: apache-spark dataframe apache-spark-sql out-of-memory