【问题标题】:Spark memory leak火花内存泄漏
【发布时间】:2017-05-23 23:45:52
【问题描述】:

我使用的是 spark 2.1,并且在 spark 中遇到了内存泄漏,特别是在使用 pyspark 的 subtract 函数时。我在一个循环中运行它,从中减去的数据帧最终应该达到 0,但我看到的是驱动程序上的内存使用量继续增加,直到它死亡。

for row in counts_df.collect():
    customer_df = all_grouped_df.select('name').where(all_grouped_df.customer == row['customer'])

    pre_count = all_df.count()

    all_df = all_df.subtract(customer_df)

    post_count = all_df.count()

    diff_count = pre_count-post_count
    # do some other stuff

在我看来all_df = X 实际上并没有覆盖之前的对象?这是我能得出的唯一结论,因为all_df 中的数据随着每个循环而减少。

有没有办法解决这个问题,或者有什么不同的方法来实现subtract 功能?

编辑:我只用减法函数(没有计数)运行它,它似乎没有泄漏任何东西。我认为泄漏可能与我的运行方式有关count

【问题讨论】:

  • 当你在没有计数的情况下做减法时,你的意思是在循环中没有计数还是根本没有计数..甚至在循环外?
  • 完全没有计数。
  • 好吧,如果没有计数,即没有动作......无论你在里面做什么都不会真正执行。尝试在循环外计数,看看你是否得到了你想要的结果..
  • 我需要在循环内计数,至少在减法之后才能完成我想要完成的工作。
  • 我在一个新问题中添加了一个读取运行示例。 stackoverflow.com/questions/44146738/spark-memory-leak

标签: python apache-spark memory-leaks pyspark


【解决方案1】:

对于您的问题:

  1. 当您对数据框进行操作时,它会创建一个新的数据框。特别不是动作方法。

  2. 我也感到很困扰。好吧,我猜你陷入了该死的火花开发者挖的两个陷阱。执行“all_df = all_df.substract”时,数据沿袭会增加,每次创建新的df时,数据关系都会延长,并且不会因为您引用它们而删除旧的。

所以你要么是由于非常长的数据沿袭而导致堆栈溢出,要么是由于内存中保存的数据帧过多而导致内存激增。

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多