天天看點

HDFS原理總結

HDFS:架構圖

HDFS原理總結

1.block:檔案存儲到hdfs上時被切分成若幹個資料塊,每個block資料塊的大小預設128M(hdfs-1.x預設:64M)

​ 如果檔案不到128M,則可以單獨存成一個block。每一個塊都有3個副本(一共三個)存儲在datanode

​ 上。3個副本的存儲政策:第一個存儲在目前機架上的節點選擇磁盤不滿、cpu不忙的節點,第二個存儲

​ 在不同機架上,第三個存儲在同第二個機架的不同節點。

**2.datanode:**存放資料塊的資訊,當datanode啟動時向namenode彙報塊資訊,保持和namenode的心跳機制

​ 當namenode超過10分鐘沒有收到datanode的彙報資訊時,則會認為改datanode丢失,此時

​ namenode會尋找一個新的datanode并從擁有改block塊的其他副本上拷貝block塊至新的

​ datanode上。

**3.namenode:**namenode等待接受用戶端的寫入寫出,同時接受datanode的彙報資訊,與datanode保持着心

​ 條機制。namenode上儲存着目錄樹,其中包括檔案資訊,檔案分割成具體block塊的資訊,

​ 以及每一個block塊歸屬datanode的資訊。這些資訊不會被持久化,需要每次啟動時datanode的彙報

​ namenode使用記憶體作為存儲媒體。優點:計算速度快 缺點:記憶體中的資料掉電易失、記憶體的大小限制

​ namenode的存儲量,如果記憶體被占滿将無法存儲資料。當namenode啟動的時候會在fsimage的基礎上

​ 執行一遍日志檔案,然後建立一個新的空的fsimage。namenode的每一個操作都會記錄在日志檔案裡,

​ 長時間造成日志檔案過大,導緻namenode啟動時間過長,此時出現了secondarynode。同時nameno

​ de啟動時會進入安全模式,當namenode和datanode進行完心跳機制後,namenode上存儲玩所有的

​ datanode的中繼資料資訊,并進行檢測完成後,namenode解除安全模式可進行正常的讀寫操作。

​ secondarynamenode日志合并圖:

HDFS原理總結

4.secondarynamenode

​ sn會定時将fsimage和edites檔案合并(觸發點:預設日志檔案64M,或者1個小時,這個參數可以調)

​ 當觸發條件時,sn會将fsimage從namenode上拷貝一份到sn上,将日志檔案拷貝到sn上,進行合并,

​ 生成fsimage.ckpt 将其拷貝給namenode,namenode會将fsimage覆寫原fsimage。

hdfs的讀寫流程:

  1. hdfs的讀流程
    HDFS原理總結

1.用戶端會發一個rpc請求到namenode上,namenode會傳回要讀取檔案的block塊資訊,和block塊所在 datanode的資訊。

2.用戶端得到這個資訊後會建立一個fsdatainputstream對象

3.用戶端會選擇距離用戶端最近的datanode來讀取block,如果用戶端本身就是datanode那麼将從本地讀取

每次讀取完一個block塊時都會進行checksum驗證,如果讀取datanode出錯時,用戶端便會通知namenode

然後再從下一個擁有改block塊的datanode讀取。

4.當讀取完後會關閉與datanode的連結,并尋找下一個要讀取的block塊的最佳datanode

5.當讀取完清單的block後,檔案還沒有結束,會向namenode再次發送資訊,擷取下一批block資訊。

2.hdfs的寫操作

HDFS原理總結

1…用戶端會發一個rpc請求到namenode上,namenode會檢查要建立的檔案是否存在,建立是否有權限進行建立如果成功則會建立一個檔案,如果失敗則會抛出一個異常,并且建立一條記錄

2.用戶端得到這個資訊後會建立一個fsdataoutputstream對象

3.要寫入的檔案會被切分成多個packets,并且内部使用dataqueue資料隊列的形式,同時用戶端會向namenode申請新的blocks擷取這些适合存儲的datanode清單

4.此時用戶端會和datanode建立pipeline,将一個個packets寫入datanode中一個packets64b大小,當寫入一個packets第一個datanode會向第二個datanode寫入以此類推,同時用戶端還繼續給第一個datanode發送packets

當一個packets成功存儲後會犯一個ack packets 通過pipeline傳給用戶端,此時用戶端(内部維護着一個ack queue)便會删除其内的用戶端通過ack queue删除相對應的ack packet

個ack packets 通過pipeline傳給用戶端,此時用戶端(内部維護着一個ack queue)便會删除其内的用戶端通過ack queue删除相對應的ack packet

5.如果傳輸過程中,某個datanode出現故障,那麼目前的pipeline會被關閉,出現故障的datanode從目前的pineline中移除,剩餘的block會繼續給剩下的datanode繼續以pipeline形式進行傳輸,同時namenode會配置設定一個新的datanode,進行拷貝已經傳輸完成的datanode上的資料

繼續閱讀