一、HDFS是什麼
源自于Google的GFS論文
發表于2003年10月
HDFS是GFS克隆版
Hadoop Distributed File System
易于擴充的分布式檔案系統
運作在大量普通廉價機器上,提供容錯機制
為大量使用者提供性能不錯的檔案存取服務
1、HDFS優點
高容錯性
資料自動儲存多個副本
副本丢失後,自動恢複
适合批處理
移動計算而非資料
資料位置暴露給計算架構
适合大資料處理
GB、TB、甚至PB級資料
百萬規模以上的檔案數量
10K+節點規模
流式檔案通路
一次性寫入,多次讀取
保證資料一緻性
可建構在廉價機器上
通過多副本提高可靠性
提供了容錯和恢複機制
2、HDFS缺點
低延遲資料通路
比如毫秒級
低延遲與高吞吐率
小檔案存取
占用NameNode大量記憶體
尋道時間超過讀取時間
并發寫入、檔案随機修改
一個檔案隻能有一個寫者
僅支援append
3、HDFS設計思想
4、HDFS資料塊(block)
檔案被切分成固定大小的資料塊
預設資料塊大小為64MB,可配置
若檔案大小不到64MB,則單獨存成一個block
為何資料塊如此之大
資料傳輸時間超過尋道時間(高吞吐率)
一個檔案存儲方式
按大小被切分成若幹個block,存儲到不同節點上
預設情況下每個block有三個副本
5、HDFS寫流程
6、HDFS讀流程 7、HDFS典型實體拓撲 8、HDFS副本放置政策 9、HDFS可靠性政策10、HDFS不适合存儲小檔案
元資訊存儲在NameNode記憶體中
一個節點的記憶體是有限的
存取大量小檔案消耗大量的尋道時間
類比拷貝大量小檔案與拷貝同等大小的一個大檔案
NameNode存儲block數目是有限的
一個block元資訊消耗大約150 byte記憶體
存儲1億個block,大約需要20GB記憶體
如果一個檔案大小為10K,則1億個檔案大小僅為1TB(但要消耗掉NameNode 20GB記憶體)
二、HDFS通路方式
HDFS Shell指令
HDFS Java API
HDFS REST API
HDFS Fuse:實作了fuse協定
HDFS lib hdfs:C/C++通路接口
HDFS 其他語言程式設計API
使用thrift實作 ** 支援C++、Python、php、C#等語言
HDFS Shell指令—概覽
請點選此處輸入圖檔描述
将本地檔案上傳到HDFS上
bin/hadoop fs -copyFromLocal /local/data /hdfs/data
删除檔案/目錄
bin/hadoop fs -rmr /hdfs/data
建立目錄
bin/hadoop fs -mkdir /hdfs/data
HDFS Shell指令—管理腳本
bin/hadoop dfsadmin
在sbin目錄下
start-all.sh
start-dfs.sh
start-yarn.sh
hadoop-deamon(s).sh
單獨啟動某個服務
hadoop-deamon.sh start namenode
hadoop-deamons.sh start namenode(通過SSH登入到各個節點)
HDFS Shell指令—檔案管理指令fsck
檢查hdfs中檔案的健康狀況
查找缺失的塊以及過少或過多副本的塊
檢視一個檔案的所有資料塊位置
删除損壞的資料塊
HDFS Shell指令—資料均衡器balancer
資料塊重分布
bin/start-balancer.sh -threshold <percentage of disk capacity>
percentage of disk capacity
HDFS達到平衡狀态的磁盤使用率偏內插補點
值越低各節點越平衡,但消耗時間也更長
HDFS Shell指令—設定目錄份額
限制一個目錄最多使用磁盤空間
bin/hadoop dfsadmin -setSpaceQuota 1t /user/username
限制一個目錄包含的最多子目錄和檔案數目
bin/hadoop dfsadmin -setQuota 10000 /user/username
HDFS Shell指令—增加/移除節點
三、HDFS Java API介紹
Configuration類:該類的對象封裝了配置資訊,這些配置資訊來自core-.xml;
FileSystem類:檔案系統類,可使用該類的方法對檔案/目錄進行操作。一般通過FileSystem的靜态方法 get獲得一個檔案系統對象;
FSDataInputStream和FSDataOutputStream類:HDFS中的輸入輸出流。分别通過FileSystem的open方法和create方法獲得。 以上類均來自java包:org.apache.hadoop.fs
HDFS Java程式舉例
将本地檔案拷貝到HDFS上
Configuration config = new Configuration();
FileSystem hdfs = FileSystem.get(config);
Path srcPath = new Path(srcFile);
Path dstPath = new Path(dstFile);
hdfs.copyFromLocalFile(srcPath, dstPath);
建立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新特性
NameNode HA
NameNode Federation
HDFS 快照(snapshot)
HDFS 緩存(in-memory cache)
HDFS ACL
異構層級存儲結構(Heterogeneous Storage hierarchy)
1、HA與Federation
2、異構層級存儲結構—背景
HDFS将所有存儲媒體抽象成性能相同的Disk
<property>
<name>dfs.datanode.data.dir</name>
<value>/dir0,/dir1,/dir2,/dir3</value>
</property>
存儲媒體種類繁多,一個叢集中存在多種異構媒體
磁盤、SSD、RAM等
多種類型的任務企圖同時運作在同一個Hadoop叢集中
批處理,互動式處理,實時處理
不同性能要求的資料,最好存儲在不同類别的存儲媒體上
3、異構層級存儲結構—原理
<property>
<name>dfs.datanode.data.dir</name>
<value>[disk]/dir0,[disk]/dir1,[ssd]/dir2,[ssd]/dir3</value>
</property>
4、異構層級存儲結構—原理
HDFS僅提供了一種異構存儲結構,并不知道存儲媒體的性能;
HDFS為使用者提供了API,以控制目錄/檔案寫到什麼媒體上;
HDFS為管理者提供了管理工具,可限制每個使用者對每種媒體的可使用份額;
目前完成度不高
階段1:DataNode支援異構存儲媒體(HDFS-2832,完成)
階段2:為使用者提供通路API(HDFS-5682,未完成)
五、HDFS ACL—基于POSIX ACL的實作
六、HDFS快照—背景
HDFS上檔案和目錄是不斷變化的,快照可以幫助使用者儲存某個時刻的資料;
HDFS快照的作用
防止使用者誤操作删除資料
資料備份
HDFS快照—基本使用方法
七、HDFS緩存
HDFS自身不提供資料緩存功能,而是使用OS緩存容易記憶體浪費,eg.一個block三個副本同時被緩存
多種計算架構共存,均将HDFS作為共享存儲系統
MapReduce:離線計算,充分利用磁盤
Impala:低延遲計算,充分利用記憶體
Spark:記憶體計算架構
HDFS應讓多種混合計算類型共存一個叢集中
合理的使用記憶體、磁盤等資源
比如,高頻通路的特點檔案應被盡可能長期緩存,防止置換到磁盤上
HDFS緩存—原理
HDFS緩存—實作情況
使用者需通過指令顯式的将一個目錄或檔案加入/移除緩存
不支援塊級别的緩存
不支援自動化緩存
可設定緩存失效時間
緩存目錄:僅對一級檔案進行緩存
不會遞歸緩存所有檔案與目錄
以pool的形式組織緩存資源
借助YARN的資源管理方式,将緩存劃分到不同pool中
每個pool有類linux權限管理機制、緩存上限、失效時間等
獨立管理記憶體,未與資源管理系統YARN內建
使用者可為每個DN設定緩存大小,該值獨立于YARN
相關内容推薦:基于Dubbo的分布式系統架構實戰