深入理解hadoop之機架感知


  深入理解hadoop之機架感知


  機架感知

  hadoop的replication為3,機架感知的策略為:

  第一個block副本放在和client所在的datanode里(如果client不在集群范圍內,則這第一個node是隨機選取的)。第二個副本放置在與第一個節點不同的機架中的datanode中(隨機選擇)。第三個副本放置在與第二個副本所在節點同一機架的另一個節點上。如果還有更多的副本就隨機放在集群的datanode里,這樣如果第一個block副本的數據損壞,節點可以從同一機架內的相鄰節點拿到數據,速度肯定比從跨機架節點上拿數據要快;同時,如果整個機架的網絡出現異常,也能保證在其它機架的節點上找到數據。為了降低整體的帶寬消耗和讀取延時,HDFS會盡量讓讀取程序讀取離它最近的副本。如果在讀取程序的同一個機架上有一個副本,那么就讀取該副本。如果一個HDFS集群跨越多個數據中心,那么客戶端也將首先讀本地數據中心的副本。那么Hadoop是如何確定任意兩個節點是位於同一機架,還是跨機架的呢?答案就是機架感知。

  默認情況下,hadoop的機架感知是沒有被啟用的。所以,在通常情況下,hadoop集群的HDFS在選機器的時候,是隨機選擇的,也就是說,很有可能在寫數據時,hadoop將第一塊數據block1寫到了rack1上,然后隨機的選擇下將block2寫入到了rack2下,此時兩個rack之間產生了數據傳輸的流量,再接下來,在隨機的情況下,又將block3重新又寫回了rack1,此時,兩個rack之間又產生了一次數據流量。在job處理的數據量非常的大,或者往hadoop推送的數據量非常大的時候,這種情況會造成rack之間的網絡流量成倍的上升,成為性能的瓶頸,進而影響作業的性能以至於整個集群的服務  。但是,hadoop對機架的感知並非是真正智能感知的,而是需要人為的告知hadoop哪台機器屬於哪個rack,這樣在hadoop的namenode啟動初始化時,會將這些機器與rack的對應信息保存在內存中,作為寫塊操作時分配datanode列表時選擇datanode的依據。

要將hadoop機架感知的功能啟用,配置非常簡單,在namenode所在機器的hadoop-site.xml配置文件中配置一個選項:

  

<property>
  <name>topology.script.file.name</name>
  <value>/path/to/RackAware.py</value>
</property>

  這個配置選項的value指定為一個可執行程序,通常為一個腳本,該腳本接受一個參數,輸出一個值。接受的參數通常為某台datanode機器的ip地址,而輸出的值通常為該ip地址對應的datanode所在的rack,例如”/rack1”。Namenode啟動時,會判斷該配置選項是否為空,如果非空,則表示已經用機架感知的配置,此時namenode會根據配置尋找該腳本,並在接收到每一個datanode的heartbeat時,將該datanode的ip地址作為參數傳給該腳本運行,並將得到的輸出作為該datanode所屬的機架,保存到內存的一個map中。

  網絡拓撲

 

  

  有了機架感知,NameNode就可以畫出上圖所示的datanode網絡拓撲圖。D1,R1都是交換機,最底層是datanode。則H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。這些rackid信息可以通過topology.script.file.name配置。有了這些rackid信息就可以計算出任意兩台datanode之間的距離。

distance(/D1/R1/H1,/D1/R1/H1)=0  相同的datanode
distance(/D1/R1/H1,/D1/R1/H2)=2  同一rack下的不同datanode
distance(/D1/R1/H1,/D1/R1/H4)=4  同一IDC下的不同datanode
distance(/D1/R1/H1,/D2/R3/H7)=6  不同IDC下的datanode


免責聲明!

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



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