Hadoop之block研究


 
  當寫入一個文件到 HDFS 時,它被切分成數據塊,塊大小是由配置文件 hdfs-default.xml 中的參數 dfs.blocksize (自 hadoop-2.2 版本后,默認值為 134217728字節即 128M,可以在 hdfs-site.xml 文件中改變覆蓋其值,單位可以為k、m、g、t、p、e等)控制的。每個塊存儲在一個或者多個節點,這是由同一文件中的配置 dfs.replication (默認為3)控制。塊的每一個 copy 叫做 replica (副本)。
 
  replication 流程
  當在 HDFS 文件中寫數據時,數據首先被寫入到客戶端本地緩存。當緩存達到塊大小時,客戶端請求 NameNode 並且獲取 DataNode 列表。這個列表包含將承載這個塊副本的 DataNode 。DataNode 數基於 replication 的系數,默認值為3。客戶端組織從 DataNode 到 DataNode 和 flush 數據塊到第一個 DataNode 的流程。第一個 DataNode 開始以小部分(文件系統大小4KB)接受該數據,每一部分寫入其本地存儲庫,並轉移同一部分數據至所述列表中的第二個 DataNode。第二個 DataNode 開始依次接受數據塊的每一部分,這部分數據寫入它的本地存儲庫,並且 flush 同一部分數據至第三個 DataNode。最后,第三個 DataNode 寫數據至其本地存儲庫。因此,一個 DataNode可以從流程中前一個節點接受數據,並把同一部分數據轉發到流程中的下一個節點。因此,數據是線性的從一個 DataNode 到下一個 DataNode。當第一個塊被填滿,客戶端向 NameNode 請求下一個塊的副本存儲的節點主機以供選擇。一個新的流程被組織起來,客戶端開始發送文件更進一步的字節數據。這種流動一直進行,直到文件的最后一個塊。對於每個塊的 DataNode 的選擇很可能是不同的。
注釋:准備和成功的ACK(確認)
  在客戶端寫 File.txt 文件的"Block A"到集群之前,它想要知道所有預期准備接受這個塊的 copy 的 DataNode。它選擇對於 Block A 列表的第一個DataNode(DataNode 1),打開一個 TCP 50010 端口的連接並且說:“Hey,准備接受一個塊,這兒有一個DataNode列表,包含 DataNode 5 和 DataNode 6。去確認他們也准備好接受這個塊。”DataNode 1 打開一個 TCP 連接至 DataNode 5 並且說,“Hey,准備接受一個塊,去確認 DataNode 6 也准備好接受這個塊。”DataNode 5 將問 DataNode 6,“Hey,你准備好接受一個塊了嗎?”
  在同一個 TCP 管道准備好確認返回,直到初始 DataNode 1 發送一個“准備就緒”的消息回客戶端。此時客戶端准備好了開始寫塊數據到集群。
  它們也將發送成功的確認消息返回至流程,關閉 TCP 會話。客戶端接收到一個成功消息,然后通知 NameNode 塊寫入成功。NameNode 更新元數據信息和文件 File.txt 的 Block A 的節點位置信息。
 
  副本存放策略
  默認的塊存放策略如下:
  1、第一個副本的位置--隨即的機架和節點(如果 HDFS 客戶端存在於 hadoop 集群之外)或者在本節點(如果 HDFS 客戶端運行在集群中的一個節點)。
  本地節點策略:
  在一個數據節點(這里使用 hadoop22)的本地路徑復制一個文件至 HDFS :
  我們期望在節點 hadoop22 看到所有塊的第一個副本。
  我們可以看到:
  文件 File.txt 的塊 Block 0 在 hadoop22(rack2)、hadoop33(rack3)、hadoop32(rack3);
  File.txt 的塊 Block 1 在 hadoop22(rack2)、hadoop33(rack3)、hadoop32(rack3);
  2、第二個副本寫入與第一個不同的機架,並隨機選擇。
  3、第三個副本寫入與第二個相同的機架,不過不是同一個節點。
  4、如果有其他副本,將被分散到其他機架。
 
  Replication 機架感知
  對於一個大的集群,它可能不會在一個扁平化的拓撲結構中直接的連接所有節點。通常的做法是,在多個機架的分散的節點。機架的節點共享一個開關,並且機架開關由一個或多個核心交換機連接。不同機架的兩個節點的通信,要經歷多個開關。大部分情況下,同一機架節點之間的網絡帶寬比不同機架之間的網絡帶寬要更大。
  HDFS使用一個簡單的但高有效性的策略來分配塊的副本。如果在 HDFS 集群的某些節點上正在執行打開一個文件以用來寫入塊的操作,那么第一個副本被分配到正在操作的客戶端的這台機器上。第二個副本被隨機分配到不同於第一個副本所在的機架的另一個機架上。第三個副本被隨機分配到第二個副本所在機架的不同節點上。意思是,一個塊被分配到了不同的機架上面。這個關鍵規則適用於數據的每一個快,兩個副本在同一機架,另一個在不同的機架上。


免責聲明!

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



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