? ? 最近一個Spark Streaming項目停止了幾個小時,發現后設置為自動重啟。結果,Spark Streaming頻繁重啟,平均十分鐘左右就要重啟一次。
異常信息為:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /user/ypdata/checkpoint/temp (inode 120825098): File does not exist. [Lease.Holder: DFSClient_NONMAPREDUCE_1085161746_1, pendingcreates: 1]
問題定位:
? ? ? ? 這個項目采用的Spark Streaming + kafka的模式,spark streaming實時從kafka拉取數據。
? ? ? ? 頻繁重啟,間隔很確定的話,就懷疑是OOM導致的,因為數據在kafka端堆積,啟動spark streaming后,會不停去kafka取數據(采用了high level的模式,沒有控制速率),spark采用的模式是MEMROY_ONLY_SER模式,超過了driver-memory和executor-memory后,spark會自動丟棄放不下的數據,那么當需要計算該數據時自然報錯說找不到數據塊。
? ? ? ? 直到堆積的數據都在kafka消費完畢。 后來的現象也證實了這一點,重啟了十幾次,過了兩個小時后,恢復正常。?
解決方案:
? ? ? ? 但是隨著數據量的越來越多,這種情況還是會出現,而且無法解決。?
? ? ? ? 1. 采用kafka low-level的api,控制消費速率,保護spark。 犧牲了實時性。?
? ? ? ? 2.加大spark的driver-memory和executor-memory,同時支持序列化到磁盤。?