分布式數據並行環境下,保持數據的本地性是非常重要的內容,事關分布式系統性能高下。
概念:
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的遠近不同,網絡開銷不一樣
