HDFS應用場景、原理、基本架構及使用方法概述

monkey-jie發表於2018-10-23

以下主要參考小象科技的董西成老師的視訊

1. HDFS概述
2. HDFS基本架構和原理
3. HDFS程式設計
4. HDFS 2.0新特性

一、HDFS概述

HDFS是什麼?
1、源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版
2、Hadoop Distributed File System,易於擴充套件的分散式檔案系統,執行在大量普通廉價機器上,提供容錯機制,為大量使用者提供效能不錯的檔案存取服務

HDFS優點

1、高容錯性
資料自動儲存多個副本,副本丟失後,自動恢復
2、適合批處理
移動計算而非資料, 資料位置暴露給計算框架
3、適合大資料處理
GB、TB、甚至PB級資料,百萬規模以上的檔案數量,10K+節點規模
4、流式檔案訪問
一次性寫入,多次讀取,保證資料一致性
5、可構建在廉價機器上
通過多副本提高可靠性,提供了容錯和恢復機制

HDFS缺點
1、低延遲資料訪問
比如毫秒級,低延遲與高吞吐率
2、小檔案存取
佔用NameNode大量記憶體,尋道時間超過讀取時間
3、併發寫入、檔案隨機修改
一個檔案只能有一個寫者,僅支援append

二、HDFS基本架構和原理

HDFS架構

1、Namenode
• 主Master(只有一個)
• 管理HDFS的名稱空間
• 管理資料塊對映資訊
• 配置副本策略
• 處理客戶端讀寫請求
2、SecondNameNode
• NameNode的熱備;
• 定期合併fsimage和fsedits,推送給NameNode;
• 當Active NameNode出現故障時,快速切換為新的NameNode。
3、Datanode
• Slave(有多個)
• 儲存實際的資料塊
• 執行資料塊讀/寫
4、Client
• 檔案切分
• 與NameNode互動,獲取檔案位置資訊;
• 與DataNode互動,讀取或者寫入資料;
• 管理HDFS;
• 訪問HDFS。

HDFS資料塊(block)
1、檔案被切分成固定大小的資料塊
預設資料塊大小為64MB,可配置,若檔案大小不到64MB,則單獨存成一個block
2、為何資料塊如此之大
資料傳輸時間超過尋道時間(高吞吐率)
3、一個檔案儲存方式
按大小被切分成若干個block,儲存到不同節點上,預設情況下每個block有三個副本

HDFS副本放置策略

問題:一個檔案劃分成多個block,每個block存多份,如何為每個block選擇節點儲存這幾份資料?
Block副本放置策略
副本1: 同Client的節點上,
副本2: 不同機架中的節點上,
副本3: 與第二個副本同一機架的另一個節點上,
其他副本:隨機挑選

HDFS可靠性策略

