1. 程式人生 > >Spark中的資料本地性

Spark中的資料本地性

分散式資料並行環境下,保持資料的本地性是非常重要的內容,事關分散式系統性能高下。

概念:

block : HDFS的物理空間概念,固定大小,最小是64M,可以是128,256 。。也就是說單個檔案大於block的大小,肯定會被切分,被切分的數目大概是:比如檔案是250M,block是64M,就會被分為4個block,64+64+64+58,最後一個block沒有滿,一個block只能有一個檔案的內容,加上每個block一般有3個副本存在,那麼這個檔案在HDFS叢集就有12個block分佈,可能分佈在datanode1,2,3,4  可能分佈在datanode4,5,6,7 所以並不是所有的datanode都有這個檔案的block

最理想的情況,我們希望一個檔案的所有block在一個datanode上面都可以找到,這樣可以在讀資料的時候避免網路傳輸

partition: spark的計算資料概念,是RDD的最小單位,它的大小不是固定的,一般是根據叢集的計算能力,以及block的數量來決定的,也就是說partition的個數我們是可以自己指定的

spark內部有2種分割槽策略,一種是hashpartition,一種是rangepartition,其實就是根據key,把k-v資料合理的劃分為多個partition,然後對資料進行規劃和計算

worker:spark計算叢集中,非master節點,它的分佈也是在某些node上面

rack:資料中心由一堆堆的rack組成,一個rack由多個datanode組成,在rack中的datanode可以看做本地資料,因為網路比較好

所以有data的node不一定上面有worker,同樣有worker的node上面不一定有合適的資料,這樣問題就抽象成為,如何讓讀取HDFS的時候,spark整體開銷最小,這就是本地性的問題

因為上面3個block的資料不一樣,所以我們在選擇worker(h)的時候,要考慮哪個是最佳計算worker

考慮rack的網路本地性,h4 h3 h1 h2 h5 h6 h7 h8

不考慮rack的網路本地性,h1 h4 h5 h6 h2 h3 h7 h8

task執行在哪個機器h上面,是在DAGscheduler在進行stage的劃分的時候,確定的

選出了計算節點的順序,就可以告訴spark的partition(RDD),然後在h上啟動executor/tasker,然後讀取資料,h從哪個節點獲得block呢?block的幾個副本離h的遠近不同,網路開銷不一樣