HDFS是Hadoop的一個(gè)重要組件聪建,提供了分布式系統(tǒng)的文件存儲(chǔ)蛮拔,下面就我學(xué)習(xí)到的知識(shí)點(diǎn)整理一下吧
一疲酌、相關(guān)概念
- HDFS:Hadoop Distributed File Sysytem涮毫,即Hadoop分布式文件系統(tǒng)翘魄,以流式數(shù)據(jù)訪問(wèn)模式基于塊(Block)來(lái)存儲(chǔ)超大文件蜓肆,是一個(gè)用來(lái)管理網(wǎng)絡(luò)中跨多臺(tái)計(jì)算機(jī)存儲(chǔ)的文件系統(tǒng)颜凯;
- HDFS Block:HDFS是基于數(shù)據(jù)塊來(lái)存儲(chǔ)文件數(shù)據(jù)的,現(xiàn)在的版本中這個(gè)塊的大小是128MB仗扬,稍早的版本是64M装获;
- 注意,HDFS的優(yōu)缺點(diǎn)分明厉颤,優(yōu)點(diǎn):分布式存儲(chǔ)以及分布式存儲(chǔ)帶來(lái)的優(yōu)點(diǎn)穴豫,缺點(diǎn):時(shí)延長(zhǎng),不適合頻繁修改文件...(所以HDFS是不適合做網(wǎng)盤系統(tǒng)的)
- HDFS系統(tǒng)架構(gòu)
- HDFS可以分為兩大組件:NameNode和DataNode
- NameNode:主要負(fù)責(zé)管理文件系統(tǒng)的命名空間以及客戶端對(duì)文件系統(tǒng)元數(shù)據(jù)的訪問(wèn)逼友,即文件元數(shù)據(jù)的操作精肃;當(dāng)NameNode接收到DataNode報(bào)告的數(shù)據(jù)原信息的時(shí)候就會(huì)進(jìn)行相應(yīng)的檢查,如果數(shù)據(jù)損壞就會(huì)根據(jù)設(shè)置的副本個(gè)數(shù)和DataNode節(jié)點(diǎn)決定是否要新增副本個(gè)數(shù)帜乞;NameNode的兩個(gè)組成部分:
fsimage
:元數(shù)據(jù)鏡像文件(保存文件系統(tǒng)的目錄樹(shù))edits
:元數(shù)據(jù)操作日志(針對(duì)目錄樹(shù)的修改操作)司抱;SecondaryNameNode負(fù)責(zé)定期通過(guò)edits
來(lái)維護(hù)fsimage
; - DataNode:負(fù)責(zé)處理本節(jié)點(diǎn)上的塊數(shù)據(jù)的讀寫請(qǐng)求黎烈;需要注意的是习柠,這些請(qǐng)求是直接由客戶端連接上來(lái)的,而能請(qǐng)求到具體的某個(gè)DataNode照棋,是因?yàn)镹ameNode告訴客戶端數(shù)據(jù)的具體存放位置资溃;DataNode啟動(dòng)后向NameNode注冊(cè),注冊(cè)成功后烈炭,為了保證數(shù)據(jù)的安全性溶锭,這個(gè)DataNode會(huì)周期性心跳的方式(dfs.blockreport.intervalMsec)向NameNode上報(bào)告所有的塊信息,如果這個(gè)DataNode某些數(shù)據(jù)出現(xiàn)異常符隙,NameNode就會(huì)重建這個(gè)DataNode的副本趴捅;
- 超時(shí)判斷:當(dāng)NameNode得不到DataNode的心跳請(qǐng)求的時(shí)候,不會(huì)立即認(rèn)為該DataNode掛掉霹疫,而是等待一定的超時(shí)時(shí)間拱绑,超時(shí)時(shí)間的計(jì)算公式為:
2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
;默認(rèn)情況下heartbeat.recheck.interval
為5分鐘丽蝎,默認(rèn)單位為毫秒猎拨,dfs.heartbeat.interval
為3秒,默認(rèn)單位為秒;
- 超時(shí)判斷:當(dāng)NameNode得不到DataNode的心跳請(qǐng)求的時(shí)候,不會(huì)立即認(rèn)為該DataNode掛掉霹疫,而是等待一定的超時(shí)時(shí)間拱绑,超時(shí)時(shí)間的計(jì)算公式為:
- NameNode:主要負(fù)責(zé)管理文件系統(tǒng)的命名空間以及客戶端對(duì)文件系統(tǒng)元數(shù)據(jù)的訪問(wèn)逼友,即文件元數(shù)據(jù)的操作精肃;當(dāng)NameNode接收到DataNode報(bào)告的數(shù)據(jù)原信息的時(shí)候就會(huì)進(jìn)行相應(yīng)的檢查,如果數(shù)據(jù)損壞就會(huì)根據(jù)設(shè)置的副本個(gè)數(shù)和DataNode節(jié)點(diǎn)決定是否要新增副本個(gè)數(shù)帜乞;NameNode的兩個(gè)組成部分:
- HDFS可以分為兩大組件:NameNode和DataNode
- HDFS的特性
- HDFS的包容性:無(wú)論單個(gè)文件多大迟几,也無(wú)論這個(gè)文件是結(jié)構(gòu)化的消请,非結(jié)構(gòu)化的還是半結(jié)構(gòu)化的,HDFS都能幫我們很好的存儲(chǔ)這些數(shù)據(jù)类腮;
- 可靠性/容錯(cuò)性:在配置HDFS的時(shí)候臊泰,我們都會(huì)在hdfs-site.xml中配置一個(gè)參數(shù)dfs.replication,這個(gè)參數(shù)就是用來(lái)配置蚜枢,每個(gè)文件的副本個(gè)數(shù)缸逃,至于這些副本存儲(chǔ)在哪里,是由NameNode決定的厂抽。
- 數(shù)據(jù)完整性:HDFS會(huì)經(jīng)常去檢查存儲(chǔ)的文件的完整性需频,如果發(fā)現(xiàn)數(shù)據(jù)不完整,就會(huì)向NameNode報(bào)告筷凤,NameNode就會(huì)重新建立副本昭殉,以保證副本數(shù)量。
- 高吞吐量:正式由于分布式的原因藐守,使得HDFS的吞吐量大大的增加挪丢,增大的部分和這個(gè)分布式集群的節(jié)點(diǎn)個(gè)數(shù)是成正比的;
- 高性能:說(shuō)HDFS高性能是因?yàn)椋阂话闱闆r下我們處理數(shù)據(jù)的時(shí)候都會(huì)把數(shù)據(jù)全部帶到應(yīng)用層上卢厂,然而HDFS中乾蓬,可以直接把處理程序也做成集群,然后每個(gè)節(jié)點(diǎn)上都有一個(gè)數(shù)據(jù)處理程序慎恒,這樣就避免了大量的磁盤甚至網(wǎng)絡(luò)IO任内,處理的性能大大提高。
二融柬、HDFS讀寫流程
-
文件寫入流程
- 客戶端請(qǐng)求處理上傳文件死嗦,向NameNode請(qǐng)求上傳文件,NameNode會(huì)查詢內(nèi)部的元數(shù)據(jù)丹鸿,這個(gè)文件是否已經(jīng)存在越走,如果已經(jīng)存在棚品,拒絕靠欢;如果不存在,則判斷這個(gè)路徑是否存在铜跑,如果不存在门怪,則拒絕;否則批準(zhǔn)上傳锅纺;
- 請(qǐng)求同一個(gè)數(shù)據(jù)塊的副本個(gè)Block地址掷空;該客戶端在計(jì)算數(shù)據(jù)大小之后向NameNode請(qǐng)求Block塊,NameNode就返回這個(gè)Block塊的所有副本地址,在這里NameNode在選擇Block的時(shí)候會(huì)考慮:每個(gè)DataNode節(jié)點(diǎn)的空間使用量和客戶端與這些DataNode之間的網(wǎng)絡(luò)距離(數(shù)據(jù)包轉(zhuǎn)發(fā)次數(shù))等坦弟,綜合這些因素护锤,返回的所有Block會(huì)分散,以保證數(shù)據(jù)的安全酿傍;
- 客戶端開(kāi)始與DataNode建立連接烙懦;首先,先與第一臺(tái)DataNode建立連接赤炒,如果所有的數(shù)據(jù)不在同一個(gè)DataNode上氯析,第一臺(tái)DataNode就會(huì)向后面的第二臺(tái)DataNode建立連接,以通知第二臺(tái)DataNode接收數(shù)據(jù)莺褒,同樣的掩缓,如果還有,那么第二臺(tái)就會(huì)向第三臺(tái)DataNode請(qǐng)求連接...第三臺(tái)DataNode響應(yīng)給第二臺(tái)DataNode遵岩,第二臺(tái)DataNode響應(yīng)給第一臺(tái)你辣,第一臺(tái)相應(yīng)給客戶端,數(shù)據(jù)傳輸通道(pipline)建立成功尘执;
-
開(kāi)始傳輸數(shù)據(jù)绢记;客戶端通過(guò)socket把數(shù)據(jù)以packet形式傳遞給第一臺(tái),每次收到數(shù)據(jù)的DataNode都會(huì)以chunk(512byte)為單位對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)正卧,然后第一臺(tái)通過(guò)剛才與第二臺(tái)的socket傳遞給第二臺(tái)蠢熄。。炉旷。然后又是倒著應(yīng)答回客戶端签孔,如果一臺(tái)機(jī)器失敗了,傳輸完畢后由NameNode進(jìn)行副本數(shù)量的維護(hù);當(dāng)?shù)谝粋€(gè)Block完成之后资铡,如果還有數(shù)據(jù)就繼續(xù)2步驟...
文件寫入流程時(shí)序圖
-
文件讀入流程
- 客戶端請(qǐng)求下載文件紫新,NameNode就會(huì)讀取存儲(chǔ)的元數(shù)據(jù),然后NameNode就會(huì)返回這個(gè)文件的元數(shù)據(jù)但绕;
- 客戶端拿到文件的元數(shù)據(jù)后,進(jìn)行分析惶看,與對(duì)應(yīng)的DataNode建立數(shù)據(jù)傳輸通道捏顺,獲取數(shù)據(jù)流;如果這個(gè)數(shù)據(jù)文件有多塊纬黎,那么客戶端會(huì)自動(dòng)拼接這些Block文件幅骄,最終形成一個(gè)比較完整的文件;
-
NameNode的元數(shù)據(jù)管理
- NameNode中的數(shù)據(jù)存放在內(nèi)存中本今,以保證元數(shù)據(jù)的訪問(wèn)速度拆座;
- 當(dāng)客戶端向NameNode發(fā)送了寫請(qǐng)求之后主巍,在NameNode中更新元數(shù)據(jù),并按照操作順序記錄操作日志
edits
挪凑,SecondaryNameNode和NameNode之間有心跳通信孕索,SecondaryNameNode每一定時(shí)間就去詢問(wèn)NameNode是否需要觸發(fā)SecondaryNameNode的checkpoint,NameNode就根據(jù)配置文件(checkpoint觸發(fā)條件在配置文件中配置躏碳,要么定時(shí)檬果,要么edits到了固定的數(shù)量)檢查checkpoint的條件是否已經(jīng)滿足,如果條件滿足唐断,SecondaryNameNode就會(huì)向NameNode發(fā)出checkpoint的請(qǐng)求选脊,接著NameNode就會(huì)觸發(fā)edits
文件滾動(dòng)一次,然后SecondaryNameNode就會(huì)下載NameNode中所有的fsimage...
和edits...
文件脸甘,然后SecondaryNameNode就會(huì)根據(jù)這些文件重新按照edits回放元數(shù)據(jù)操作過(guò)程恳啥,生成一個(gè)新的元數(shù)據(jù)集合,然后把這個(gè)新的元數(shù)據(jù)dump稱為一個(gè)叫做fsimage.checkpoint
的文件丹诀,并上傳至NameNode覆蓋舊的fsimage
钝的;后面再次觸發(fā)checkpoint的時(shí)候就不會(huì)下載fsimage
文件了,只會(huì)下載edits...
文件铆遭; - NameNode和SecondaryNameNode的工作目錄存儲(chǔ)結(jié)構(gòu)完全相同硝桩,所以當(dāng)NameNode故障退出需要重新恢復(fù)時(shí),可以從SecondaryNameNode的工作目錄中將
fsimage
拷貝到NameNode的工作目錄枚荣,便可恢復(fù)NameNode的數(shù)據(jù)碗脊; - SecondaryNameNode和NameNode的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)是一樣的,所以橄妆,如果NameNode的name文件夾損壞衙伶,可以拷貝SecondaryNameNode的namesecondary為NameNode的name來(lái)恢復(fù)NameNode的數(shù)據(jù),但是不一定能恢復(fù)所有的數(shù)據(jù)害碾,損失的部分就是在損壞之前做checkpoint之后的寫入數(shù)據(jù)矢劲;
- 如果避免NameNode的
edits
文件的安全呢?當(dāng)然是把edits寫到多個(gè)磁盤上即可慌随,在hdfs-site.xml
中配置:<property> <name>dfs.name.dir</name> <value>$<disk1-hdp-data-dir>,$<disk2-hdp-data-dir></value> </property>
三芬沉、HDFS常用命令參數(shù)介紹
- 常用命令行參數(shù)
-
-help
- 功能:
輸出這個(gè)命令參數(shù)手冊(cè)
- 功能:
-
-ls
- 功能:顯示目錄信息
- 示例:
hadoop fs -ls hdfs://hadoop-server01:9000/
-
-mkdir
- 功能:在hdfs上創(chuàng)建目錄
- 示例:
hadoop fs -mkdir -p /aaa/bbb/cc/dd
-
-moveFromLocal
- 功能:從本地剪切粘貼到hdfs
- 示例:
hadoop fs -moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
-
-moveToLocal
- 功能:從hdfs剪切粘貼到本地
- 示例:
hadoop fs -moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
-
-appendToFile
- 功能:追加一個(gè)文件到已經(jīng)存在的文件末尾
- 示例:
hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
- 簡(jiǎn)寫:
Hadoop fs -appendToFile ./hello.txt /hello.txt
-
-cat
- 功能:顯示文件內(nèi)容
- 示例:
hadoop fs -cat /hello.txt
-
-tail
- 功能:顯示一個(gè)文件的末尾
- 示例:
hadoop fs -tail /weblog/access_log.1
-
-text
- 功能:以字符形式打印一個(gè)文件的內(nèi)容
- 示例:
hadoop fs -text /weblog/access_log.1
-
-chown/chmod/chgrp
- 功能:linux文件系統(tǒng)中的用法一樣,對(duì)文件所屬權(quán)限
- 示例:
hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
-
-copyFromLocal
- 功能:從本地文件系統(tǒng)中拷貝文件到hdfs路徑去
- 示例:
hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-
-copyToLocal
- 功能:從hdfs拷貝到本地
- 示例:
hadoop fs -copyToLocal /aaa/jdk.tar.gz
-
-cp
- 功能:從hdfs的一個(gè)路徑拷貝hdfs的另一個(gè)路徑
- 示例:
hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz
-
-mv
- 功能:在hdfs目錄中移動(dòng)文件
- 示例:
hadoop fs -mv /aaa/jdk.tar.gz /
-
-get
- 功能:等同于copyToLocal阁猜,就是從hdfs下載文件到本地
- 示例:
hadoop fs -get /aaa/jdk.tar.gz
-
-getmerge
- 功能:合并下載多個(gè)文件
- 示例:
hadoop fs -getmerge /aaa/log.* ./log.sum
-
-put
- 功能:等同于copyFromLocal
- 示例:
hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz
-
-rm
- 功能:刪除文件或文件夾
- 示例:
hadoop fs -rm -r /aaa/bbb/
-
-rmdir
- 功能:刪除空目錄
- 示例:
hadoop fs -rmdir /aaa/bbb/ccc
-
-df
- 功能:統(tǒng)計(jì)文件系統(tǒng)的可用空間信息
- 示例:
hadoop fs -df -h /
-
-du
- 功能:統(tǒng)計(jì)文件夾的大小信息
- 示例:
hadoop fs -du -s -h /aaa/*
-
-count
- 功能:統(tǒng)計(jì)一個(gè)指定目錄下的文件節(jié)點(diǎn)數(shù)量
- 示例:
hadoop fs -count /aaa/
-
-setrep
- 功能:設(shè)置hdfs中文件的副本數(shù)量
- 示例:
hadoop fs -setrep 3 /aaa/jdk.tar.gz
-
四丸逸、HDFS的常用命令操作
- 在HDFS上創(chuàng)建目錄
hadoop fs -mkdir [-p] <dir-to-make>
- 上傳文件
hadoop fs -put <file> <dir> # 或者 hdfs dfs -put <file> <dir>
- 查看狀態(tài)
hdfs dfsadmin -report
五、API操作
- API操作就不在這里貼代碼了
六蹦漠、SafeMode
- 在NameNode的內(nèi)存中椭员,記錄著所有的數(shù)據(jù)文件的副本數(shù),數(shù)據(jù)文件分布式存儲(chǔ)的塊信息笛园,以及這些塊所在的DataNode的節(jié)點(diǎn)信息隘击;
- 而在鏡像中,相比NameNode的內(nèi)存研铆,少了這些塊所在的DataNode的節(jié)點(diǎn)信息埋同;
- 這里講的SafeMode,NameNode啟動(dòng)的時(shí)候棵红,值知道有哪些塊,數(shù)據(jù)文件的副本數(shù)量逆甜,但是這些副本數(shù)量在各個(gè)NameNode節(jié)點(diǎn)的分布就不知道了虱肄,當(dāng)DataNode在啟動(dòng)的時(shí)候,就會(huì)向NameNode匯報(bào)自己所持有的數(shù)據(jù)塊信息交煞;這樣NameNode就會(huì)知道塊所在的NameNode信息咏窿,NameNode數(shù)據(jù)信息才會(huì)補(bǔ)全,當(dāng)NameNode的信息補(bǔ)全量達(dá)到99.8%的時(shí)候素征,才會(huì)推出SafeMode正常向外部提供服務(wù)集嵌;
七、Federation
- Federation講的是對(duì)NameNode如何進(jìn)行水平擴(kuò)容御毅;因?yàn)閱蝹€(gè)NameNode節(jié)點(diǎn)的容量始終是有限的根欧,在大部分場(chǎng)景下都可以滿足,當(dāng)數(shù)據(jù)量超級(jí)大的少數(shù)情況下使用端蛆;
- 這里牽扯到ViewFS凤粗,即把兩組機(jī)器當(dāng)做兩個(gè)目錄掛載在HDFS上,一組機(jī)器有一個(gè)邏輯名稱今豆,為掛載的目錄名稱侈沪,訪問(wèn)的時(shí)候使用viewfs來(lái)訪問(wèn)兩組機(jī)器,根據(jù)掛載的名稱來(lái)路由到不同的機(jī)器組上晚凿;
- 每組機(jī)器為了HA而采用主備的思想亭罪;
- 對(duì)于DataNode而言,這些NameNode只相當(dāng)于一個(gè)NameNode歼秽,是一個(gè)整體应役;