1、檔案完整性:CRC32校驗,用其他副本取代損壞檔案
2、Heartbeat:Datanode 定期向Namenode發heartbeat
3、後設資料資訊:FSImage(檔案系統映象)、Editlog(操作日誌,多份儲存,主備NameNode實時切換

HDFS不適合儲存小檔案

1、元資訊儲存在NameNode記憶體中:一個節點的記憶體是有限的
2、存取大量小檔案消耗大量的尋道時間:類比拷貝大量小檔案與拷貝同等大小的一個大檔案
3、NameNode儲存block數目是有限的:一個block元資訊消耗大約150 byte記憶體,儲存1億個block,大約需要20GB記憶體,如果一個檔案大小為10K,則1億個檔案大小僅為1TB(但要消耗掉NameNode 20GB記憶體)

三、HDFS程式設計

HDFS訪問方式
1、HDFS Shell命令
2、HDFS Java API
3、HDFS REST API
4、HDFS Fuse:實現了fuse協議
5、HDFS lib hdfs:C/C++訪問介面
6、HDFS 其他語言程式設計API:使用thrift實現,支援C++、Python、php、C#等語言

HDFS Shell命令—檔案操作命令

1、將本地檔案上傳到HDFS上

bin/hadoop fs -copyFromLocal /local/data /hdfs/data

2、刪除檔案/目錄

bin/hadoop fs -rmr /hdfs/data

3、建立目錄

bin/hadoop fs -mkdir /hdfs/data

HDFS Shell命令—管理指令碼

1、在sbin目錄下

start-all.sh
start-dfs.sh
start-yarn.sh
hadoop-deamon(s).sh

2、單獨啟動某個服務

hadoop-deamon.sh start namenode
hadoop-deamons.sh start namenode(通過SSH登入到各個節點)

HDFS Shell命令—檔案管理命令fsck

1、檢查hdfs中檔案的健康狀況
2、查詢缺失的塊以及過少或過多副本的塊
3、檢視一個檔案的所有資料塊位置
4、刪除損壞的資料塊

HDFS Shell命令—資料均衡器balancer

1、資料塊重分佈

bin/start-balancer.sh -threshold <percentage ofdisk capacity>

2、percentage of disk capacity

HDFS達到平衡狀態的磁碟使用率偏差值,值越低各節點越平衡,但消耗時間也更長

HDFS Shell命令—設定目錄份額

1、限制一個目錄最多使用磁碟空間

bin/hadoop dfsadmin -setSpaceQuota 1t /user/username

2、限制一個目錄包含的最多子目錄和檔案數目

bin/hadoop dfsadmin -setQuota 10000 /user/username

HDFS Shell命令—增加/移除節點

1、加入新的datanode
步驟1:將已存在datanode上的安裝包(包括配置檔案等)拷貝到新datanode上;
步驟2:啟動新datanode:

sbin/hadoop-deamon.sh start datanode

2、移除舊datanode
步驟1:將datanode加入黑名單,並更新黑名單,在
NameNode上,將datanode的host或者ip加入配置選項
dfs.hosts.exclude指定的檔案中
步驟2:移除datanode:

bin/hadoop dfsadmin -refreshNodes

HDFS Java API介紹

1、Configuration類:該類的物件封裝了配置資訊,這些配置資訊來自core-*.xml;
2、FileSystem類:檔案系統類,可使用該類的方法對檔案/目錄進行操作。一般通過FileSystem的靜態方法get獲得一個檔案系統物件;
3、FSDataInputStream和FSDataOutputStream類:HDFS中的輸入輸出流。分別通過FileSystem的open方法和create方法獲得。
以上類均來自java包:org.apache.hadoop.fs

HDFS Java程式舉例
1、將本地檔案拷貝到HDFS上

Configuration config = new Configuration();
FileSystem hdfs = FileSystem.get(config);
Path srcPath = new Path(srcFile);
Path dstPath = new Path(dstFile);
hdfs.copyFromLocalFile(srcPath, dstPath);

2、建立HDFS檔案

//byte[] buff – 檔案內容
 Configuration config = new Configuration();
 FileSystem hdfs = FileSystem.get(config);
 Path path = new Path(fileName);
 FSDataOutputStream outputStream = hdfs.create(path);
 outputStream.write(buff, 0, buff.length);

其他的就不在這詳述了,有興趣自己去找資料看看

四、Hadoop 2.0新特性

1、NameNode HA
2、NameNode Federation
3、HDFS 快照(snapshot)
4、HDFS 快取(in-memory cache)
5、HDFS ACL
6、異構層級儲存結構(Heterogeneous Storage
hierarchy)

異構層級儲存結構—背景
1、HDFS將所有儲存介質抽象成效能相同的Disk

<property>
 <name>dfs.datanode.data.dir</name>
 <value>/dir0,/dir1,/dir2,/dir3</value>
</property>

2、儲存介質種類繁多,一個叢集中存在多種異構介質:磁碟、SSD、RAM等
3、多種型別的任務企圖同時執行在同一個Hadoop叢集中
批處理,互動式處理,實時處理,不同效能要求的資料,最好儲存在不同類別的儲存介質上

異構層級儲存結構—原理
1、每個節點是由多種異構儲存介質構成的

<property>
 <name>dfs.datanode.data.dir</name>
 <value>[disk]/dir0,[disk]/dir1,[ssd]/dir2,[ssd]/dir3</value>
</property>

HDFS僅提供了一種異構儲存結構,並不知道儲存介質的效能;
HDFS為使用者提供了API,以控制目錄/檔案寫到什麼介質上;
HDFS為管理員提供了管理工具,可限制每個使用者對每種介質的可使用份額;但目前完成度不高

HDFS ACL—背景:現有許可權管理的侷限性
HDFS ACL—基於POSIX ACL的實現
啟動該功能:將dfs.namenode.acls.enabled置為true
使用方法;

hdfs dfs -setfacl -m user:tom:rw- /bank/exchange
hdfs dfs -setfacl -m user:lucy:rw- /bank/exchange
hdfs dfs -setfacl -m group:team2:r-- /bank/exchange
hdfs dfs -setfacl -m group:team3:r-- /bank/exchange

HDFS快照—背景
1、HDFS上檔案和目錄是不斷變化的,快照可以幫助使用者儲存某個時刻的資料;
2、HDFS快照的作用:防止使用者誤操作刪除資料,資料備份

HDFS快照—基本使用方法
1、一個目錄可以產生快照,當且僅當它是Snapshottable;

bin/hdfs dfsadmin allowSnapshot <path>

2、建立/刪除快照

bin/hdfs dfs -createSnapshot <path> [<snapshotName>]
bin/hdfs dfs -deleteSnapshot<path> [<snapshotName>]

3、快照存放位置和特點
特點:快照是隻讀的,不可修改
快照位置:

<snapshottable_dir_path>/.snapshot
<snapshottable_dir_path>/.snapshot/snap_name

HDFS快取—背景
1、HDFS自身不提供資料快取功能,而是使用OS快取:
容易記憶體浪費,eg.一個block三個副本同時被快取
2、多種計算框架共存,均將HDFS作為共享儲存系統
MapReduce:離線計算,充分利用磁碟
Impala:低延遲計算,充分利用記憶體
Spark:記憶體計算框架
3、HDFS應讓多種混合計算型別共存一個叢集中
合理的使用記憶體、磁碟等資源,比如,高頻訪問的特點檔案應被儘可能長期快取,防止置換到磁碟上

HDFS快取—實現情況
1、使用者需通過命令顯式的將一個目錄或檔案加入/移除快取
不支援塊級別的快取,不支援自動化快取,可設定快取失效時間
2、快取目錄:僅對一級檔案進行快取:不會遞迴快取所有檔案與目錄
3、以pool的形式組織快取資源:
藉助YARN的資源管理方式,將快取劃分到不同pool中
每個pool有類linux許可權管理機制、快取上限、失效時間等
4、獨立管理記憶體,未與資源管理系統YARN整合:
使用者可為每個DN設定快取大小,該值獨立於YARN

相關文章