1. 程式人生 > >HDFS應用場景、原理、基本架構及使用方法概述

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

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

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