RDD架構重構與優化
在用spark查詢的場景中,盡量去復用RDD,差不多的RDD,可以抽取成為一個共同的RDD,在后面的RDD計算過程總,反復使用。
公共RDD一定要實現持久化
對于要多次計算和使用的公共RDD,一定要進行持久化。
持久化,就是將RDD的數據緩存到內存中/磁盤中(BlockManager)以后無論對這個RDD做多少次計算,那么都是直接取這個RDD的持久化的數據,比如從內存中或者磁盤中,直接提取一份數據,減少了加載數據底層的數據。
持久化,是可以進行序列化的
如果正常將數據持久化在內存中,那么可能會導致內存的占用過大,這樣的話,也許,會導致OOM內存溢出。
當純內存無法支撐公共RDD數據完全存放的時候,就優先考慮使用序列化的方式在純內存中存儲。將RDD的每個partition的數據,序列化成一個大的字節數組,就一個對象。序列化后,大大減少內存的空間占用。
序列化的方式,唯一的缺點就是,在獲取數據的時候,需要反序列化。
如果序列化純內存方式,還是導致OOM內存溢出,就只能考慮磁盤的方式、內存+磁盤的普通方式(無序列化)、內存+磁盤(序列化)。
為了數據的高可靠性,而且內存充足,可以使用雙副本機制,進行持久化。
持久化的雙副本機制,持久化后的一個副本,因為機器宕機了,副本丟了,就還是得重新計算一次。持久化的每個數據單元,存儲一份副本,放在其他節點上面。從而進行容錯。一個副本丟了,不用重新計算,還可以使用另外一份副本。這種方式,僅僅針對你的內存資源極度充足的情況。