1. 程式人生 > >HDFS的一些總結

HDFS的一些總結

一、Hadoop歷史

        Google在2002-2004年間釋出了GFS、MapReduce以及BigTable三大論文,也就是Hadoop的“三駕馬車”。受此啟發的Doug Cutting等人用2年的業餘時間實現了DFS和MapReduce機制,使Nutch效能飆升。2005年,Hadoop作為Lucene的子專案Nutch的一部分正式引入Apache基金會。2006年2月被分離出來,成為一套完整獨立的開源框架,起名為Hadoop。而Hadoop是以Doug Cutting兒子棕黃色的大象玩具命名的。

Hadoop生態圈包括:

  • HDFS(分散式檔案系統)
  • MapReduce(分散式計算框架)
  • Yarn(分散式資源管理器)
  • Common

二、HDFS儲存原理

1.各個角色的作用:

NameNode:
1. 接收客戶端的讀寫請求
2. 管理元資料

  • 上傳檔案的許可權
  • 上傳檔案的屬主和屬組
  • 上傳檔案的時間
  • 上傳檔案的Block數以及ID號
  • 每一個Block的位置資訊是由DN在叢集啟動之時彙報的 (不會持久化)
  • 各個DataNode位置資訊

3. 管理DataNode

DataNode:

  • 接受客戶端的讀請求
  • 儲存block塊
  • 向NameNode(active)彙報心跳
  • 構建pipeline管道
  • 管理本機上的block元資料

SecondaryNameNode:
扮演助理角色,負責持久化。
持久化機制
SNN拉取NN節點上的 edits+fsimage檔案進行合併,拉取的同時在NN節點上會建立edits_new目的就是為了儲存在合併期間對HDFS的操作。SNN基於拉來的edits檔案重演,產生元資料。將重演產出的元資料合併到fsimage中,將合併後fsimage推送給NN,NN將edits.new檔案的字尾去掉,成為新的edits檔案。
合併觸發機制:
①時間超過3600S合併一次
②edits檔案大小超過64M
滿足任意一個條件即可觸發。

ZKFC:

  1. 監控各自的NN,將監控的情況彙報給zookeeper叢集。
  2. 接受zookeeper的選舉結果,確認另外一個NN是否存活,將自己監控的NN提升為active狀態。

journalnode:

  1. 寫資料的時候只需要保證半數以上的節點寫入成功就可以了。
    超過半數的原因是為了防止出現腦裂(網路分割槽)問題
  2. 最終(強)一致性/弱一致性。
  3. 儲存的是edits檔案。

NameNode(StandBy):

  1. 監控journalnode中資料的變化,實時更新自己記憶體中的元資料
  2. 將記憶體中元資料持久化到fsimage中,然後推送給NN

備份機制:
若是叢集內操作,則第一個Block儲存在本機上,若是叢集外操作,第一個Block儲存在負載不高的的節點上。第二個Block儲存在其他機架隨機一臺節點上,第三個Block儲存在與第二個Block相同機架的其他節點上。

安全模式:
安全模式是HDFS所處的一種特殊狀態,在這種狀態下,檔案系統只接受讀資料請求(能檢視檔案目錄,但是無法讀取檔案內容),而不接受刪除、修改等變更請求。
安全模式下NameNode所做的工作:

  1. 載入fsimage,載入到記憶體中。
  2. 若edits檔案不為空,那麼namenode自己來合併。
  3. 檢查DataNode是否存活。
  4. 若DataNode死亡,則指揮DataNode進行備份操作。

2.HDFS的讀寫流程:

讀流程:

  1. Client訪問NameNode,查詢元資料資訊,獲得這個檔案的Block位置列表
  2. Namenode返回所有Block的位置資訊,並將這些資訊返回給Client
  3. Client採用就近原則,挑選一臺datanode伺服器讀取block資訊

寫流程:

  1. Client計算大檔案的Block數量
  2. Client會向NameNode彙報(當前大檔案的block數,當前大檔案屬主、屬組許可權,檔案上傳時間)
  3. Client切割Block(預設Block大小為128M,按照位元組切割,中文可能出現亂碼)
  4. Client向NameNode請求Block塊的Id號以及地址
  5. 由於NameNode掌控全域性,管理所有的DataNode,所以它將負載不高的DataNode地址返回給client
  6. Client拿到地址後,找到Data去上傳資料
  7. NN返回給Client一批地址後,這些DN之間會形成一個Pipeline管道,並且DN會將Block切割成一個個packet(64K),packet通過Pipeline管道,實現並行儲存,提高效率。
  8. Data將Block儲存完畢後,會向NameNode彙報當前的儲存情況

3.HDFS的優缺點:

HDFS優點:

  • 由於備份機制,所以資料更加安全;
  • 由於是分散式儲存,所以適合批處理;
  • 高可用性;
  • 元資料的持久化;
  • 禁掉一些功能,使叢集更加完美(禁止修改,檔案一旦上傳成功,就不能修改block塊的大小 )。

HDFS缺點:

  • 無法毫秒級的讀寫資料;
  • 不適合儲存大量的小檔案,容易造成元資料過多,NN記憶體溢位;
    解決辦法:
    • 將小檔案合併成一個大檔案;
    • 採用聯邦機制。
  • 不能併發寫入,但是可以併發的讀。

4.搭建叢集的三種模式:

1)偽分散式:
在一臺伺服器上,啟動多個程序,分別表示各個角色,測試環境中使用。
2)完全分散式:
在多臺伺服器上,每臺伺服器啟動不同角色的程序,使用多臺伺服器組成HDFS叢集。
3)高可用完全分散式