目錄
一、HDFS 概述
1.1?HDFS 產出背景及定義
1.2?HDFS 優缺點
1.3?HDFS 組成架構
1.4?HDFS 文件塊大小
二、HDFS 的Shell 操作
三、HDFS 的讀寫流程(面試重點)
3.1?HDFS 寫數據流程
3.2?HDFS 讀數據流程
四、DataNode
4.1 DataNode 的工作機制
4.2?數據完整性
一、HDFS 概述
1.1?HDFS 產出背景及定義
隨著數據量越來越大,在一個操作系統存不下所有的數據,那么就分配到更多的操作系統管理的盤中,但是不方便管理和維護,迫切需要一種系統來管理多臺機器上的文件,這就是分布式文件管理系統。HDFS 只是分布式文件管理系統中的一種。
HDFS(Hadoop Distributed File System):它是一個文件系統,用于存儲文件,通過目錄樹來定位文件;其次,它是分布式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色。
HDFS 的使用場景:適合一次寫入,多次讀出的場景。一個文件經過創建、寫入和關閉
之后就不需要改變。
1.2?HDFS 優缺點
優點分析:
1.?高容錯性:數據自動保存多個副本。它通過增加副本的形式,提高容錯性。某一個副本丟失以后,它可以自動恢復。
2.?適合處理大數據:能夠處理數據規模達到GB、TB、甚至PB級別的數據;文件規模:能夠處理百萬規模以上的文件數量,數量相當之大。
3.?可構建在廉價機器上,通過多副本機制,提高可靠性。
缺點分析:
1.?不適合低延時數據訪問,比如毫秒級的存儲數據,是做不到的。
2. 無法高效的對大量小文件進行存儲。存儲大量小文件的話,它會占用NameNode大量的內存來存儲文件目錄和塊信息。這樣是不可取的,因為NameNode的內存總是有限的;
3.?不支持并發寫入、文件隨機修改。一個文件只能有一個寫,不允許多個線程同時寫;
1.3?HDFS 組成架構
NameNode(nn):就是Master,它是一個主管、管理者。
(1)管理HDFS的名稱空間;
(2)配置副本策略;
(3)管理數據塊(Block)映射信息;
(4)處理客戶端讀寫請求。
DataNode:就是Slave。NameNode下達命令,DataNode執行實際的操作。
(1)存儲實際的數據塊;
(2)執行數據塊的讀/寫操作。
Client:就是客戶端。
(1)文件切分。文件上傳HDFS的時候,Client將文件切分成一個一個的Block,然后進行上傳;
(2)與NameNode交互,獲取文件的位置信息;
(3)與DataNode交互,讀取或者寫入數據;
(4)Client提供一些命令來管理HDFS,比如NameNode格式化;
(5)Client可以通過一些命令來訪問HDFS,比如對HDFS增刪查改操作;
Secondary NameNode:并非NameNode的熱備。當NameNode掛掉的時候,它并不能馬上替換NameNode并提供服務。
(1)輔助NameNode,分擔其工作量,比如定期合并Fsimage和Edits,并推送給NameNode ;
(2)在緊急情況下,可輔助恢復NameNode。
1.4?HDFS 文件塊大小
HDFS中的文件在物理上是分塊存儲(Block ) , 塊的大小可以通過配置參數( dfs.blocksize)來規定,默認大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。
HDFS塊的大小設置主要取決于磁盤傳輸速率。
二、HDFS 的Shell 操作
hadoop fs 具體命令 OR hdfs dfs 具體命令:
1. -ls: 顯示目錄信息
hadoop fs -ls / sanguo
命令 | 作用 | 示例 |
---|---|---|
hadoop fs -ls <路徑> | 列出目錄內容 | hadoop fs -ls /user/hadoop |
hadoop fs -mkdir <路徑> | 創建目錄 | hadoop fs -mkdir /data |
hadoop fs -put <本地路徑> <HDFS路徑> | 上傳文件 | hadoop fs -put file.txt /data/ |
hadoop fs -get <HDFS路徑> <本地路徑> | 下載文件 | hadoop fs -get /data/file.txt ./ |
hadoop fs -cat <文件路徑> | 查看文件內容 | hadoop fs -cat /data/file.txt |
hadoop fs -rm <文件路徑> | 刪除文件 | hadoop fs -rm /data/file.txt |
hadoop fs -rm -r <目錄路徑> | 遞歸刪除目錄 | hadoop fs -rm -r /data/old |
命令 | 作用 | 示例 |
---|---|---|
hadoop fs -mv <源路徑> <目標路徑> | 移動/重命名文件 | hadoop fs -mv /data/file.txt /data/newname.txt |
hadoop fs -cp <源路徑> <目標路徑> | 復制文件 | hadoop fs -cp /data/file.txt /backup/ |
hadoop fs -du -h <路徑> | 查看文件/目錄大小 | hadoop fs -du -h /data |
hadoop fs -tail <文件路徑> | 查看文件末尾內容 | hadoop fs -tail /data/log.txt |
命令 | 作用 | 示例 |
---|---|---|
hadoop fs -chmod <權限> <路徑> | 修改權限 | hadoop fs -chmod 755 /data/file.txt |
hadoop fs -chown <用戶:組> <路徑> | 修改所有者 | hadoop fs -chown hadoop:hadoop /data |
hadoop fs -stat <格式> <路徑> | 查看文件狀態 | hadoop fs -stat "%F %u %g" /data/file.txt |
三、HDFS 的讀寫流程(面試重點)
3.1?HDFS 寫數據流程
(1)客戶端通過Distributed FileSystem 模塊向NameNode 請求上傳文件,NameNode 檢查目標文件是否已存在,父目錄是否存在。
(2)NameNode 返回是否可以上傳。
(3)客戶端請求第一個 Block 上傳到哪幾個DataNode 服務器上。
(4)NameNode 返回3 個DataNode 節點,分別為dn1、dn2、dn3。
(5)客戶端通過FSDataOutputStream 模塊請求dn1 上傳數據,dn1 收到請求會繼續調用dn2,然后dn2 調用dn3,將這個通信管道建立完成。
(6)dn1、dn2、dn3 逐級應答客戶端。
(7)客戶端開始往dn1 上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet 為單位,dn1 收到一個Packet 就會傳給dn2,dn2 傳給dn3;dn1 每傳一個packet會放入一個應答隊列等待應答。
(8)當一個Block 傳輸完成之后,客戶端再次請求NameNode 上傳第二個Block 的服務器。(重復執行3-7 步)。
3.2?HDFS 讀數據流程
(1)客戶端通過DistributedFileSystem 向NameNode 請求下載文件,NameNode 通過查詢元數據,找到文件塊所在的DataNode 地址。
(2)挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取數據。
(3)DataNode 開始傳輸數據給客戶端(從磁盤里面讀取數據輸入流,以Packet 為單位來做校驗)。
(4)客戶端以Packet 為單位接收,先在本地緩存,然后寫入目標文件。
四、DataNode
4.1 DataNode 的工作機制
(1)一個數據塊在DataNode 上以文件形式存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
(2)DataNode 啟動后向NameNode 注冊,通過后,周期性(6 小時)的向NameNode 上報所有的塊信息。
(3)心跳是每3 秒一次,心跳返回結果帶有NameNode 給該DataNode 的命令如復制塊數據到另一臺機器,或刪除某個數據塊。如果超過10 分鐘沒有收到某個DataNode 的心跳,則認為該節點不可用。
(4)集群運行中可以安全加入和退出一些機器。
4.2?數據完整性
DataNode 節點上的數據損壞了,卻沒有發現,是否也很危險,那么如何解決呢?如下是DataNode 節點保證數據完整性的方法。
(1)當DataNode 讀取Block 的時候,它會計算CheckSum。
(2)如果計算后的CheckSum,與Block 創建時值不一樣,說明Block 已經損壞。
(3)Client 讀取其他DataNode 上的Block。
(4)常見的校驗算法crc(32),md5(128),sha1(160)
(5)DataNode 在其文件創建后周期驗證CheckSum。