Hadoop-02 HDFS簡介 讀寫文件

Hadoop - HDFS

簡介
Hadoop Distributed File System,分佈式文件系統
架構
在這裏插入圖片描述

  • Block數據塊

基本存儲單位,一般大小爲64M
配置大的塊主要原因

  1. 減少搜尋時間,一般硬盤傳輸速率比尋道時間要快,大的塊可以減少尋道時間;
  2. 減少管理塊的數據開銷,每個塊都需要在NameNode上有對應的記錄;
  3. 對數據塊進行讀寫,減少建立網絡的連接成本

一個大文件會被拆分成一個個的塊,然後存儲於不同的機器。如果一個文件少於Block大小,那麼實際佔用的空間爲其文件的大小。

基本的讀寫單位,類似於磁盤的頁,每次都是讀寫一個塊

每個塊都會被複制到多臺機器,默認複製3份

  • NameNode

存儲文件的metadata,運行時所有數據都保存到內存,整個HDFS可存儲的文件數受限於NameNode的內存大小

一個Block在NameNode中對應一條記錄(一般一個block佔用150字節),如果是大量的小文件,會消耗大量內存。同時map task的數量是由splits來決定的,所以用MapReduce處理大量的小文件時,就會產生過多的map task,線程管理開銷將會增加作業時間。處理大量小文件的速度遠遠小於處理同等大小的大文件的速度。因此Hadoop建議存儲大文件

數據會定時保存到本地磁盤,但不保存block的位置信息,而是由DataNode註冊時上報和運行時維護(NameNode中與DataNode相關的信息並不保存到NameNode的文件系統中,而是NameNode每次重啓後,動態重建)

NameNode失效則整個HDFS都失效了,所以要保證NameNode的可用性

  • Secondary NameNode

定時與NameNode進行同步(定期合併文件系統鏡像和編輯日誌,然後把合併後的傳給NameNode,替換其鏡像,並清空編輯日誌,類似於CheckPoint機制),但NameNode失效後仍需要手工將其設置成主機

  • DataNode

保存具體的block數據

負責數據的讀寫操作和複製操作

DataNode啓動時會向NameNode報告當前存儲的數據塊信息,後續也會定時報告修改信息

DataNode之間會進行通信,複製數據塊,保證數據的冗餘性

HDFS-寫文件

在這裏插入圖片描述

  1. .客戶端將文件寫入本地磁盤的HDFS Client文件中

  2. 當臨時文件大小達到一個block大小時,HDFS client通知NameNode,申請寫入文件

  3. NameNode在HDFS的文件系統中創建一個文件,並把該block id和要寫入的DataNode的列表返回給客戶端

  4. 客戶端收到這些信息後,將臨時文件寫入DataNodes

    4.1 客戶端將文件內容寫入第一個DataNode(一般以4kb爲單位進行傳輸)

    4.2 第一個DataNode接收後,將數據寫入本地磁盤,同時也傳輸給第二個DataNode

    4.3 依此類推到最後一個DataNode,數據在DataNode之間是通過pipeline的方式進行復制的

    4.4 後面的DataNode接收完數據後,都會發送一個確認給前一個DataNode,最終第一個DataNode返回確認給客戶端

    4.5 當客戶端接收到整個block的確認後,會向NameNode發送一個最終的確認信息

    4.6 如果寫入某個DataNode失敗,數據會繼續寫入其他的DataNode。然後NameNode會找另外一個好的DataNode繼續複製,以保證冗餘性

    4.7 每個block都會有一個校驗碼,並存放到獨立的文件中,以便讀的時候來驗證其完整性

  5. 文件寫完後(客戶端關閉),NameNode提交文件(這時文件纔可見,如果提交前,NameNode垮掉,那文件也就丟失了。fsync:只保證數據的信息寫到NameNode上,但並不保證數據已經被寫到DataNode中)

Rack aware(機架感知)

通過配置文件指定機架名和DNS的對應關係

假設複製參數是3,在寫入文件時,會在本地的機架保存一份數據,然後在另外一個機架內保存兩份數據(同機架內的傳輸速度快,從而提高性能)

整個HDFS的集羣,最好是負載平衡的,這樣才能儘量利用集羣的優勢

HDFS-讀文件

在這裏插入圖片描述

  1. 客戶端向NameNode發送讀取請求
  2. NameNode返回文件的所有block和這些block所在的DataNodes(包括複製節點)
  3. 客戶端直接從DataNode中讀取數據,如果該DataNode讀取失敗(DataNode失效或校驗碼不對),則從複製節點中讀取(如果讀取的數據就在本機,則直接讀取,否則通過網絡讀取)

HDFS-可靠性

DataNode可以失效

DataNode會定時發送心跳到NameNode。如果一段時間內NameNode沒有收到DataNode的心跳消息,則認爲其失效。此時NameNode就會將該節點的數據(從該節點的複製節點中獲取)複製到另外的DataNode中

數據可以毀壞

無論是寫入時還是硬盤本身的問題,只要數據有問題(讀取時通過校驗碼來檢測),都可以通過其他的複製節點讀取,同時還會再複製一份到健康的節點中

NameNode不可靠

HDFS - 命令工具

fsck: 檢查文件的完整性

start-balancer.sh: 重新平衡HDFS

hdfs dfs -copyFromLocal 從本地磁盤複製文件到HDFS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章