Hadoop - HDFS
簡介
Hadoop Distributed File System,分佈式文件系統
架構
- Block數據塊
基本存儲單位,一般大小爲64M
配置大的塊主要原因:
- 減少搜尋時間,一般硬盤傳輸速率比尋道時間要快,大的塊可以減少尋道時間;
- 減少管理塊的數據開銷,每個塊都需要在NameNode上有對應的記錄;
- 對數據塊進行讀寫,減少建立網絡的連接成本
一個大文件會被拆分成一個個的塊,然後存儲於不同的機器。如果一個文件少於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-寫文件
-
.客戶端將文件寫入本地磁盤的HDFS Client文件中
-
當臨時文件大小達到一個block大小時,HDFS client通知NameNode,申請寫入文件
-
NameNode在HDFS的文件系統中創建一個文件,並把該block id和要寫入的DataNode的列表返回給客戶端
-
客戶端收到這些信息後,將臨時文件寫入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都會有一個校驗碼,並存放到獨立的文件中,以便讀的時候來驗證其完整性
-
文件寫完後(客戶端關閉),NameNode提交文件(這時文件纔可見,如果提交前,NameNode垮掉,那文件也就丟失了。fsync:只保證數據的信息寫到NameNode上,但並不保證數據已經被寫到DataNode中)
Rack aware(機架感知)
通過配置文件指定機架名和DNS的對應關係
假設複製參數是3,在寫入文件時,會在本地的機架保存一份數據,然後在另外一個機架內保存兩份數據(同機架內的傳輸速度快,從而提高性能)
整個HDFS的集羣,最好是負載平衡的,這樣才能儘量利用集羣的優勢
HDFS-讀文件
- 客戶端向NameNode發送讀取請求
- NameNode返回文件的所有block和這些block所在的DataNodes(包括複製節點)
- 客戶端直接從DataNode中讀取數據,如果該DataNode讀取失敗(DataNode失效或校驗碼不對),則從複製節點中讀取(如果讀取的數據就在本機,則直接讀取,否則通過網絡讀取)
HDFS-可靠性
DataNode可以失效
DataNode會定時發送心跳到NameNode。如果一段時間內NameNode沒有收到DataNode的心跳消息,則認爲其失效。此時NameNode就會將該節點的數據(從該節點的複製節點中獲取)複製到另外的DataNode中
數據可以毀壞
無論是寫入時還是硬盤本身的問題,只要數據有問題(讀取時通過校驗碼來檢測),都可以通過其他的複製節點讀取,同時還會再複製一份到健康的節點中
NameNode不可靠
HDFS - 命令工具
fsck: 檢查文件的完整性
start-balancer.sh: 重新平衡HDFS
hdfs dfs -copyFromLocal 從本地磁盤複製文件到HDFS