體系架構
NameNode
HDFS主節點、管理者
接收用戶端(指令行、Java程式)的請求:建立目錄、上傳、下載下傳、删除資料
管理和維護HDFS的日志和元資訊
日志檔案(edits檔案)
二進制檔案,記錄用戶端所有操作,同時展現HDFS的最新狀态
$HADOOP_HOME/tmp/dfs/name/current
日志檢視器(edits viewer):把edits轉成文本(XML)格式
hdfs oev -i edits_inprogress_0000000000000000107 -o ~/a.xml
元資訊(fsimage檔案)
記錄資料塊的位置資訊、資料塊的備援資訊,不展現HDFS的最新狀态
image viewer,把fsimage檔案轉為文本或者xml
DataNode
資料節點
按資料塊儲存資料庫(1.x:64M,2.x:128M)
/root/training/hadoop-2.7.3/tmp/dfs/data/current/BP-419062579-192.168.157.111-1535553141546/current/finalized/subdir0/subdir0
資料塊備援度設定原則:一般跟資料節點的個數一樣,但是最大不要超過3
Hadoop 3.x以後,HDFS糾删碼技術,大大的節約存儲的空間(節約一半 )
SecondaryNameNode
第二名稱節點
進行日志資訊的合并
由于edits檔案記錄了最新的狀态資訊,并且随着操作越來越多,edits就會越大
把edits中的最新資訊寫到fsimage中
edits檔案就可以清空
通常和NameNode部署在一台機器上,提高下載下傳速度
什麼時候合并?HDFS發出檢查點時(checkpoint)
HDFS每隔60分鐘産生一個檢查點(fs.check.period)
edits檔案達到64M(fs.check.size)

資料傳輸
資料上傳
請求上傳資料 Distributed FileSystem.java
建立 DFSClient.java
建立RPC通信
拿到NameNode代理對象NameNodeProxies(HA)
請求建立檔案元資訊
建立檔案元資訊
将元資訊傳回給 Distributed FileSystem
建立輸出流 FSDataOutputStream
上傳資料到DataNode
根據元資訊,水準複制
資料下載下傳
請求
建立
請求得到元資訊
查找元資訊(先查緩存,再查fsimage)
傳回元資訊
建立輸入流
下載下傳資料塊
把下載下傳的資料塊合成一個檔案
進階特性
安全模式
隻讀,正常運作時off
HDFS的自我保護機制,檢查資料塊副本率
如果備援度小于設定的副本率(DataNode壞掉),就水準複制
在hdfs-default.xml中設定副本率
快照
全部檔案系統或某目錄在某時刻的鏡像,預設關閉
啟用目錄的快照功能
建立快照 -createSnapshot 目錄 快照名稱
用于以下場景
防止使用者誤操作/備份/測試/災難恢複
一般不建議使用,因為本來就有備援,再生成新的備援,太浪費空間
配額
HDFS為每個目錄配置設定的大小空間
名稱配額
設定該目錄中最多存放的檔案(目錄)個數
空間配額
設定該目錄中最大能夠存放的檔案大小
資源回收筒
預設禁用
放入/trash
資源回收筒中檔案可快速恢複
可設定一個時間,超過後檔案自動删除
使用者權限管理
功能較弱
建議使用 Hadoop Kerberos
啟動過程
網頁->Startup Progress
Loading fsimage
Loading edits
Saving checkpoint
Safe mode
底層原理
RPC(remote procedure call)
遠端過程調用(協定)
在用戶端調用伺服器端的程式
一個架構,調用者和被調用者運作在其中完成通信
調用遠端代碼,需要實作調用者和被調用者間的連接配接與通信
基于Client/Server程序間互相通信的一種同步通信形式
Client是請求服務的調用者,Server是執行Client的請求而被調用的程式
Hadoop用Java實作RPC
用戶端
伺服器端
MyRPCClient.java
View Code
MyInterface.java
MyInterfaceImpl.java
MyRPCServer.java
Java動态代理對象
如果一個類的名字有$,表示這是一個代理對象
是一種包裝設計模式
可以增強類的功能
應用:資料庫連接配接池
newProxyInstance 參數
ClassLoader 類加載器
Class<?>[ ] 真正對象實作的接口
InvocationHandler 實作接口來處理用戶端調用
MyBusiness.java
MyBusinessImpl.java
TestMain.java
指令
hdfs dfs
-ls /:檢視所有目錄下的檔案
-ls /data:檢視/data下的所有檔案
-mkdir /data:在hdfs上建立目錄/data
-cp:拷貝檔案
-rm:删除檔案
-get:複制檔案到本地