2017-08-07 145 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

相關問題