1. 概念
HDFS 全稱 Hadoop Distribute File System苦始,是?個(gè) 高可靠户盯、高吞吐的 分布式文件系統(tǒng)
HDFS 作為 Apache Hadoop 三大組件之一氧骤,功能面向海量數(shù)據(jù)存儲(chǔ)奈泪,其核心是 基于 塊機(jī)制 和 副本機(jī)制 的 數(shù)據(jù)存儲(chǔ)策略
- 核心思想:分治
- 存入原理:數(shù)據(jù)切割 --> 制作副本 --> 分散儲(chǔ)存
- 讀取原理:獲取位置 --> 分別下載 --> 數(shù)據(jù)拼接
HDFS 適合 “一次寫入疾棵,多次讀出” 的場(chǎng)合戳稽,支持文件的追加寫入馆蠕,不支持文件的隨意修改
因此,HDFS 適合為 大數(shù)據(jù)分析 提供 底層存儲(chǔ)服務(wù)惊奇,而不是適合用來做“網(wǎng)盤”(修改數(shù)據(jù)不方便互躬、延遲大,網(wǎng)絡(luò)開銷大颂郎,成本過高)
若要實(shí)現(xiàn)海量數(shù)據(jù)的快速訪問和隨機(jī)讀寫吼渡,應(yīng)考慮使用 HBase
1.1 block 塊機(jī)制
從物理層面講,數(shù)據(jù)在 HDFS 上是分塊(block)存儲(chǔ)的乓序,塊的大小可以通過參數(shù)進(jìn)行配置
在 Hadoop 2.x 版本中寺酪,默認(rèn)的 block 大小是 128MB;
1.2 副本機(jī)制
HDFS 為所有文件的所有 block 都存儲(chǔ)了副本替劈,以實(shí)現(xiàn)高可靠性和高容錯(cuò)
除 block 的大小之外寄雀,block 的副本個(gè)數(shù)(也稱副本系數(shù))也可以通過參數(shù)配置
副本系數(shù)可以在創(chuàng)建文件前指定,也支持后續(xù)修改
HDFS 默認(rèn)的 block 副本系數(shù)為 3 個(gè)
1.3 Master / Slave 架構(gòu)
HDFS 是典型的 Master / Slave 主從節(jié)點(diǎn)結(jié)構(gòu)
一般是由一個(gè)NameNode作為集群主節(jié)點(diǎn)陨献,多個(gè)DataNode作為集群從節(jié)點(diǎn)
1.4 NameSpace 命名空間
HDFS 支持傳統(tǒng)目錄式的層次型文件組織結(jié)構(gòu)盒犹,用戶和程序可以對(duì)目錄和文件進(jìn)行 創(chuàng)建、刪除湿故、移動(dòng)阿趁、重命名 等操作
NameNode 負(fù)責(zé)維護(hù)文件系統(tǒng)的命名空間,記錄任何對(duì)文件系統(tǒng)命名空間(或?qū)傩裕┑男薷?br>
HDFS 提供抽象目錄樹以供訪問坛猪,訪問形式為 hdfs:// NameNode 所在節(jié)點(diǎn)的主機(jī)名(hostname)
: 端口(port)
/ 目標(biāo)目錄
例如:hdfs://linux111:9000/path//target
2. 結(jié)構(gòu)
NN脖阵,2NN,DN 即是角色名稱墅茉、進(jìn)程名稱命黔,同時(shí)也代指電腦節(jié)點(diǎn)名稱
-
NameNode(NN)
身份:HDFS 集群的管理者,Master 節(jié)點(diǎn)
職責(zé):
? 1. 處理客戶端讀寫請(qǐng)求
? 2. 存儲(chǔ)與維護(hù) HDFS 元數(shù)據(jù)
? ?1)維護(hù) 命名空間:記錄 目錄結(jié)構(gòu)就斤、文件屬性(生成時(shí)間悍募、block 數(shù)、權(quán)限)
? ?2)維護(hù) 副本策略:記錄 各個(gè)文件 block 的副本數(shù)
? ?3)維護(hù) 映射關(guān)系:記錄 文件的塊信息(尤其是 block 與 DataNode 的映射信息)
SecondaryNameNode(2NN)
身份:HDFS 集群的觀察者洋机,NameNode 的輔助者
職責(zé):
? 1. 監(jiān)控 HDFS 狀態(tài)
? 2. 周期性存儲(chǔ)元數(shù)據(jù)快照DataNode(DN)
身份:HDFS 集群的工作者坠宴,副本的存儲(chǔ)者,數(shù)據(jù)的操作者绷旗,Slave 節(jié)點(diǎn)
職責(zé):
? 1. 存儲(chǔ) block -- 多個(gè)副本由不同的 DataNode 存儲(chǔ)
? 2. 讀寫 block
? 3. 校驗(yàn) package
? 4. 匯報(bào)塊信息 -- 定時(shí)向 NameNode 匯報(bào)自己存儲(chǔ)的 block 信息Client
身份:客戶端
職責(zé):
? 1. 設(shè)置時(shí):發(fā)送指令 -- 通過指令對(duì) HDFS 進(jìn)行設(shè)置與管理
? 2. 上傳時(shí):切割文件 -- 上傳文件時(shí)將其切割成若干個(gè) block
? 3. 下載時(shí):拼接文件 -- 將分散下載的各個(gè) block 拼接完整
? ?1)尋址:與 NameNode 交互喜鼓,獲取文件位置信息
? ?2)下載:與 DataNode 交互副砍,讀取 block
3. 命令
3.1 Shell 命令行指令
格式:bin/hadoop fs
或者 bin/hdfs dfs
+ 具體命令(一般推薦使用后者)
在 Shell 命令行中輸入 hdfs dfs
可以查看所有的 HDFS 指令
HDFS 常用的命令行指令有:
-help:輸出此命令的參數(shù)
[root@linux121 hadoop-2.9.2]# hdfs dfs -help rm
-mkdir:在 HDFS 上創(chuàng)建目錄
[root@linux121 hadoop-2.9.2]# hdfs dfs -mkdir -p /dir/subdir
-rmdir:刪除空目錄
[root@linux121 hadoop-2.9.2]# hdfs dfs -mkdir /test
[root@linux121 hadoop-2.9.2]# hdfs dfs -rmdir /test
-ls:顯示目錄信息
[root@linux121 hadoop-2.9.2]# hdfs dfs -ls /
-cp:在 HDFS 上拷貝文件
[root@linux121 hadoop-2.9.2]# hdfs dfs -cp /dir/subdir/hadoop.txt /hdfs.txt
-mv:在 HDFS 上移動(dòng)文件
[root@linux121 hadoop-2.9.2]# hdfs dfs -mv /dir/subdir/hadoop.txt /dir
-cat:顯示文件內(nèi)容
[root@linux121 hadoop-2.9.2]# hdfs dfs -cat /dir/subdir/hadoop.txt
-appendToFile:追加?個(gè)文件到已經(jīng)存在的文件末尾
[root@linux121 hadoop-2.9.2]# hdfs dfs -appendToFile hdfs.txt /dir/subdir/hadoop.txt
-tail:顯示文件末尾內(nèi)容
[root@linux121 hadoop-2.9.2]# hdfs dfs -tail /user/root/test/yarn.txt
-rm:刪除文件或文件夾
[root@linux121 hadoop-2.9.2]# hdfs dfs -rm /user/root/test/yarn.txt
-chgrp 、-chmod庄岖、-chown:修改文件權(quán)限(與Linux文件系統(tǒng)用法一致)
[root@linux121 hadoop-2.9.2]# hdfs dfs -chmod 666 /dir/subdir/hadoop.txt
[root@linux121 hadoop-2.9.2]# hdfs dfs -chown root:root /dir/subdir/hadoop.txt
-du:統(tǒng)計(jì)文件夾的大小信息
[root@linux121 hadoop-2.9.2]# hdfs dfs -du -s -h /user/root/test
-moveFromLocal:從本地剪切粘貼到 HDFS
[root@linux121 hadoop-2.9.2]# hdfs dfs -moveFromLocal ./local/localfile.txt /dir/subdir/
-moveToLocal:從 HDFS 剪切粘貼到本地
[root@linux121 hadoop-2.9.2]# hdfs dfs -moveToLocal /dir/subdir/hdfs.txt ./local/
-copyFromLocal:從本地文件系統(tǒng)拷貝文件到 HDFS
[root@linux121 hadoop-2.9.2]# hdfs dfs -copyFromLocal ./local/localfile2.txt /dir/subdir/
-copyToLocal:從 HDFS 拷貝文件到本地
[root@linux121 hadoop-2.9.2]# hdfs dfs -copyToLocal /dir/subdir/hdfs2.txt ./local/
-put:等同于 copyFromLocal
[root@linux121 hadoop-2.9.2]# hdfs dfs -put ./local/localfile3.txt /dir/subdir/
-get:等同于 copyToLocal
[root@linux121 hadoop-2.9.2]# hdfs dfs -get /dir/subdir/hdfs3.txt ./local/
-setrep:設(shè)置 HDFS 文件的副本系數(shù)
[root@linux121 hadoop-2.9.2]# hdfs dfs -setrep 10 /dir/subdir/hadoop.txt
這里需要注意的是:副本系數(shù) > DataNode 節(jié)點(diǎn)數(shù)是無意義的豁翎,因?yàn)槎鄠€(gè)副本在同一個(gè) DataNode 節(jié)點(diǎn)上是無意義的
3.2 Java API
=== 待續(xù) ===
4. 讀寫原理
4.1 HDFS 讀數(shù)據(jù)流程
假設(shè):客戶端 Client-121 想要下載 HDFS 上的文件 hdfs.txt
該文件大小為 300M,有3個(gè) block(300M ÷ 128M = 2)隅忿,分別為 blk_1心剥、blk_2、blk_3
每個(gè) block 有3個(gè) replication: rep_1背桐、rep_2优烧、rep_3,分別存在 DN-121牢撼、DN-122匙隔、DN-123 上
數(shù)據(jù)讀取流程:
Client-121 通過 DistributedFileSystem 向 NameNode 請(qǐng)求下載 hdfs.txt 的 blk_1
NN 查詢?cè)獢?shù)據(jù)中的 block-DN 映射關(guān)系疑苫,找到所有存放了 blk_1 副本的 DataNode(這里為3個(gè))
NN 根據(jù)就近原則熏版,挑出與 Client-121 距離最近的 DN-121,將其地址返回給 Client-121
注意:就近原則是為了盡可能減小數(shù)據(jù)傳輸成本捍掺,如果 DN-121 宕機(jī)了撼短,NN 會(huì)隨機(jī)從 DN-122 和 DN-123 中挑選一個(gè)返回給 ClientClient-121 通過 FSDataInputStream 向 DN-121 發(fā)送請(qǐng)求,申請(qǐng)讀取 rep_1
DN-121 從磁盤讀取數(shù)據(jù)輸入流挺勿,傳輸數(shù)據(jù)給 Client-121
DataNode 的核心功能:維護(hù) 磁盤與客戶端 之間以 Package 為單位的數(shù)據(jù)傳輸流
維護(hù)方法:傳輸校驗(yàn)曲横,每傳輸完一個(gè) Package 進(jìn)行一次,從而監(jiān)控傳輸狀態(tài)
Package 的默認(rèn)大小為 64KBClient-121 以 Package 為單位接收數(shù)據(jù)不瓶,先寫入本地緩存禾嫉,再寫入本地目標(biāo)文件
4.2 HDFS 寫數(shù)據(jù)流程
- 客戶端將向 NN 請(qǐng)求寫入整個(gè)文件
- NN 判斷:父目錄是否存在 ?(文件是否已經(jīng)存在 蚊丐?不可寫:可寫) :不可寫
- 拿到 NN 的可寫響應(yīng)后熙参,客戶端將文件切割成 block,再次向 NN 請(qǐng)求寫入單個(gè) blk_1麦备,詢問 blk_1 寫入哪幾個(gè) DN
- 拿到 DN 地址隊(duì)列后孽椰,Client 通過 FSOutputStream 向隊(duì)首的 DN-1 發(fā)送請(qǐng)求,申請(qǐng)寫入 blk_1
- DN-1 出隊(duì)后繼續(xù)調(diào)用隊(duì)首的 DN-2凛篙,DN-2 繼續(xù)調(diào)用 DN-3 ... 直至整個(gè)通道打通(隊(duì)列為空)
- DN-1黍匾、DN-2、DN-3 逐級(jí)向客戶端返回響應(yīng)呛梆,表明自己處于就緒狀態(tài)
- Client 確定所有 DN 都就緒之后锐涯,以 Pakage 為單位向 DN-1 傳輸 blk_1
- DN-1 接收到 Package 后將其傳給下一個(gè) DN,DN-1上維護(hù)一個(gè)確認(rèn)隊(duì)列填物,每傳出一個(gè) Pakage 就將其入隊(duì)
- 當(dāng)一個(gè) Package 在所有 DN 上都傳輸完畢后纹腌,DN-1 上的確認(rèn)隊(duì)列將該 Package 出隊(duì)
- Client 監(jiān)控 DN-1 的確認(rèn)隊(duì)列秀仲,當(dāng)隊(duì)列為空時(shí)說明 blk_1 傳輸完畢
- 重復(fù)第 3-10 步,繼續(xù)上傳 blk_2