天天看點

HDFS應用場景、原理、基本架構

一、HDFS是什麼

源自于Google的GFS論文

發表于2003年10月

HDFS是GFS克隆版 

Hadoop Distributed File System

易于擴充的分布式檔案系統

運作在大量普通廉價機器上,提供容錯機制

為大量使用者提供性能不錯的檔案存取服務

1、HDFS優點

高容錯性

資料自動儲存多個副本

副本丢失後,自動恢複

适合批處理

移動計算而非資料

資料位置暴露給計算架構

适合大資料處理

GB、TB、甚至PB級資料

百萬規模以上的檔案數量

10K+節點規模

流式檔案通路

一次性寫入,多次讀取

保證資料一緻性

可建構在廉價機器上

通過多副本提高可靠性

提供了容錯和恢複機制

2、HDFS缺點

低延遲資料通路

比如毫秒級

低延遲與高吞吐率

小檔案存取

占用NameNode大量記憶體

尋道時間超過讀取時間

并發寫入、檔案随機修改

一個檔案隻能有一個寫者

僅支援append

3、HDFS設計思想

HDFS應用場景、原理、基本架構
HDFS應用場景、原理、基本架構
HDFS應用場景、原理、基本架構

4、HDFS資料塊(block)

檔案被切分成固定大小的資料塊

預設資料塊大小為64MB,可配置

若檔案大小不到64MB,則單獨存成一個block

為何資料塊如此之大 

資料傳輸時間超過尋道時間(高吞吐率)

一個檔案存儲方式

按大小被切分成若幹個block,存儲到不同節點上

預設情況下每個block有三個副本

5、HDFS寫流程

HDFS應用場景、原理、基本架構
6、HDFS讀流程
HDFS應用場景、原理、基本架構
7、HDFS典型實體拓撲
HDFS應用場景、原理、基本架構
8、HDFS副本放置政策
HDFS應用場景、原理、基本架構
9、HDFS可靠性政策
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應用場景、原理、基本架構

請點選此處輸入圖檔描述

将本地檔案上傳到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中檔案的健康狀況

查找缺失的塊以及過少或過多副本的塊

檢視一個檔案的所有資料塊位置

删除損壞的資料塊

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應用場景、原理、基本架構

三、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

HDFS應用場景、原理、基本架構

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>           
HDFS應用場景、原理、基本架構

4、異構層級存儲結構—原理

HDFS僅提供了一種異構存儲結構,并不知道存儲媒體的性能;

HDFS為使用者提供了API,以控制目錄/檔案寫到什麼媒體上;

HDFS為管理者提供了管理工具,可限制每個使用者對每種媒體的可使用份額;

目前完成度不高

階段1:DataNode支援異構存儲媒體(HDFS-2832,完成)

階段2:為使用者提供通路API(HDFS-5682,未完成)

五、HDFS ACL—基于POSIX ACL的實作

HDFS應用場景、原理、基本架構

六、HDFS快照—背景

HDFS上檔案和目錄是不斷變化的,快照可以幫助使用者儲存某個時刻的資料;

HDFS快照的作用

防止使用者誤操作删除資料

資料備份

HDFS快照—基本使用方法

HDFS應用場景、原理、基本架構

七、HDFS緩存

HDFS自身不提供資料緩存功能,而是使用OS緩存容易記憶體浪費,eg.一個block三個副本同時被緩存

多種計算架構共存,均将HDFS作為共享存儲系統

MapReduce:離線計算,充分利用磁盤

Impala:低延遲計算,充分利用記憶體

Spark:記憶體計算架構

HDFS應讓多種混合計算類型共存一個叢集中

合理的使用記憶體、磁盤等資源

比如,高頻通路的特點檔案應被盡可能長期緩存,防止置換到磁盤上

HDFS緩存—原理

HDFS應用場景、原理、基本架構

HDFS緩存—實作情況

使用者需通過指令顯式的将一個目錄或檔案加入/移除緩存

不支援塊級别的緩存

不支援自動化緩存

可設定緩存失效時間

緩存目錄:僅對一級檔案進行緩存

不會遞歸緩存所有檔案與目錄

以pool的形式組織緩存資源

借助YARN的資源管理方式,将緩存劃分到不同pool中

每個pool有類linux權限管理機制、緩存上限、失效時間等

獨立管理記憶體,未與資源管理系統YARN內建

使用者可為每個DN設定緩存大小,該值獨立于YARN

相關内容推薦:基于Dubbo的分布式系統架構實戰