Spark中的partition和block的關系


hdfs中的block是分布式存儲的最小單元,類似於盛放文件的盒子,一個文件可能要占多個盒子,但一個盒子里的內容只可能來自同一份文件。假設block設置為128M,你的文件是250M,那么這份文件占3個block(128+128+2)。這樣的設計雖然會有一部分磁盤空間的浪費,但是整齊的block大小,便於快速找到、讀取對應的內容。(p.s. 考慮到hdfs冗余設計,默認三份拷貝,實際上3*3=9個block的物理空間。)

spark中的partition 是彈性分布式數據集RDD的最小單元,RDD是由分布在各個節點上的partition 組成的。partition 是指的spark在計算過程中,生成的數據在計算空間內最小單元,同一份數據(RDD)的partition 大小不一,數量不定,是根據application里的算子和最初讀入的數據分塊數量決定的,這也是為什么叫“彈性分布式”數據集的原因之一。

總結:
block位於存儲空間、partition 位於計算空間,
block的大小是固定的、partition 大小是不固定的,
block是有冗余的、不會輕易丟失,partition(RDD)沒有冗余設計、丟失之后重新計算得到

在storage模塊里面所有的操作都是和block相關的,但是在RDD里面所有的運算都是基於partition的,那么partition是如何與block對應上的呢?

RDD計算的核心函數是iterator()函數:

如果當前RDD的storage level不是NONE的話,表示該RDD在BlockManager中有存儲,那么調用CacheManager中的getOrCompute()函數計算RDD,在這個函數中partition和block發生了關系:

首先根據RDD id和partition index構造出block id (rdd_xx_xx),接着從BlockManager中取出相應的block。

  • 如果該block存在,表示此RDD在之前已經被計算過和存儲在BlockManager中,因此取出即可,無需再重新計算。
  • 如果該block不存在則需要調用RDD的computeOrReadCheckpoint()函數計算出新的block,並將其存儲到BlockManager中。

需要注意的是block的計算和存儲是阻塞的,若另一線程也需要用到此block則需等到該線程block的loading結束。

 

 
         

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM