Hadoop基礎(一):分散式檔案系統HDFS

XavierYen發表於2020-12-11


一、HDFS架構

1.HDFS設計思想

隨著網際網路產生的資料量越來越大,單個作業系統不能滿足海量資料的儲存要求,因此需要更多的作業系統磁碟來分配儲存資料,但由此帶來的問題是不方便管理和維護。分散式檔案系統的產生就是為了解決多臺機器上的資料檔案的系統。HDFS就是分散式檔案系統的一種。 對於檔案來說,HDFS也有一些獨有的設計方式。它會將需要儲存的檔案切分成多個塊,分散儲存到多臺機器上,同時針對每個檔案塊,還會在不同的機器上進行備份。這樣做帶來的好處就是沒有超大檔案,對機器效能要求不高,保證了低成本(可部署在廉價機器上)和高容錯(副本機制)。

2.HDFS組成架構

架構主要由四個部分組成,分別是HDFS Client、NameNode、DateNode和Secondary NameNode。結合Hadoop安裝環境啟動的程式,HDFS啟動的時候有NameNode、DateNode和Secondary NameNode程式。

Client:客戶端

  • 檔案切分(檔案上傳 HDFS 的時候,Client會將檔案切分成多個Block進行儲存)。
  • 與 NameNode 互動,獲取檔案的位置資訊。
  • 與 DataNode 互動,讀取或者寫入資料。
  • 提供命令來管理 HDFS,如啟動或關閉HDFS。
  • 通過命令訪問HDFS。

NameNode:後設資料節點(Master)

  • 管理 HDFS 的名稱空間(檔案目錄樹)。
  • 管理資料塊(Block)對映資訊。
  • 配置副本策略。
  • 處理客戶端讀寫請求。

DateNode:資料儲存節點(Slave)

  • 儲存實際的資料塊。
  • 執行資料塊的讀/寫操作。

Secondary NameNode:從後設資料節點(非NameNode熱備)

  • 合併NameNode的edits到fsimage檔案中。
  • 輔助NN將記憶體中後設資料資訊持久化。

3.HDFS副本機制

檔案塊

HDFS上的檔案在物理上分塊儲存(block),塊的大小可以通過配置引數(dfs.blocksize)來規定,Hadoop2.x版本中的預設大小是128M。傳輸一個由多個塊組成的檔案的時間取決於磁碟傳輸速率。舉例來講,如果定址時間是10ms,傳輸速率是100M/s,假設定址時間需要控制在傳輸時間的1%,那麼blocksize = 10ms * 100 * 100M/s = 100M。

副本機制

副本數預設為3,預設情況下,存放機制為一個在本地機架節點,一個在同一機架不同節點,一個在不同機架的節點。

4.HDFS優缺點

優點

  • 高容錯性
    檔案上傳時會自動儲存多個副本,當某個節點壞掉或者副本丟失時,可以調取其他節點的備份繼續執行任務。
  • 海量資料處理
    PB級資料規模,百萬級檔案規模。
  • 流式資料訪問
    一次寫入,多次讀取。檔案一旦寫入,不能修改只能增加。保證了資料的一致性。
  • 搭建成本較低
    可構建在廉價機器上,通過副本機制提高可靠性。

缺點

  • 不適合低延時訪問
    I/O操作頻繁
  • 不適合大量小檔案儲存
    佔用NameNode大量記憶體(一個block預設128M)
    定址時間超過讀取時間(多NN分佈在多個DataNode上)
  • 不適合併發寫入
    沒有鎖機制,一個檔案只能有一個執行緒寫,不允許多個執行緒同時寫
    沒有事務性,僅支援資料追加(append),不支援檔案的隨機修改

二、HDFS常用命令

基本語法

hdfs dfs 具體命令

常用命令

-help:檢視命令的使用方式
	hdfs dfs -help rm
-ls: 顯示目錄資訊
	hdfs dfs -ls /
-mkdir:在hdfs上建立目錄
	hdfs dfs -mkdir /bigdata
	hdfs dfs -mkdir -p /kgc/test
-moveFromLocal:從本地剪下貼上到HDFS檔案系統
	hdfs dfs -moveFromLocal  ./hello.txt  /kgc/test
-appendToFile:追加一個檔案到已經存在的檔案末尾
	hdfs dfs -appendToFile test1.txt /kgc/test/hello.txt
-cat:顯示檔案內容
	hdfs dfs -cat /kgc/test/hello.txt
-tail:顯示一個檔案的末尾
	hdfs dfs -tail /kgc/test/hello.txt
-chgrp/-chmod/-chown:linux檔案系統中的用法一樣,修改檔案所屬許可權
	hdfs dfs -chmod  666  /kgc/test/hello.txt
	hdfs dfs -chown  kgc:kgc   /kgc/test/hello.txt
-copyFromLocal:從本地檔案系統中拷貝檔案到hdfs路徑去
	hdfs dfs -copyFromLocal README.txt /
-copyToLocal:從hdfs拷貝到本地
	hdfs dfs -copyToLocal /kgc/test/hello.txt ./
-cp:從hdfs的一個路徑拷貝到hdfs的另一個路徑
	hdfs dfs -cp /kgc/test/hello.txt /hello1.txt
-mv:在hdfs目錄中移動檔案
	hdfs dfs -mv /hello1.txt /kgc/test/
-get:等同於copyToLocal,就是從hdfs下載檔案到本地
	hdfs dfs -get /kgc/test/hello.txt ./
-getmerge:合併下載多個檔案,比如hdfs的目錄 /aaa/下有多個檔案:log.1, log.2,log.3,...
	hdfs dfs -getmerge /user/kgc/test/* ./merge.txt
-put:等同於copyFromLocal
	hdfs dfs -put ./merge.txt /user/kgc/test/
-rm:刪除檔案或資料夾
	hdfs dfs -rm /user/kgc/test/merge.txt
-rmdir:刪除空目錄
	hdfs dfs -rmdir /test
-du:統計資料夾的大小資訊
	hdfs dfs -du -s -h /user/kgc/test
	hdfs dfs -du -h /user/kgc/test
-setrep:設定hdfs中檔案的副本數量
	hdfs dfs -setrep 10 /kgc/test/hello.txt

三、HDFS Java API

四、HDFS讀寫流程

寫資料流程

在這裡插入圖片描述

1.client請求
   client通過DistributeFileSystem向NameNode請求(原始檔已存在)
2.NameNode確認
   目錄不存在或使用者無操作許可權 return false
   否則 return true
3.client切分檔案並請求第一個block的DateNode列表
   client將檔案切成n個128M的Block
   client向NameNode請求第1個block的儲存DateNode列表
4.NameNode返回DateNode列表
   假如返回:dn1 dn2 dn3
5.client寫入
   a.FSDataOutputStream向dn1請求寫入
   b.dn1請求dn2,dn2請求dn3,分別建立pipeline管道
   c.dn3響應dn2,dn2響應dn1,dn1響應client
   d.Block傳輸
      d.1:client讀取(磁碟->快取)第一個block並以Packet(64kb)為單位傳輸,dn1每收到一個Packet會逐級傳輸給dn2,dn3,並放入等待應答佇列
      d.2:dn3,dn2,dn1逐級應答,並將結果反饋給client
      d.3:重複d.1~d.2直至block傳輸完成
   e.關閉FSDataOutputStream
6.client傳送complete給NameNode
7.重複3~6直至所有block傳輸完成

讀資料流程

在這裡插入圖片描述

1.client建立DistributeFileSystem的例項物件
   DistributeFileSystem dfs = FileSystem.open()
2.DistributeFileSystem向NameNode發起RPC請求獲取檔案開始部分或全部block列表
   DataNode按照Hadoop定義的叢集拓撲結構得與client的距離升序排序
   每個block包含所在的DataNode地址,如果client就是DataNode,則本地讀取
3.DistributeFileSystem向client返回支援檔案定位的輸入流物件FSDataInputStream
   FSDataInputStream中包含一個DFSInputStream物件,用來管理DataNode和NameNode之間的I/O
4.client呼叫FSDataInputStream的read()方法找到離client最近的DataNode,並連線DataNode
5.DFSInputStream依次讀取一個批次的block
   a.讀取包含檔案第一個block的最近DataNode地址
   b.重複呼叫read()方法直至第一個block全部讀完
   c.關閉第一個block的DataNode連線
   d.重複a~c直至第一個批次的block全部讀取完成
6.重複2~5直至所有批次的block讀取完成
7.關閉DFSInputStream,FSDataInputStream,DistributeFileSystem

五、NameNode和Secondary NameNode工作機制

在這裡插入圖片描述

第一階段:NameNode 啟動
(1)第一次啟動 NameNode 格式化後,建立 fsimage 和 edits 檔案。如果不是第一次啟動,直接載入編輯日誌和映象檔案到記憶體。
(2)客戶端對後設資料進行增刪改的請求。
(3)NameNode 記錄操作日誌,更新滾動日誌。
(4)NameNode 在記憶體中對資料進行增刪改查。
第二階段:Secondary NameNode 工作
(1)Secondary NameNode 詢問 NameNode 是否需要 checkpoint。直接帶回 NameNode 是否檢查結果。
(2)Secondary NameNode 請求執行 checkpoint。
(3)NameNode 滾動正在寫的 edits 日誌。
(4)將滾動前的編輯日誌和映象檔案拷貝到 Secondary NameNode。
(5)Secondary NameNode 載入編輯日誌和映象檔案到記憶體,併合並。
(6)生成新的映象檔案 fsimage.chkpoint。
(7)拷貝 fsimage.chkpoint 到 NameNode。
(8)NameNode 將 fsimage.chkpoint 重新命名成 fsimage。

六、DateNode工作機制

在這裡插入圖片描述

一個資料塊在 DataNode 上以檔案形式儲存在對應伺服器的磁碟上。
包括兩個檔案,一個是資料本身,一個是後設資料包括資料塊的長度、塊資料的校驗和,以及時間戳。
DataNode 啟動後向 NameNode 註冊通過後,週期性(1 小時)向 NameNode上報所有的塊資訊。
心跳是每 3 秒一次,心跳返回結果帶有 NameNode 給該 DataNode 的命令,如複製塊資料到另一臺機器,或刪除某個資料塊。
如果超過 10 分鐘沒有收到某個DataNode 的心跳,則認為該節點不可用。
叢集執行中可以安全加入和退出一些機器。

相關文章