gpt4 book ai didi

PySpark 错误 java.lang.OutOfMemoryError : GC overhead limit exceeded

转载 作者:行者123 更新时间:2023-12-02 01:03:06 25 4
gpt4 key购买 nike

我该如何修复我的 GC overhead limit exceeded发生在 PySpark 2.2.1 版中。安装在 Ubuntu 16.04.4 上。

在 Python 3.5.2 脚本中,我将 spark 设置为:

 spark = SparkSession.builder.appName('achats_fusion_files').getOrCreate()                                                                                                                              
spark.conf.set("spark.sql.pivotMaxValues", "1000000")
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", "-1")
spark.conf.set("spark.executor.memory", "1g")
spark.conf.set("spark.driver.memory", "1g")

如何通过使用 Python 脚本中的良好设置来解决问题?

波纹管错误消息:
18/03/14 09:57:25 ERROR Executor: Exception in task 34.0 in stage 36.0 (TID 2076)                                                                                                                         
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.regex.Pattern.compile(Pattern.java:1667)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at org.apache.spark.network.util.JavaUtils.byteStringAs(JavaUtils.java:266)
at org.apache.spark.network.util.JavaUtils.byteStringAsBytes(JavaUtils.java:302)
at org.apache.spark.util.Utils$.byteStringAsBytes(Utils.scala:1087)
at org.apache.spark.SparkConf.getSizeAsBytes(SparkConf.scala:310)
at org.apache.spark.io.LZ4CompressionCodec.compressedOutputStream(CompressionCodec.scala:114)
at org.apache.spark.serializer.SerializerManager.wrapForCompression(SerializerManager.scala:156)
at org.apache.spark.serializer.SerializerManager.wrapStream(SerializerManager.scala:131)
at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:120)
at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:237)
at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:151)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
at org.apache.spark.scheduler.Task.run(Task.scala:108)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

最佳答案

直接从文档中获取,

  • GC 调优的第一步是收集有关垃圾收集发生频率和 GC 花费时间的统计信息。这可以通过将 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 添加到 Java 选项来完成。
  • Spark 中 GC 调优的目标是确保只有长生命周期的 RDD 存储在老年代,并且年轻代的大小足以存储短生命周期的对象。这将有助于避免完整的 GC 来收集在任务执行期间创建的临时对象。
  • 通过收集 GC 统计信息来检查是否有太多垃圾收集。如果在任务完成之前多次调用 full GC,则意味着没有足够的内存可用于执行任务。
  • 如果有太多次要收集但没有太多主要 GC,为 Eden 分配更多内存会有所帮助。您可以将 Eden 的大小设置为高估每个任务需要多少内存。如果确定 Eden 的大小为 E,则可以使用选项 -Xmn=4/3*E 设置 Young 代的大小。 (扩大 4/3 也是为了考虑幸存者区域使用的空间。)
  • 在打印的 GC 统计信息中,如果 OldGen 接近满,则通过降低 spark.memory.fraction 来减少用于缓存的内存量;缓存更少的对象比减慢任务执行速度更好。或者,考虑减少年轻代的大小。这意味着降低 -Xmn 如果您已按上述设置。如果没有,请尝试更改 JVM 的 NewRatio 参数的值。许多 JVM 将其默认为 2,这意味着 Old 代占用堆的 2/3。它应该足够大,使得这个分数超过 spark.memory.fraction。
  • 尝试使用 -XX:+UseG1GC 的 G1GC 垃圾收集器。在垃圾收集成为瓶颈的某些情况下,它可以提高性能。 (这对我有帮助)

  • 帮助我的更多参数是,
  • -XX:ConcGCThreads=20
  • -XX:InitiatingHeapOcuupancyPercent=35

  • 可以通过在作业的配置中设置 spark.executor.extraJavaOptions 来指定执行程序的所有 GC 调整标志。

    查询 this出来了解更多详情。

    编辑:

    在你 spark-defaults.conf 中写,

    spark.executor.JavaOptions -XX:+UseG1GC

    spark.executor.extraJavaOptions -XX:ConcGCThreads=20 -XX:InitiatingHeapOcuupancyPercent=35

    关于PySpark 错误 java.lang.OutOfMemoryError : GC overhead limit exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49274213/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com