【问题标题】:GC overhead limit exceeded while reading data from MySQL on Spark在 Spark 上从 MySQL 读取数据时超出 GC 开销限制
【发布时间】:2018-05-08 14:56:20
【问题描述】:

我在 mysql 上有一个 > 5GB 的表。我想将该表作为数据框加载到 spark 上,并从中创建一个 parquet 文件。

这是我的python函数来完成这项工作:

def import_table(tablename):
    spark = SparkSession.builder.appName(tablename).getOrCreate()

    df = spark.read.format('jdbc').options(
        url="jdbc:mysql://mysql.host.name:3306/dbname?zeroDateTimeBehavior=convertToNull
",
        driver="com.mysql.jdbc.Driver",
        dbtable=tablename,
        user="root",
        password="password"
    ).load()

    df.write.parquet("/mnt/s3/parquet-store/%s.parquet" % tablename)

我正在运行以下脚本来运行我的 spark 应用程序:

./bin/spark-submit ~/mysql2parquet.py --conf "spark.executor.memory=29g" --conf "spark.storage.memoryFraction=0.9" --conf "spark.executor.extraJavaOptions=-XX:-UseGCOverheadLimit" --driver-memory 29G --executor-memory 29G

当我在 30 GB 的 EC2 实例上运行此脚本时,它失败并显示 java.lang.OutOfMemoryError: GC overhead limit exceeded

同时,我只使用了 1.42 GB 的可用总内存。

这是带有堆栈跟踪的完整控制台输出:https://gist.github.com/idlecool/5504c6e225fda146df269c4897790097

这是堆栈跟踪的一部分:

这是 HTOP 输出:

我不确定我做错了什么,或者 spark 不适合这个用例。我希望火花是。

【问题讨论】:

  • 你在使用 Yarn 吗?如果是这样,请查看THIS 答案以设置您的 spark.yarn.executor.memoryOverhead 属性。另外,请查看THIS 答案以获取有关特定异常的更多信息。

标签: apache-spark pyspark


【解决方案1】:

下面提供了一些关于spark内存管理的粗略解释,您可以从官方文档中阅读更多信息,但这是我的看法:

我相信选项“spark.storage.memoryFraction=0.9”在你的情况下是有问题的,粗略地说一个执行器有三种类型的内存可以分配,首先是你设置为 90% 的存储内存执行器内存,即约 27GB,用于保存持久数据集。

其次是堆内存,用于执行计算,通常在您进行机器学习或大量计算的情况下设置为高,这在您的情况下是不够的,您的程序需要具有更高的堆内存是导致此错误的原因。

第三种内存是shuffle memory,用于不同分区之间的通信。如果您在数据帧/rdd 之间或一般情况下进行大量连接,则需要将其设置为较高的值,这需要大量的网络开销。这可以通过设置“spark.shuffle.memoryFraction”来配置

所以基本上你可以通过使用这两个设置来设置内存分数,洗牌后剩余的可用内存和存储内存进入堆。

由于您的存储比例如此之高,程序可用的堆内存非常小。您将需要使用这些参数来获得最佳值。由于您正在输出 parquet 文件,因此您通常需要更多的堆空间,因为程序需要进行压缩计算。我会为您建议以下设置。这个想法是你没有做任何需要大量随机播放内存的操作,因此它可以保持很小。此外,您不需要如此大量的存储内存。

"spark.storage.memoryFraction=0.4" "spark.shuffle.memoryFraction=0.2"

可以在此处阅读有关此内容的更多信息:

https://spark.apache.org/docs/latest/configuration.html#memory-management

【讨论】:

    【解决方案2】:

    感谢Gaurav Dhamaexplanation ,您可能还需要将spark.executor.extraJavaOptions 设置为-XX:-UseGCOverheadLimit

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2021-02-04
      • 1970-01-01
      • 2011-05-21
      • 2015-10-30
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多