2015-09-07 93 views
2

我在火花流應用程序中的驅動程序進程有問題。問題是驅動程序進程內存不足。主節點和工作節點都沒有問題(它們都運行良好,連續數天)。但即使使用非常有限的饋送(每5分鐘發送兩條消息,處理1條消息的時間少於100毫秒),我會在一段時間後(例如,週末)在驅動程序過程中發生oom錯誤。火花流驅動程序進程內存不足

以下是詳細信息:

我有一個簡單的火花流媒體應用程序,從MQTT數據源消耗事件,並​​在數據庫中存儲這些。我正在使用一個具有1個主節點和2個工作節點的小型火花集羣。我有1個驅動程序進程(開始使用spark-submit和部署模式客戶端)提供集羣。我在Ubuntu上使用Java8(Oracle VM)運行spark-1.4.1-bin-hadoop2.6。

我的驅動程序基本上如下:

JavaReceiverInputDStream<String> messages = createInputDStream(ssc); 
messages.mapPartitions(...).mapToPair(...).updateStateByKey(...). 
    foreachRDD(rdd -> { 
    rdd.foreach(ne -> { 
    }); 
    return null; 
    }); 

我已經做了初步調查。如果我參加了駕駛過程中的堆轉儲收集實例的直方圖(JMAP -histo),我通常會看到這樣的東西:

1:   36388  81204168 [B 
    2:  407486  32826432 [C 
    3:   40849  25067224 [I 
    4:  367245  8813880 scala.collection.immutable.$colon$colon 
    5:  311000  7464000 java.lang.String 
    6:  114294  7314816 org.apache.spark.storage.RDDInfo 

我注意到,隨着時間的推移,RDDInfo對象的數量在增加。堆轉儲顯示大部分RDDINfo對象保留在JobProgressListener的stageIdToData映射中。看看這個類的代碼,它似乎應該注意丟棄舊數據。因此,我已經在conf/spark-defaults.conf中設置了

spark.ui.retainedJobs  50 
spark.ui.retainedStages 50 

。但是這並沒有幫助。從我的轉儲中,我看到這個stageIdToData地圖包含1897個條目。鑑於上述配置設置,這看起來很奇怪。

我在這裏做錯了什麼,或者這是一個火花問題?

+0

您是否解決了這個問題?我遇到了與檢查點到S3相同的問題。 – Navneet

+0

我不這麼認爲。很久以前,我很久以前就開始工作了。 – user2519865

回答

0

您是否在應用程序的驅動程序端執行任何操作?就像獲取數據並處理它,保存在內存中一樣?

+0

不,我不是。這是我的驅動程序循環。 asEvents(messages).foreachRDD(rdd - > { rdd.foreach(ne - > { }); return null; }); – user2519865

1

由於您使用的是updateStateByKey,因此您的流必須是checkpointing。嘗試減少檢查點間隔。

在你的記憶快照中,你有一堆數組。誰在堅持這些?

+0

是的,我正在檢查點。減少間隔不只是推遲厄姆? [B來自最終來自netty緩衝區的ThreadLocal(來自shuffle-server-0線程)。 [C來自SparkContext中的JobProgressListener。 [我也來自JobProgressListener。 – user2519865