Hadoop 核心-HDFS
1. HDFS概述
1.1 介紹
在現(xiàn)代的企業(yè)環(huán)境中办成,單機(jī)容量往往無(wú)法存儲(chǔ)大量數(shù)據(jù)泊柬,需要跨機(jī)器存儲(chǔ)。統(tǒng)一管理分布在集群上的文件系統(tǒng)稱為分布式文件系統(tǒng) 诈火。
? HDFS(Hadoop Distributed File System)是 Apache Hadoop 項(xiàng)目的一個(gè)子項(xiàng)目. Hadoop 非常適于存儲(chǔ)大型數(shù)據(jù) (比如 TB 和 PB), 其就是使用 HDFS 作為存儲(chǔ)系統(tǒng). HDFS 使用多臺(tái)計(jì)算機(jī)存儲(chǔ)文件, 并且提供統(tǒng)一的訪問(wèn)接口, 像是訪問(wèn)一個(gè)普通文件系統(tǒng)一樣使用分布式文件系統(tǒng).
1.2 歷史
- Doug Cutting (hadoop之父)在做 Lucene 的時(shí)候, 需要編寫一個(gè)爬蟲服務(wù), 這個(gè)爬蟲寫的并不順利, 遇到了一些問(wèn)題, 諸如: 如何存儲(chǔ)大規(guī)模的數(shù)據(jù), 如何保證集群的可伸縮性, 如何動(dòng)態(tài)容錯(cuò)等
- 2013年的時(shí)候, Google 發(fā)布了三篇論文, 被稱作為三駕馬車, 其中有一篇叫做 GFS, 是描述了 Google 內(nèi)部的一個(gè)叫做 GFS 的分布式大規(guī)模文件系統(tǒng), 具有強(qiáng)大的可伸縮性(擴(kuò)展能力)和容錯(cuò)性
- Doug Cutting 后來(lái)根據(jù) GFS 的論文, 創(chuàng)造了一個(gè)新的文件系統(tǒng), 叫做 HDFS
補(bǔ)充:
Java之父:詹姆斯·高斯林
linux之父:李納斯Linus Torvalds
hadoop之父:Doug Cutting
2. HDFS應(yīng)用場(chǎng)景
2.1 適合的應(yīng)用場(chǎng)景
存儲(chǔ)非常大的文件:這里非常大指的是幾百M(fèi)兽赁、G状答、或者TB級(jí)別,需要高吞吐量刀崖,對(duì)延時(shí)沒(méi)有要求(高延時(shí))惊科。
采用流式的數(shù)據(jù)訪問(wèn)方式: 即一次寫入、多次讀取亮钦,數(shù)據(jù)集經(jīng)常從數(shù)據(jù)源生成或者拷貝一次馆截,然后在其上做很多分析工作 。
運(yùn)行于商業(yè)硬件上: Hadoop不需要特別貴的機(jī)器蜂莉,可運(yùn)行于普通廉價(jià)機(jī)器蜡娶,可以處節(jié)約成本
需要高容錯(cuò)性
為數(shù)據(jù)存儲(chǔ)提供所需的擴(kuò)展能力
2.2 不適合的應(yīng)用場(chǎng)景
-
1) 低延時(shí)的數(shù)據(jù)訪問(wèn)
對(duì)延時(shí)要求在毫秒級(jí)別的應(yīng)用,不適合采用HDFS映穗。HDFS是為高吞吐數(shù)據(jù)傳輸設(shè)計(jì)的,因此可能犧牲延時(shí)
2)大量小文件
文件的元數(shù)據(jù)保存在NameNode的內(nèi)存中窖张, 整個(gè)文件系統(tǒng)的文件數(shù)量會(huì)受限于NameNode的內(nèi)存大小。
經(jīng)驗(yàn)而言蚁滋,一個(gè)文件/目錄/文件塊一般占有150字節(jié)的元數(shù)據(jù)內(nèi)存空間宿接。如果有100萬(wàn)個(gè)文件,每個(gè)文件占用1個(gè)文件塊辕录,則需要大約300M的內(nèi)存睦霎。因此十億級(jí)別的文件數(shù)量在現(xiàn)有商用機(jī)器上難以支持。
1個(gè)文件---》1條元數(shù)據(jù)--》150字節(jié)---》namenode的內(nèi)存中
-
3)多方讀寫走诞,需要任意的文件修改
HDFS采用追加(append-only)的方式寫入數(shù)據(jù)副女。不支持文件任意offset的修改。不支持多個(gè)寫入器(writer)
3. HDFS 的架構(gòu)
HDFS是一個(gè)主/從(Mater/Slave)體系結(jié)構(gòu)
蚣旱,
HDFS由四部分組成碑幅,HDFS Client、NameNode姻锁、DataNode和Secondary NameNode枕赵。
**1猜欺、Client:就是客戶端位隶。
- 文件切分。文件上傳 HDFS 的時(shí)候开皿,Client 將文件切分成 一個(gè)一個(gè)的Block涧黄,然后進(jìn)行存儲(chǔ)。
- 與 NameNode 交互赋荆,獲取文件的位置信息笋妥。
- 與 DataNode 交互,讀取或者寫入數(shù)據(jù)窄潭。
- Client 提供一些命令來(lái)管理 和訪問(wèn)HDFS春宣,比如啟動(dòng)或者關(guān)閉HDFS。
2、NameNode:就是 master月帝,它是一個(gè)主管躏惋、管理者。
管理 HDFS 的名稱空間
-
管理數(shù)據(jù)塊(Block)映射信息
在內(nèi)存中存儲(chǔ)文件的元數(shù)據(jù)信息(時(shí)間嚷辅,大小簿姨。權(quán)限,塊列表簸搞,分片存儲(chǔ)路徑等)扁位;內(nèi)存有個(gè)持久化機(jī)制,fsimage鏡像文件,edits:日志文件
配置副本策略
處理客戶端讀寫請(qǐng)求趁俊。
3域仇、DataNode:就是Slave。NameNode 下達(dá)命令则酝,DataNode 執(zhí)行實(shí)際的操作殉簸。
- 存儲(chǔ)實(shí)際的數(shù)據(jù)塊。
- 執(zhí)行數(shù)據(jù)塊的讀/寫操作沽讹。
4般卑、Secondary NameNode:并非 NameNode 的熱備。當(dāng)NameNode 掛掉的時(shí)候爽雄,它并不能馬上替換 NameNode 并提供服務(wù)蝠检。
- 輔助 NameNode,分擔(dān)其工作量挚瘟。
- 定期合并 fsimage和fsedits叹谁,并推送給NameNode。
- 在緊急情況下乘盖,可輔助恢復(fù) NameNode焰檩。
4:NameNode和DataNode
4.1 NameNode作用
- NameNode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的名稱空間和文件數(shù)據(jù)塊的地址映射
- 整個(gè)HDFS可存儲(chǔ)的文件數(shù)受限于NameNode的內(nèi)存大小
1、NameNode元數(shù)據(jù)信息
文件名订框,文件目錄結(jié)構(gòu)析苫,文件屬性(生成時(shí)間,副本數(shù)穿扳,權(quán)限)每個(gè)文件的塊列表衩侥。
以及列表中的塊與塊所在的DataNode之間的地址映射關(guān)系
在內(nèi)存中加載文件系統(tǒng)中每個(gè)文件和每個(gè)數(shù)據(jù)塊的引用關(guān)系(文件、block矛物、datanode之間的映射信息)
數(shù)據(jù)會(huì)定期保存到本地磁盤(fsImage文件和edits文件)
2、NameNode文件操作
NameNode負(fù)責(zé)文件元數(shù)據(jù)的操作
DataNode負(fù)責(zé)處理文件內(nèi)容的讀寫請(qǐng)求履羞,數(shù)據(jù)流不經(jīng)過(guò)NameNode峦萎,會(huì)詢問(wèn)它跟那個(gè)DataNode聯(lián)系
3屡久、NameNode副本
文件數(shù)據(jù)塊到底存放到哪些DataNode上,是由NameNode決定的爱榔,NN根據(jù)全局情況做出放置副本的決定
4涂身、NameNode心跳機(jī)制
----->DateNode告知NameNode自己 存活的狀態(tài)
全權(quán)管理數(shù)據(jù)塊的復(fù)制,周期性的接受心跳和塊的狀態(tài)報(bào)告信息(包含該DataNode上所有數(shù)據(jù)塊的列表)
若接受到心跳信息搓蚪,NameNode認(rèn)為DataNode工作正常蛤售,如果在10分鐘后還接受到不到DN的心跳,那么NameNode認(rèn)為DataNode已經(jīng)宕機(jī) ,這時(shí)候NN準(zhǔn)備要把DN上的數(shù)據(jù)塊進(jìn)行重新的復(fù)制妒潭。 塊的狀態(tài)報(bào)告包含了一個(gè)DN上所有數(shù)據(jù)塊的列表悴能,blocks report 每個(gè)1小時(shí)發(fā)送一次.
4.2 DataNode作用
提供真實(shí)文件數(shù)據(jù)的存儲(chǔ)服務(wù)。
1雳灾、Data Node以數(shù)據(jù)塊的形式存儲(chǔ)HDFS文件
2漠酿、Data Node 響應(yīng)HDFS 客戶端讀寫請(qǐng)求
3、Data Node 周期性向NameNode匯報(bào)心跳信息
4谎亩、Data Node 周期性向NameNode匯報(bào)數(shù)據(jù)塊信息
5炒嘲、Data Node 周期性向NameNode匯報(bào)緩存數(shù)據(jù)塊信息
5:HDFS的副本機(jī)制和機(jī)架感知
5.1 HDFS 文件副本機(jī)制
所有的文件都是以 block 塊的方式存放在 HDFS 文件系統(tǒng)當(dāng)中,作用如下
- 一個(gè)文件有可能大于集群中任意一個(gè)磁盤,引入塊機(jī)制,可以很好的解決這個(gè)問(wèn)題
- 使用塊作為文件存儲(chǔ)的邏輯單位可以簡(jiǎn)化存儲(chǔ)子系統(tǒng)
- 塊非常適合用于數(shù)據(jù)備份進(jìn)而提供數(shù)據(jù)容錯(cuò)能力
在 Hadoop1 當(dāng)中, 文件的 block 塊默認(rèn)大小是 64M, hadoop2 當(dāng)中, 文件的 block 塊大小默認(rèn)是 128M, block 塊的大小可以通過(guò) hdfs-site.xml 當(dāng)中的配置文件進(jìn)行指定
注意:每一個(gè) block 塊大小默認(rèn)是 128M匈庭,默認(rèn)有3個(gè)副本夫凸,block是一個(gè)邏輯概念
<property>
<name>dfs.block.size</name>
<value>塊大小 以字節(jié)為單位</value>
</property>
5.2 機(jī)架感知
機(jī)架:存放主機(jī)的一個(gè)柜子
HDFS分布式文件系統(tǒng)的內(nèi)部有一個(gè)副本存放策略:以默認(rèn)的副本數(shù)=3為例:
1、第一個(gè)副本塊存本機(jī)
2阱持、第二個(gè)副本塊存跟本機(jī)同機(jī)架內(nèi)的其他服務(wù)器節(jié)點(diǎn)
3夭拌、第三個(gè)副本塊存不同機(jī)架的一個(gè)服務(wù)器節(jié)點(diǎn)上
6、hdfs的命令行使用
ls
格式: hdfs dfs -ls URI
作用:類似于Linux的ls命令衷咽,顯示文件列表
hdfs dfs -ls /
lsr
(過(guò)時(shí)) ls -R
hadoop(過(guò)時(shí)) hdfs
格式 : hdfs dfs -lsr URI
作用 : 在整個(gè)目錄下遞歸執(zhí)行l(wèi)s, 與UNIX中的ls-R類似
hdfs dfs -ls -R /
mkdir
格式 : hdfs dfs -mkdir [-p] 目錄名 <paths>
作用 : 以<paths>中的URI作為參數(shù)鸽扁,創(chuàng)建目錄。使用-p參數(shù)可以遞歸創(chuàng)建目錄
hdfs dfs -mkdir /dirl
hdfs dfs -mkdir -p /dir2/dir22
查看:hdfs dfs -ls /
put
(從本地copy文件到hdfs)
格式 : hdfs dfs -put <localsrc > ... <dst>
作用 : 將單個(gè)的源文件src或者多個(gè)源文件srcs從本地文件系統(tǒng)拷貝到目標(biāo)文件系統(tǒng)中(<dst>對(duì)應(yīng)的路徑)镶骗。也可以從標(biāo)準(zhǔn)輸入中讀取輸入桶现,寫入目標(biāo)文件系統(tǒng)中
hdfs dfs -put /root/a.txt /dir1
hdfs dfs -put a.txt /dir1
moveFromLocal
(從本地剪切文件到hdfs)
格式: hdfs dfs -moveFromLocal <localsrc> <dst>
作用: 和put命令類似,但是源文件localsrc拷貝之后自身被刪除
hdfs dfs -moveFromLocal /root/install.log /
moveToLocal
未實(shí)現(xiàn)
get
格式 hdfs dfs -get [-ignorecrc ] [-crc] <src> <localdst>
作用:將文件拷貝到本地文件系統(tǒng)鼎姊。 CRC 校驗(yàn)失敗的文件通過(guò)-ignorecrc選項(xiàng)拷貝骡和。 文件和CRC校驗(yàn)和可以通過(guò)-CRC選項(xiàng)拷貝
hdfs dfs -get /install.log /export/servers
mv
格式 : hdfs dfs -mv URI <dest>
作用: 將hdfs上的文件從原路徑移動(dòng)到目標(biāo)路徑(移動(dòng)之后文件刪除),該命令不能夸文件系統(tǒng)
hdfs dfs -mv /dir1/a.txt /dir2
rm
格式: hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 此蜈。摊欠。移斩∪笄福】
作用: 刪除參數(shù)指定的文件逗堵,參數(shù)可以有多個(gè)棺聊。 此命令只刪除文件和非空目錄拉一。
如果指定-skipTrash選項(xiàng)囤攀,那么在回收站可用的情況下背稼,該選項(xiàng)將跳過(guò)回收站而直接刪除文件;
否則植兰,在回收站可用時(shí)份帐,在HDFS Shell 中執(zhí)行此命令,會(huì)將文件暫時(shí)放到回收站中楣导。
hdfs dfs -rm -r /dir1
hdfs dfs -rm a.txt
cp
格式: hdfs dfs -cp URI [URI ...] <dest>
作用: 將文件拷貝到目標(biāo)路徑中废境。如果<dest> 為目錄的話,可以將多個(gè)文件拷貝到該目錄下筒繁。
-f
選項(xiàng)將覆蓋目標(biāo)噩凹,如果它已經(jīng)存在。
-p
選項(xiàng)將保留文件屬性(時(shí)間戳毡咏、所有權(quán)驮宴、許可、ACL呕缭、XAttr)堵泽。
hdfs dfs -cp /dir1/a.txt /dir2/b.txt
cat
hdfs dfs -cat URI [uri ...]
作用:將參數(shù)所指示的文件內(nèi)容輸出到stdout
hdfs dfs -cat /install.log
chmod
格式: hdfs dfs -chmod [-R] URI[URI ...]
作用: 改變文件權(quán)限。如果使用 -R 選項(xiàng)恢总,則對(duì)整個(gè)目錄有效遞歸執(zhí)行迎罗。使用這一命令的用戶必須是文件的所屬用戶,或者超級(jí)用戶片仿。
hdfs dfs -chmod -R 777 /install.log
chown
格式: hdfs dfs -chmod [-R] URI[URI ...]
作用: 改變文件的所屬用戶和用戶組佳谦。如果使用 -R 選項(xiàng),則對(duì)整個(gè)目錄有效遞歸執(zhí)行滋戳。使用這一命令的用戶必須是文件的所屬用戶钻蔑,或者超級(jí)用戶。
hdfs dfs -chown -R hadoop:hadoop /install.log
添加組: useradd + 用戶名(默認(rèn)有一個(gè)與用戶名一樣的組名)
appendToFile
(文件合并)
格式: hdfs dfs -appendToFile <localsrc> ... <dst>
作用: 追加一個(gè)或者多個(gè)文件到hdfs指定文件中.也可以從命令行讀取輸入.
hdfs dfs -appendToFile a.xml b.xml /big.xml
7奸鸯、hdfs的高級(jí)使用命令
7. 1咪笑、HDFS文件限額配置
? 在多人共用HDFS的環(huán)境下,配置設(shè)置非常重要娄涩。特別是在Hadoop處理大量資料的環(huán)境窗怒,如果沒(méi)有配額管理,很容易把所有的空間用完造成別人無(wú)法存取蓄拣。Hdfs的配額設(shè)定是針對(duì)目錄而不是針對(duì)賬號(hào)扬虚,可以 讓每個(gè)賬號(hào)僅操作某一個(gè)目錄,然后對(duì)目錄設(shè)置配置球恤。
? hdfs文件的限額配置允許我們以文件個(gè)數(shù)辜昵,或者文件大小來(lái)限制我們?cè)谀硞€(gè)目錄下上傳的文件數(shù)量或者文件內(nèi)容總量,以便達(dá)到我們類似百度網(wǎng)盤網(wǎng)盤等限制每個(gè)用戶允許上傳的最大的文件的量咽斧。
hdfs dfs -count -q -h /user/root/dir1 #查看配額信息
hdfs dfs -count -q -h dir
所謂的空間限額
7.1.1堪置、數(shù)量限額
hdfs dfs -mkdir -p /user/root/dir #創(chuàng)建hdfs文件夾
hdfs dfsadmin -setQuota 2 dir # 給該文件夾下面設(shè)置最多上傳兩個(gè)文件躬存,發(fā)現(xiàn)只能上傳一個(gè)文件
hdfs dfsadmin -clrQuota /user/root/dir # 清除文件數(shù)量限制
7.1.2、空間大小限額
在設(shè)置空間配額時(shí)舀锨,設(shè)置的空間至少是block_size * 3大小
大于等于 128MB * 3 =384 mb
hdfs dfsadmin -setSpaceQuota 4k /user/root/dir # 限制空間大小4KB
hdfs dfs -put /root/a.txt /user/root/dir
生成任意大小文件的命令:
dd if=/dev/zero of=1.txt bs=1M count=2 #生成2M的文件
清除空間配額限制
hdfs dfsadmin -clrSpaceQuota /user/root/dir
7.2岭洲、hdfs的安全模式
安全模式是hadoop的一種保護(hù)機(jī)制,用于保證集群中的數(shù)據(jù)塊的安全性坎匿。當(dāng)集群?jiǎn)?dòng)的時(shí)候盾剩,會(huì)首先進(jìn)入安全模式。當(dāng)系統(tǒng)處于安全模式時(shí)會(huì)檢查數(shù)據(jù)塊的完整性替蔬。
假設(shè)我們?cè)O(shè)置的副本數(shù)(即參數(shù)dfs.replication)是3彪腔,那么在datanode上就應(yīng)該有3個(gè)副本存在,假設(shè)只存在2個(gè)副本进栽,那么比例就是2/3=0.666德挣。hdfs默認(rèn)的副本率0.999。我們的副本率0.666明顯小于0.999快毛,因此系統(tǒng)會(huì)自動(dòng)的復(fù)制副本到其他dataNode格嗅,使得副本率不小于0.999。如果系統(tǒng)中有5個(gè)副本唠帝,超過(guò)我們?cè)O(shè)定的3個(gè)副本屯掖,那么系統(tǒng)也會(huì)刪除多于的2個(gè)副本。
在安全模式狀態(tài)下襟衰,文件系統(tǒng)只接受讀數(shù)據(jù)請(qǐng)求贴铜,而不接受刪除、修改等變更請(qǐng)求瀑晒。在绍坝,當(dāng)整個(gè)系統(tǒng)達(dá)到安全標(biāo)準(zhǔn)時(shí),HDFS自動(dòng)離開安全模式苔悦。
安全模式操作命令
hdfs dfsadmin -safemode get #查看安全模式狀態(tài)
hdfs dfsadmin -safemode enter #進(jìn)入安全模式
hdfs dfsadmin -safemode leave #離開安全模式
8. HDFS基準(zhǔn)測(cè)試
實(shí)際生產(chǎn)環(huán)境當(dāng)中轩褐,hadoop的環(huán)境搭建完成之后,第一件事情就是進(jìn)行壓力測(cè)試玖详,測(cè)試我們的集群的讀取和寫入速度把介,測(cè)試我們的網(wǎng)絡(luò)帶寬是否足夠等一些基準(zhǔn)測(cè)試
8.1 測(cè)試寫入速度
向HDFS文件系統(tǒng)中寫入數(shù)據(jù),10個(gè)文件,每個(gè)文件10MB,文件存放到/benchmarks/TestDFSIO中
hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -write -nrFiles 10 -fileSize 10MB
完成之后查看寫入速度結(jié)果
hdfs dfs -text /benchmarks/TestDFSIO/io_write/part-00000
8.2 測(cè)試讀取速度
測(cè)試hdfs的讀取文件性能
在HDFS文件系統(tǒng)中讀入10個(gè)文件,每個(gè)文件10M
hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -read -nrFiles 10 -fileSize 10MB
查看讀取果
hdfs dfs -text /benchmarks/TestDFSIO/io_read/part-00000
8.3 清除測(cè)試數(shù)據(jù)
hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -clean
9.HDFS 文件寫入過(guò)程
Client 發(fā)起文件上傳請(qǐng)求, 通過(guò) RPC 與 NameNode 建立通訊, NameNode 檢查目標(biāo)文件是否已存在, 父目錄是否存在, 返回是否可以上傳
Client 請(qǐng)求第一個(gè) block 該傳輸?shù)侥男?DataNode 服務(wù)器上
-
NameNode 根據(jù)配置文件中指定的備份數(shù)量及機(jī)架感知原理進(jìn)行文件分配, 返回可用的 DataNode 的地址如: A, B, C
- Hadoop 在設(shè)計(jì)時(shí)考慮到數(shù)據(jù)的安全與高效, 數(shù)據(jù)文件默認(rèn)在 HDFS 上存放三份, 存儲(chǔ)策略為本地一份, 同機(jī)架內(nèi)其它某一節(jié)點(diǎn)上一份, 不同機(jī)架的某一節(jié)點(diǎn)上一份。
Client 請(qǐng)求 3 臺(tái) DataNode 中的一臺(tái) A 上傳數(shù)據(jù)(本質(zhì)上是一個(gè) RPC 調(diào)用蟋座,建立 pipeline ), A 收到請(qǐng)求會(huì)繼續(xù)調(diào)用 B, 然后 B 調(diào)用 C, 將整個(gè) pipeline 建立完成, 后逐級(jí)返回 client
Client 開始往 A 上傳第一個(gè) block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存), 以 packet 為單位(默認(rèn)64K), A 收到一個(gè) packet 就會(huì)傳給 B, B 傳給 C. A 每傳一個(gè) packet 會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答
數(shù)據(jù)被分割成一個(gè)個(gè) packet 數(shù)據(jù)包在 pipeline 上依次傳輸, 在 pipeline 反方向上, 逐個(gè)發(fā)送 ack(命令正確應(yīng)答), 最終由 pipeline 中第一個(gè) DataNode 節(jié)點(diǎn) A 將 pipelineack 發(fā)送給 Client
當(dāng)一個(gè) block 傳輸完成之后, Client 再次請(qǐng)求 NameNode 上傳第二個(gè) block 到服務(wù) 1
10.HDFS 文件讀取過(guò)程
- Client向NameNode發(fā)起RPC請(qǐng)求拗踢,來(lái)確定請(qǐng)求文件block所在的位置;
- NameNode會(huì)視情況返回文件的部分或者全部block列表向臀,對(duì)于每個(gè)block巢墅,NameNode 都會(huì)返回含有該 block 副本的 DataNode 地址; 這些返回的 DN 地址,會(huì)按照集群拓?fù)浣Y(jié)構(gòu)得出 DataNode 與客戶端的距離砂缩,然后進(jìn)行排序,排序兩個(gè)規(guī)則:網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中距離 Client 近的排靠前三娩;心跳機(jī)制中超時(shí)匯報(bào)的 DN 狀態(tài)為 STALE庵芭,這樣的排靠后;
- Client 選取排序靠前的 DataNode 來(lái)讀取 block雀监,如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)(短路讀取特性)双吆;
- 底層上本質(zhì)是建立 Socket Stream(FSDataInputStream),重復(fù)的調(diào)用父類 DataInputStream 的 read 方法会前,直到這個(gè)塊上的數(shù)據(jù)讀取完畢好乐;
- 當(dāng)讀完列表的 block 后,若文件讀取還沒(méi)有結(jié)束瓦宜,客戶端會(huì)繼續(xù)向NameNode 獲取下一批的 block 列表蔚万;
- 讀取完一個(gè) block 都會(huì)進(jìn)行 checksum 驗(yàn)證,如果讀取 DataNode 時(shí)出現(xiàn)錯(cuò)誤临庇,客戶端會(huì)通知 NameNode反璃,然后再?gòu)南乱粋€(gè)擁有該 block 副本的DataNode 繼續(xù)讀。
- read 方法是并行的讀取 block 信息假夺,不是一塊一塊的讀然打凇;NameNode 只是返回Client請(qǐng)求包含塊的DataNode地址已卷,并不是返回請(qǐng)求塊的數(shù)據(jù)梧田;
- 最終讀取來(lái)所有的 block 會(huì)合并成一個(gè)完整的最終文件。
11.HDFS 的元數(shù)據(jù)輔助管理
當(dāng) Hadoop 的集群當(dāng)中, NameNode的所有元數(shù)據(jù)信息都保存在了 FsImage 與 Eidts 文件當(dāng)中, 這兩個(gè)文件就記錄了所有的數(shù)據(jù)的元數(shù)據(jù)信息, 元數(shù)據(jù)信息的保存目錄配置在了 hdfs-site.xml
當(dāng)中
<property>
<name>dfs.namenode.name.dir</name>
<value>
file:///export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas, file:///export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas2
</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/nn/edits</value
</property>>
11.1 FsImage 和 Edits 詳解
-
edits
-
edits
存放了客戶端最近一段時(shí)間的操作日志 - 客戶端對(duì) HDFS 進(jìn)行寫文件時(shí)會(huì)首先被記錄在
edits
文件中 -
edits
修改時(shí)元數(shù)據(jù)也會(huì)更新
-
-
fsimage
- NameNode 中關(guān)于元數(shù)據(jù)的鏡像, 一般稱為檢查點(diǎn),
fsimage
存放了一份比較完整的元數(shù)據(jù)信息 - 因?yàn)?
fsimage
是 NameNode 的完整的鏡像, 如果每次都加載到內(nèi)存生成樹狀拓?fù)浣Y(jié)構(gòu)侧蘸,這是非常耗內(nèi)存和CPU, 所以一般開始時(shí)對(duì) NameNode 的操作都放在 edits 中 -
fsimage
內(nèi)容包含了 NameNode 管理下的所有 DataNode 文件及文件 block 及 block 所在的 DataNode 的元數(shù)據(jù)信息. - 隨著
edits
內(nèi)容增大, 就需要在一定時(shí)間點(diǎn)和fsimage
合并
- NameNode 中關(guān)于元數(shù)據(jù)的鏡像, 一般稱為檢查點(diǎn),
11.2 fsimage 中的文件信息查看
使用命令 hdfs oiv
cd /export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml
11.3. edits 中的文件信息查看
使用命令 hdfs oev
cd /export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas
hdfs oev -i edits_0000000000000000865-0000000000000000866 -p XML -o myedit.xml
11.4 SecondaryNameNode 如何輔助管理 fsimage 與 edits 文件?
SecondaryNameNode 定期合并 fsimage 和 edits, 把 edits 控制在一個(gè)范圍內(nèi)
-
配置 SecondaryNameNode
SecondaryNameNode 在
conf/masters
中指定-
在 masters 指定的機(jī)器上, 修改
hdfs-site.xml
<property> <name>dfs.http.address</name> <value>host:50070</value> </property>
-
修改
core-site.xml
, 這一步不做配置保持默認(rèn)也可以<!-- 多久記錄一次 HDFS 鏡像, 默認(rèn) 1小時(shí) --> <property> <name>fs.checkpoint.period</name> <value>3600</value> </property> <!-- 一次記錄多大, 默認(rèn) 64M --> <property> <name>fs.checkpoint.size</name> <value>67108864</value> </property>
- SecondaryNameNode 通知 NameNode 切換 editlog
- SecondaryNameNode 從 NameNode 中獲得 fsimage 和 editlog(通過(guò)http方式)
- SecondaryNameNode 將 fsimage 載入內(nèi)存, 然后開始合并 editlog, 合并之后成為新的 fsimage
- SecondaryNameNode 將新的 fsimage 發(fā)回給 NameNode
- NameNode 用新的 fsimage 替換舊的 fsimage
特點(diǎn)
- 完成合并的是 SecondaryNameNode, 會(huì)請(qǐng)求 NameNode 停止使用 edits, 暫時(shí)將新寫操作放入一個(gè)新的文件中
edits.new
- SecondaryNameNode 從 NameNode 中通過(guò) Http GET 獲得 edits, 因?yàn)橐?fsimage 合并, 所以也是通過(guò) Http Get 的方式把 fsimage 加載到內(nèi)存, 然后逐一執(zhí)行具體對(duì)文件系統(tǒng)的操作, 與 fsimage 合并, 生成新的 fsimage, 然后通過(guò) Http POST 的方式把 fsimage 發(fā)送給 NameNode. NameNode 從 SecondaryNameNode 獲得了 fsimage 后會(huì)把原有的 fsimage 替換為新的 fsimage, 把 edits.new 變成 edits. 同時(shí)會(huì)更新 fstime
- Hadoop 進(jìn)入安全模式時(shí)需要管理員使用 dfsadmin 的 save namespace 來(lái)創(chuàng)建新的檢查點(diǎn)
- SecondaryNameNode 在合并 edits 和 fsimage 時(shí)需要消耗的內(nèi)存和 NameNode 差不多, 所以一般把 NameNode 和 SecondaryNameNode 放在不同的機(jī)器上