我們經常會對RDD執行一系列Transformation算子操作,邏輯上每經歷一次變換,就會將RDD轉換爲一個新的RDD,RDD會被劃分成很多的分區分佈到集羣的多個節點中。
分區是邏輯概念,爲了防止函數式數據不可變行(immutable)導致的內存需求無限擴張,使得系統內存被快速用完,Spark使用延遲執行(lazy)的方式執行,即只有操作累計到Action(行動),算子纔會觸發整個操作序列的執行,中間結果不會單獨再重新分配內存,而是在同一個數據塊上進行流水線操作。
也就是說變換前後的新舊RDD的分區在物理上可能是同一塊內存存儲,這是Spark內部做的優化。有些RDD是計算的中間結果,其分區並不一定有相對應的內存或磁盤數據與之對應,所以如果想要複用某一個RDD,需要通過Cache算子,將數據緩存(或者說固化)到內存中。