2017-08-07 143 views
0

我在MySQL上有一个> 5GB的表。我想将这个表格作为一个数据框加载到spark上,然后创建一个parquet文件。从Spark上的MySQL读取数据时超出了GC开销限制

这是我的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) 

我运行下面的脚本来运行我的火花的应用程序:当我在一个EC2实例与运行此脚本

./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,它与java.lang.OutOfMemoryError: GC overhead limit exceeded

失败同时,我只使用1.42 GB的可用内存。

这里是堆栈跟踪全控制台输出:https://gist.github.com/idlecool/5504c6e225fda146df269c4897790097

这里是堆栈跟踪的一部分: enter image description here

下面是HTOP输出: enter image description here

我不知道如果我做某些错误或火花不适用于此用例。我希望火花是。

+0

您使用的纱线如果是这样看一看[这](https://stackoverflow.com/a/33036908/1407161? )回答设置你的spark.yarn.executor.memoryOverhead属性。另外,看看[THIS](https://stackoverflow.com/questions/1393486/error-java-lang-outofmemoryerror-gc-overhead-limit-超过/ 1393503#1393503)回答有关特定例外的更多信息。 – Jeremy

回答

0

下面提供的关于火花的内存管理粗的解释了一下,你可以阅读更多关于它的官方文档,但这里是我的看法:

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

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

第三种类型的内存是用于在不同分区之间进行通信的混洗内存。如果您在数据框/ 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

相关问题