【问题标题】:How do you find out exactly what had caused the high GC time for the spark tasks in any given spark stage?在任何给定的 spark 阶段,您如何找出导致 spark 任务的高 GC 时间的确切原因?
【发布时间】:2021-08-08 00:21:54
【问题描述】:

我确实有一个 spark 应用程序,其中一个 spark 阶段大部分时间花费了 2.5hrs + 。我进行了深入研究,发现大多数任务的 GC 时间占总任务执行时间的 60%。

我的问题是:

  1. 我如何将这段 spark 任务与我的代码关联起来? enter image description here

  2. 如何确定使用 PySpark 编写的 spark 代码的哪一部分导致了高 GC 时间? enter image description here

  3. 我想知道,对于任何给定的 spark 任务,一般是什么导致高 GC 时间?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    高 GC 表示频繁 GC 或 GC 耗时较长。我可以从屏幕截图中收集到的信息有限的一些建议:

    1. 要检查的一件事是您是否缓存了大 rdd/rdd。一旦不再需要它们就取消缓存将减少内存压力。第 68 阶段是否是第一个作业的一部分,是否从以前的作业中取消缓存不需要的数据?

    2. 如何判断这是哪个操作:使用舞台顶部的DAG visualization链接,工作页面了解流程。对于 SQL,请使用 UI 上的 SQL 选项卡。

    3. 对于大约 40GB 的随机数据,还有 2000 个任务,每个任务处理 20 MB,这非常小。最好每个任务至少有 ~128MB。将此并行度调回默认值 200?

    4. 如果您无法优化代码,请通过添加更多节点或具有更大内存的节点来使用更多内存。

    【讨论】:

      【解决方案2】:

      根据经验,高 GC 时间是由需要超过可用内存的任务引起的。高 GC 时间通常还伴随着溢出到磁盘的任务(Memory Spill 和 Disk Spill 列中的条目)。

      另外,来自学习火花:

      高 GC 时间表明堆上的对象过多(您的执行程序可能内存不足)。

      Damji、Jules S.、Wenig、Brooke、Das、Tathagata、Lee、Denny。

      根据我的经验,一个好的缓解方法是增加给定阶段读取的分区数量,以减少单个任务所需的内存,例如通过在读取文件时减少spark.files.maxPartitionBytes,或在加入数据帧时增加spark.sql.shuffle.partitions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        相关资源
        最近更新 更多