HDFS學習筆記

Thinkgamer_gyt發表於2015-11-29

1.1、資料塊(block)

  • HDFS(Hadoop Distributed File System)預設的最基本的儲存單位是64M的資料塊。
  • 和普通檔案系統相同的是,HDFS中的檔案是被分成64M一塊的資料塊儲存的。
  • 不同於普通檔案系統的是,HDFS中,如果一個檔案小於一個資料塊的大小,並不佔用整個資料塊儲存空間。

1.2、後設資料節點(Namenode)和資料節點(datanode)

  • 後設資料節點用來管理檔案系統的名稱空間
    • 其將所有的檔案和資料夾的後設資料儲存在一個檔案系統樹中。
    • 這些資訊也會在硬碟上儲存成以下檔案:名稱空間映象(namespace image)及修改日誌(edit log)
    • 其還儲存了一個檔案包括哪些資料塊,分佈在哪些資料節點上。然而這些資訊並不儲存在硬碟上,而是在系統啟動的時候從資料節點收集而成的。
  • 資料節點是檔案系統中真正儲存資料的地方。
    • 客戶端(client)或者後設資料資訊(namenode)可以向資料節點請求寫入或者讀出資料塊。
    • 其週期性的向後設資料節點回報其儲存的資料塊資訊。
  • 從後設資料節點(secondary namenode)
    • 從後設資料節點並不是後設資料節點出現問題時候的備用節點,它和後設資料節點負責不同的事情。
    • 其主要功能就是週期性將後設資料節點的名稱空間映象檔案和修改日誌合併,以防日誌檔案過大。這點在下面會相信敘述。
    • 合併過後的名稱空間映象檔案也在從後設資料節點儲存了一份,以防後設資料節點失敗的時候,可以恢復。

1.2.1、後設資料節點資料夾結構


  • VERSION檔案是java properties檔案,儲存了HDFS的版本號。
    • layoutVersion是一個負整數,儲存了HDFS的持續化在硬碟上的資料結構的格式版本號。
    • namespaceID是檔案系統的唯一識別符號,是在檔案系統初次格式化時生成的。
    • cTime此處為0
    • storageType表示此資料夾中儲存的是後設資料節點的資料結構。

namespaceID=1232737062

cTime=0

storageType=NAME_NODE

layoutVersion=-18

1.2.2、檔案系統名稱空間映像檔案及修改日誌

  • 當檔案系統客戶端(client)進行寫操作時,首先把它記錄在修改日誌中(edit log)
  • 後設資料節點在記憶體中儲存了檔案系統的後設資料資訊。在記錄了修改日誌後,後設資料節點則修改記憶體中的資料結構。
  • 每次的寫操作成功之前,修改日誌都會同步(sync)到檔案系統。
  • fsimage檔案,也即名稱空間映像檔案,是記憶體中的後設資料在硬碟上的checkpoint,它是一種序列化的格式,並不能夠在硬碟上直接修改。
  • 同資料的機制相似,當後設資料節點失敗時,則最新checkpoint的後設資料資訊從fsimage載入到記憶體中,然後逐一重新執行修改日誌中的操作。
  • 從後設資料節點就是用來幫助後設資料節點將記憶體中的後設資料資訊checkpoint到硬碟上的
  • checkpoint的過程如下:
    • 從後設資料節點通知後設資料節點生成新的日誌檔案,以後的日誌都寫到新的日誌檔案中。
    • 從後設資料節點用http get從後設資料節點獲得fsimage檔案及舊的日誌檔案。
    • 從後設資料節點將fsimage檔案載入到記憶體中,並執行日誌檔案中的操作,然後生成新的fsimage檔案。
    • 從後設資料節點獎新的fsimage檔案用http post傳回後設資料節點
    • 後設資料節點可以將舊的fsimage檔案及舊的日誌檔案,換為新的fsimage檔案和新的日誌檔案(第一步生成的),然後更新fstime檔案,寫入此次checkpoint的時間。
    • 這樣後設資料節點中的fsimage檔案儲存了最新的checkpoint的後設資料資訊,日誌檔案也重新開始,不會變的很大了。


1.2.3、從後設資料節點的目錄結構


1.2.4、資料節點的目錄結構


  • 資料節點的VERSION檔案格式如下:

namespaceID=1232737062

storageID=DS-1640411682-127.0.1.1-50010-1254997319480

cTime=0

storageType=DATA_NODE

layoutVersion=-18

  • blk_<id>儲存的是HDFS的資料塊,其中儲存了具體的二進位制資料。
  • blk_<id>.meta儲存的是資料塊的屬性資訊:版本資訊,型別資訊,和checksum
  • 當一個目錄中的資料塊到達一定數量的時候,則建立子資料夾來儲存資料塊及資料塊屬性資訊。

二、資料流(data flow)

2.1、讀檔案的過程

  • 客戶端(client)用FileSystem的open()函式開啟檔案
  • DistributedFileSystem用RPC呼叫後設資料節點,得到檔案的資料塊資訊。
  • 對於每一個資料塊,後設資料節點返回儲存資料塊的資料節點的地址。
  • DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取資料。
  • 客戶端呼叫stream的read()函式開始讀取資料。
  • DFSInputStream連線儲存此檔案第一個資料塊的最近的資料節點。
  • Data從資料節點讀到客戶端(client)
  • 當此資料塊讀取完畢時,DFSInputStream關閉和此資料節點的連線,然後連線此檔案下一個資料塊的最近的資料節點。
  • 當客戶端讀取完畢資料的時候,呼叫FSDataInputStream的close函式。
  • 在讀取資料的過程中,如果客戶端在與資料節點通訊出現錯誤,則嘗試連線包含此資料塊的下一個資料節點。
  • 失敗的資料節點將被記錄,以後不再連線。


2.2、寫檔案的過程

  • 客戶端呼叫create()來建立檔案
  • DistributedFileSystem用RPC呼叫後設資料節點,在檔案系統的名稱空間中建立一個新的檔案。
  • 後設資料節點首先確定檔案原來不存在,並且客戶端有建立檔案的許可權,然後建立新檔案。
  • DistributedFileSystem返回DFSOutputStream,客戶端用於寫資料。
  • 客戶端開始寫入資料,DFSOutputStream將資料分成塊,寫入data queue。
  • Data queue由Data Streamer讀取,並通知後設資料節點分配資料節點,用來儲存資料塊(每塊預設複製3塊)。分配的資料節點放在一個pipeline裡。
  • Data Streamer將資料塊寫入pipeline中的第一個資料節點。第一個資料節點將資料塊傳送給第二個資料節點。第二個資料節點將資料傳送給第三個資料節點。
  • DFSOutputStream為發出去的資料塊儲存了ack queue,等待pipeline中的資料節點告知資料已經寫入成功。
  • 如果資料節點在寫入的過程中失敗:
    • 關閉pipeline,將ack queue中的資料塊放入data queue的開始。
    • 當前的資料塊在已經寫入的資料節點中被後設資料節點賦予新的標示,則錯誤節點重啟後能夠察覺其資料塊是過時的,會被刪除。
    • 失敗的資料節點從pipeline中移除,另外的資料塊則寫入pipeline中的另外兩個資料節點。
    • 後設資料節點則被通知此資料塊是複製塊數不足,將來會再建立第三份備份。
  • 當客戶端結束寫入資料,則呼叫stream的close函式。此操作將所有的資料塊寫入pipeline中的資料節點,並等待ack queue返回成功。最後通知後設資料節點寫入完畢。


相關文章