天天看點

[DB] HDFS

體系架構

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)

[DB] HDFS

資料傳輸

資料上傳

請求上傳資料 Distributed FileSystem.java

建立 DFSClient.java

建立RPC通信

拿到NameNode代理對象NameNodeProxies(HA)

請求建立檔案元資訊

建立檔案元資訊

将元資訊傳回給 Distributed FileSystem

建立輸出流 FSDataOutputStream

上傳資料到DataNode

根據元資訊,水準複制

資料下載下傳

請求

建立

請求得到元資訊

查找元資訊(先查緩存,再查fsimage)

傳回元資訊

建立輸入流

下載下傳資料塊

把下載下傳的資料塊合成一個檔案

[DB] HDFS
[DB] HDFS

進階特性

安全模式

隻讀,正常運作時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

[DB] HDFS
[DB] HDFS

View Code

MyInterface.java

[DB] HDFS
[DB] HDFS

MyInterfaceImpl.java

[DB] HDFS
[DB] HDFS

MyRPCServer.java

[DB] HDFS
[DB] HDFS
[DB] HDFS
[DB] HDFS
[DB] HDFS
[DB] HDFS

 Java動态代理對象

如果一個類的名字有$,表示這是一個代理對象

是一種包裝設計模式

可以增強類的功能

應用:資料庫連接配接池

newProxyInstance 參數

ClassLoader 類加載器

Class<?>[ ] 真正對象實作的接口

InvocationHandler 實作接口來處理用戶端調用

MyBusiness.java

[DB] HDFS
[DB] HDFS

MyBusinessImpl.java

[DB] HDFS
[DB] HDFS

TestMain.java

[DB] HDFS
[DB] HDFS
[DB] HDFS

指令

hdfs dfs

-ls /:檢視所有目錄下的檔案

-ls /data:檢視/data下的所有檔案

-mkdir /data:在hdfs上建立目錄/data

-cp:拷貝檔案

-rm:删除檔案

-get:複制檔案到本地