1. 程式人生 > >BigData 學習記錄(三)

BigData 學習記錄(三)

如果 lock 都沒有 stream 節點 信息 nod 存在 物理

master/slave主從結構:
HDFS是一個 master/slave的架構。HDFS只有一個NameNode,即master。master負責管理文件系統命名空間和client對文件的訪問。此外,HDFS有很多DataNode,通常一個機器節點一個DataNode,管理這個節點上的存儲。HDFS對外提供一個文件系統名字空間允許用戶把數據存為文件的格式。
文件拆分成若幹個block,這些block存放在DataNode節點上。NameNode操作名字空間比如:打開,關閉,重命名文件目錄。DataNode負責為文件系統的客戶提供讀/寫操作服務。DataNode同時還為NameNode提供block創建,刪除,備份機制

read write策略:
一 寫入數據
  當沒有配置機架信息時,所有的機器hadoop都默認在同一個默認的機架下,名為“/default-rack”,這種情況下,任何一臺 datanode機器,不管物理上是否屬於同一個機架,都會被認為是在同一個機架下,此時,就很容易出現之前提到的增添機架間網絡負載的情況。在沒有機架信息的情況下,namenode默認將所有的slaves機器全部默認為在/default-rack下
  而當Hadoop集群中配置了機架感知信息以後,hadoop在選擇三個datanode時,就會進行相應的判斷:
  1.如果上傳本機不是一個datanode,而是一個客戶端,那麽就從所有slave機器中隨機選擇一臺datanode作為第一個塊的寫入機器(datanode1)。
 註意:而此時如果上傳機器本身就是一個datanode(例如mapreduce作業中task通過DFSClient向hdfs寫入數據的時候),那麽就將該datanode本身作為第一個塊寫入機器(datanode1)。
  2.隨後在datanode1所屬的機架以外的另外的機架上,隨機的選擇一臺,作為第二個block的寫入datanode機器(datanode2)。
  3.在寫第三個block前,先判斷是否前兩個datanode是否是在同一個機架上,如果是在同一個機架,那麽就嘗試在另外一個機架上選擇第三個datanode作為寫入機器(datanode3)。而如果datanode1和datanode2沒有在同一個機架上,則在datanode2所在的機架上選擇一臺datanode作為datanode3。
  4.得到3個datanode的列表以後,從namenode返回該列表到DFSClient之前,會在namenode端首先根據該寫入客戶端跟 datanode列表中每個datanode之間的“距離”由近到遠進行一個排序。如果此時DFS寫入端不是datanode,則選擇datanode列表中的第一個排在第一位。客戶端根據這個順序有近到遠的進行數據塊的寫入。
  5.當根據“距離”排好序的datanode節點列表返回給DFSClient以後,DFSClient便會創建BlockOutputStream,並將這次block寫入pipeline中的第一個節點(最近的節點)。
  6.寫完第一個block以後,依次按照datanode列表中的次遠的node進行寫入,直到最後一個block寫入成功,DFSClient返回成功,該block寫入操作結束。

二 讀取數據
  我們看一下Hadoop集群配置中如何讀取數據。當對某個文件的某個block進行讀取的時候,hadoop采取的策略也是一樣:
  1.首先得到這個block所在的datanode的列表,有幾個副本數該列表就有幾個datanode。
  2.根據列表中datanode距離讀取端的距離進行從小到大的排序:
  a)首先查找本地是否存在該block的副本,如果存在,則將本地datanode作為第一個讀取該block的datanode
  b)然後查找本地的同一個rack下是否有保存了該block副本的datanode
  c)最後如果都沒有找到,或者讀取數據的node本身不是datanode節點,則返回datanode列表的一個隨機順序。

BigData 學習記錄(三)