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寫流程

6、HDFS讀流程

7、HDFS典型物理拓撲

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

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

dfs.datanode.data.dir

/dir0,/dir1,/dir2,/dir3

存儲介質種類繁多,一個集群中存在多種異構介質

 磁盤、SSD、RAM等

多種類型的任務企圖同時運行在同一個Hadoop集群中

批處理,交互式處理,實時處理

不同性能要求的數據,最好存儲在不同類別的存儲介質上

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

dfs.datanode.data.dir

[disk]/dir0,[disk]/dir1,[ssd]/dir2,[ssd]/dir3

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

要了解學習大數據的可以私信我,獲取大數據學習資料,

大家多多關注,你們的關注是我最大的動力。


分享到:


相關文章: