Spark RDD Persistence

來源:互聯網
上載者:User

標籤:

Spark最為重要的特性之一就是可以在多個操作(Action)之間,將一個或多個RDD關聯的資料集(Dataset)以分區(Partition)為單位進行持久化(Persist)或緩衝(Cache),儲存介質通常是記憶體(Memory)。 被持久化或緩衝的RDD A可以在兩種情況下被很好地“重複”利用: (1)直接依賴:操作(Action)直接應用於RDD A之上;(2)間接依賴:操作(Action)間接應用於RDD B之上,而RDD B來源於RDD A; 持久化或緩衝是迭代式計算和互動式應用的關鍵技術,通常可以提升10位以上的計算速度。 實際應用中,RDD的持久化或緩衝選項是通過persist()或cache()發出的,之後如果某個操作(Action)觸發該RDD的資料第一次被計算,那麼計算的結果資料(也就是該RDD的資料)就會以分區的形式被緩衝於計算節點的記憶體中;而且這些資料是可以實現容錯的,如果這個RDD的某些分區資料丟失(因為節點故障),這些分區的資料可以在使用時通過世代資訊(Lineage)被自動回復。 RDD的儲存形式或儲存介質是可以通過儲存層級(Storage Level)被定義的。例如,將資料持久化到磁碟、將Java對象序列化之後(有利於節省空間的)緩衝至記憶體、開啟複製(RDD的分區資料可以被備份到多個節點防止丟失)或者使用堆外記憶體(Tachyon)。persist()可以接收一個StorageLevel對象(Scala、Java、Python)用以定義儲存層級,如果使用的是預設的儲存層級(StorageLevel.MEMORY_ONLY),Spark提供了一個便利方法:cache()。 儲存層級選項如下:  
MEMORY_ONLY 預設選項,RDD的(分區)資料直接以Java對象的形式儲存於JVM的記憶體中,如果記憶體空間不足,某些分區的資料將不會被緩衝,需要在使用的時候根據世代資訊重新計算。
MYMORY_AND_DISK RDD的資料直接以Java對象的形式儲存於JVM的記憶體中,如果記憶體空間不中,某些分區的資料會被儲存至磁碟,使用的時候從磁碟讀取。
MEMORY_ONLY_SER RDD的資料(Java對象)序列化之後儲存於JVM的記憶體中(一個分區的資料為記憶體中的一個位元組數組),相比於MEMORY_ONLY能夠有效節約記憶體空間(特別是使用一個快速序列化工具的情況下),但讀取資料時需要更多的CPU開銷;如果記憶體空間不足,處理方式與MEMORY_ONLY相同。
MEMORY_AND_DISK_SER 相比於MEMORY_ONLY_SER,在記憶體空間不足的情況下,將序列化之後的資料存放區於磁碟。
DISK_ONLY 僅僅使用磁碟儲存RDD的資料(未經序列化)。
MEMORY_ONLY_2,MEMORY_AND_DISK_2, etc. 以MEMORY_ONLY_2為例,MEMORY_ONLY_2相比於MEMORY_ONLY儲存資料的方式是相同的,不同的是會將資料備份到叢集中兩個不同的節點,其餘情況類似。
OFF_HEAP(experimental) RDD的資料序例化之後儲存至Tachyon。相比於MEMORY_ONLY_SER,OFF_HEAP能夠減少記憶體回收開銷、使得Spark Executor更“小”更“輕”的同時可以共用記憶體;而且資料存放區於Tachyon中,Spark叢集節點故障並不會造成資料丟失,因此這種方式在“大”記憶體或多並發應用的情境下是很有吸引力的。需要注意的是,Tachyon並不直接包含於Spark的體系之內,需要選擇合適的版本進行部署;它的資料是以“塊”為單位進行管理的,這些塊可以根據一定的演算法被丟棄,且不會被重建。
 注意:使用PySpark(即使用Python開發Spark應用程式)時,所有需要儲存的資料都會使用Pickle進行序列化,這種行為與儲存層級無關。 Spark推薦使用者將需要重複使用的RDD通過persist()或cache()顯式持久化。同時我們需要知道,會觸發“Shuffle”的操作是特殊的,例如reduceByKey,即使沒有使用者的顯式persist,它也會自動持久化“Shuffle”的中間結果,以防止“Shuffle”過程中某些節點故障導致整個輸入資料被重新計算。 那麼我們應該如何選取持久化的儲存層級呢?實際上儲存層級的選取就是Memory與CPU之間的雙重權衡,可以參考下述內容: (1)如果RDD的資料可以很好的相容預設儲存層級(MEMORY_ONLY),那麼優先使用它,這是CPU工作最為高效的一種方式,可以很好地提高運行速度; (2)如果(1)不能滿足,則嘗試使用MEMORY_ONLY_SER,且選擇一種快速的序列化工具,也可以達到一種不錯的效果; (3)一般情況下不要把資料持久化到磁碟,除非計算是非常“昂貴”的或者計算過程會過濾掉大量資料,因為重新計算一個分區資料的速度可能要高於從磁碟讀取一個分區資料的速度; (4)如果需要快速的失敗恢複機制,則使用備份的儲存層級,如MEMORY_ONLY_2、MEMORY_AND_DISK_2;雖然所有的儲存層級都可以通過重新計算丟失的資料實現容錯,但是備份機制使得大部分情況下應用無需中斷,即資料丟失情況下,直接使用備份資料,而不需要重新計算資料的過程; (5)如果處於大記憶體或多應用的情境下,OFF_HEAP可以帶來以下的好處:      a. 它允許Spark Executors可以共用Tachyon的記憶體資料;     b. 它很大程式上減少JVM記憶體回收帶來的效能開銷;     c. Spark Executors故障不會導致資料丟失。 最後,Spark可以自己監測“緩衝”空間的使用,並使用LRU演算法移除舊的分區資料。我們也可以通過顯式調用RDD unpersist()手動移除資料。   

Spark RDD Persistence

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.