Apache spark 在Spark上从MySQL读取数据时超出了GC开销限制

Apache spark 在Spark上从MySQL读取数据时超出了GC开销限制,apache-spark,pyspark,Apache Spark,Pyspark,我在mysql上有一个大于5GB的表。我想将该表作为数据帧加载到spark上,并从中创建拼花地板文件 这是我的python函数来完成这项工作: def import_table(tablename): spark = SparkSession.builder.appName(tablename).getOrCreate() df = spark.read.format('jdbc').options( url="jdbc:mysql://mysql.host.n

我在mysql上有一个大于5GB的表。我想将该表作为数据帧加载到spark上,并从中创建拼花地板文件

这是我的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开销限制

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

以下是带有堆栈跟踪的完整控制台输出:

以下是堆栈跟踪的一部分:

以下是HTOP输出:


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

下面提供了一个关于spark内存管理的粗略解释,您可以从官方文档中阅读更多关于它的信息,但我的观点如下:

我相信“spark.storage.memoryFraction=0.9”选项在您的情况下是有问题的,大致来说,执行器有三种类型的内存可以分配,第一种是存储内存,您将其设置为执行器内存的90%,即约27GB,用于保存持久数据集

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

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

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

由于您拥有如此高的存储份额,程序可用的堆内存非常小。您需要使用这些参数来获得最佳值。由于要输出拼花地板文件,通常需要更大的堆空间,因为程序需要进行压缩计算。我建议您使用以下设置。其思想是,您不需要执行任何需要大量洗牌内存的操作,因此可以保持较小的内存。此外,您不需要如此高的存储容量

“spark.storage.memoryFraction=0.4” “spark.shuffle.memoryFraction=0.2”

有关这方面的更多信息可在此处阅读:

永远感谢
,您可能需要将
spark.executor.extraJavaOptions
设置为-XX:-usegcoveredlimit

您使用的是纱线吗?如果是这样,请查看设置spark.Thread.executor.memoryOverhead属性的答案。另外,请查看答案以了解有关特定异常的更多信息。