【问题标题】:How to make sure my DataFrame frees its memory?如何确保我的 DataFrame 释放其内存?
【发布时间】:2018-03-02 17:11:49
【问题描述】:

我有一个 Spark/Scala 工作,我在其中执行此操作:

  • 1:计算一个大DataFrame df1 + cache 到内存中
  • 2:使用df1 计算dfA
  • 3:将原始数据读入df2(同样,它很大)+cache

执行 (3) 时,我不再需要 df1。我想确保它的空间得到释放。我在 (1) 处 cached 因为这个 DataFrame 在 (2) 中使用,它是确保我不会每次都重新计算它的唯一方法,而是只重新计算一次。

我需要释放它的空间并确保它被释放。我有哪些选择?

我想到了这些,但似乎还不够:

  • df=null
  • df.unpersist()

您能否使用适当的 Spark 文档链接记录您的答案?

【问题讨论】:

  • 可能是xy problem 的一个实例——你为什么要强制GC?你想解决什么问题?
  • 在计算时,我的内存变得非常满,我想释放一些我不再需要的 DataFrame 使用的空间(我缓存它以减轻一些冗余计算,但我没有想要它了)。
  • 我进行了编辑以避免陷入 XY 问题。
  • @belka 你的缓存空间或非缓存空间用完了吗?如果不是缓存空间耗尽,清除缓存将无济于事。
  • @belka 内存有多个部分,其中一个是缓存,另一个是常规执行堆空间。当缓存空间用完时,程序不会崩溃,只是一些分区不会被缓存并在需要时重新评估。当执行堆用完时,您可能会收到内存不足错误。如果您的常规堆内存用完了,那么释放缓存空间将无济于事

标签: scala apache-spark garbage-collection spark-dataframe


【解决方案1】:

df.unpersist 应该足够了,但不一定会立即释放它。它只是标记要删除的数据框。

您可以使用df.unpersist(blocking = true),它会一直阻塞直到数据帧被删除,然后再继续。

【讨论】:

  • 这会阻塞数据帧还是阻塞执行时间线?
  • @belka 它阻止执行(因为线程将停止并等待数据帧被取消缓存)
  • 就我的经验而言,在这种情况下,这会在恢复之前阻止所有机器的执行。
【解决方案2】:

Spark 用户无法手动触发垃圾回收。

分配df=null 不会释放太多内存,因为DataFrame 不保存数据——它只是对计算的描述。

如果您的应用程序有内存问题,请查看Garbage Collection tuning guide。它有建议从哪里开始以及可以改变什么来提高 GC

【讨论】:

  • 实际上,您确实有办法确保您的对象将被垃圾回收:您将变量(对象引用)设置为 null 并在下一轮检查中,如果您的对象没有任何其他引用它的指针越长,它就应该被垃圾回收。
  • 感谢您的更新。假设我缓存了我的 DataFrame,因此它不包含对未来要完成的计算的描述,而是数据,不是吗? + 在这种情况下unpersist 做了什么?
猜你喜欢
  • 2020-11-18
  • 1970-01-01
  • 2020-06-23
  • 2021-03-09
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多