三、HDFS——(概述、架構、HADOOP Shell命令、HDFS Shell命令、HDFS Java API)

1 HDFS概述
1)HDFS是什麼
源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版
易於擴展的分佈式文件系統。運行在大量普通廉價機器上,提供容錯機制。 爲大量用戶提供性能不錯的文件存取服務

適合一次寫入,多次讀取的場景,不支持文件的修改,適合用來做數據分析,不適合做網盤應用

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

3)HDFS的缺點:
低延遲數據訪問達不到
比如毫秒級,低延遲與高吞吐率
小文件存取
佔用NameNode大量內存,尋道時間超過讀取時間
併發寫入、文件隨機修改
一個文件只能有一個寫者,僅支持append

2 HDFS架構設計
存儲:分塊存儲
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
3 HDFS數據塊(block)
1)文件被切分成固定大小的數據塊
默認數據塊大小爲128MB,可配置,若文件大小不到128MB,則單獨存成一個block
2)爲何數據塊如此之大
數據傳輸時間超過尋道時間(高吞吐率)
3) 一個文件存儲方式
按大小被切分成若干個block,存儲到不同節點上,默認情況下每個block有三個副本

4 HDFS讀寫流程

在這裏插入圖片描述

在這裏插入圖片描述
HDFS典型物理拓撲
在這裏插入圖片描述
4 Block副本放置策略
副本1:同Client的節點上
副本2:不同機架中的節點上
副本3: 與第二個副本同一機架的另一個節點上
其他副本:隨機挑選

一個文件劃分成多個block,每個block存多份,如何爲每個block選擇節點存儲這幾份數據?
在這裏插入圖片描述

5 HDFS可靠性策略
文件完整性
—CRC32校驗
—用其他副本取代損壞文件
Heartbeat
—Datanode定期向Namenode發heartbeat
元數據信息
—FSImage(文件系統鏡像)、Editlog(操作 日誌)
—多份存儲
—主備NameNode實時切換
在這裏插入圖片描述
HDFS不適合存儲小文件,元信息存儲在NameNode內存中, 一個節點的內存是有限的,存取大量小文件消耗大量的尋道時間,類比拷貝大量小文件與拷貝同等大小的一個大文件。 NameNode存儲block數目是有限的,一個block元信息消耗大約150byte內存,存儲一億個block,大約需要20GB內存,如果一個文件大小爲10K,則一億個文件大小僅爲1TB(但要消耗掉NameNode20GB內存)。

6 HDFS訪問方式

HDFS Shell命令
HDFS Java API
HDFS Fuse:實現了fuse協議
HDFS lib hdfs:C/C++訪問接口
HDFS其他語言編程API
使用thrift實現
支持C++、Python、php、C#等語言

7 HDFS Shell命令一概覽
在這裏插入圖片描述
8 hadoop fs 命令一文件操作命令
在這裏插入圖片描述

HADOOP Shell命令一文件操作命令

將本地文件上傳到HDFS上
bin/hadoop fs –copyFromLocal /local/data /hdfs/data
刪除文件/目錄
bin/hadoop fs –rm /hdfs/data
創建目錄
bin/hadoop fs –mkdir /hdfs/data

HDFS Shell命令一管理命令
在這裏插入圖片描述
9 HDFS Shell命令一管理腳本
在這裏插入圖片描述
HDFS Shell命令一文件管理命令fsck
檢查hdfs中文件的健康狀況
查找缺失的塊以及過少或過多副本的塊
查看一個文件的所有數據塊位置
刪除損壞的數據塊

在這裏插入圖片描述
HDFS Shell命令一文件管理命令fsck
在這裏插入圖片描述

HDFS Shell命令一數據均衡器balancer

數據塊重分佈
bin/start-balancer.sh-threshold
percentage of disk capacity
HDFS達到平衡狀態的磁盤使用率偏差值
值越低各節點越平衡,但消耗時間也更長

10 HDFS Java API介紹及示例
configuration類:
該類的對象封裝了配置信息,這些配置信息來自core-*.xml
FileSystem類:
文件系統類,可使用該類的方法對文件/目錄進行操作。一般通過FileSystem的靜態方法get獲得一個文件系統對象
FSDataInputStream和FSDataOutputStream類:
HDFS中的輸入輸出流。分別通過FileSystem的Open方法和create方法獲得

以上類均來自java包:org.apache.hadoop.fs

HDFS Java程序示例

將本地文件拷貝到HDFS上
Configution config=new Configution();
FileSystem hdfs = FileSystem.get(config);
Path srcPath = new Path(srcFile);
Path dstPath = new Path(dstFile);
hdfs.copyFromLocalFile(srcPath, dstPath);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章