Hadoop 核心-HDFS

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).

HDFS and Mapreduce

1.2 歷史

  1. Doug Cutting (hadoop之父)在做 Lucene 的時(shí)候, 需要編寫一個(gè)爬蟲服務(wù), 這個(gè)爬蟲寫的并不順利, 遇到了一些問(wèn)題, 諸如: 如何存儲(chǔ)大規(guī)模的數(shù)據(jù), 如何保證集群的可伸縮性, 如何動(dòng)態(tài)容錯(cuò)等
  2. 2013年的時(shí)候, Google 發(fā)布了三篇論文, 被稱作為三駕馬車, 其中有一篇叫做 GFS, 是描述了 Google 內(nèi)部的一個(gè)叫做 GFS 的分布式大規(guī)模文件系統(tǒng), 具有強(qiáng)大的可伸縮性(擴(kuò)展能力)和容錯(cuò)性
  3. 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 ClientNameNode姻锁、DataNodeSecondary NameNode枕赵。

1561706903642.png

**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

1561706945153.png

4.1 NameNode作用

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)中,作用如下

  1. 一個(gè)文件有可能大于集群中任意一個(gè)磁盤,引入塊機(jī)制,可以很好的解決這個(gè)問(wèn)題
  2. 使用塊作為文件存儲(chǔ)的邏輯單位可以簡(jiǎn)化存儲(chǔ)子系統(tǒng)
  3. 塊非常適合用于數(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>
1561706988677.png

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ò)程

1.png
  1. Client 發(fā)起文件上傳請(qǐng)求, 通過(guò) RPC 與 NameNode 建立通訊, NameNode 檢查目標(biāo)文件是否已存在, 父目錄是否存在, 返回是否可以上傳

  2. Client 請(qǐng)求第一個(gè) block 該傳輸?shù)侥男?DataNode 服務(wù)器上

  3. 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)上一份。
  4. 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

  5. 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)答

  6. 數(shù)據(jù)被分割成一個(gè)個(gè) packet 數(shù)據(jù)包在 pipeline 上依次傳輸, 在 pipeline 反方向上, 逐個(gè)發(fā)送 ack(命令正確應(yīng)答), 最終由 pipeline 中第一個(gè) DataNode 節(jié)點(diǎn) A 將 pipelineack 發(fā)送給 Client

  7. 當(dāng)一個(gè) block 傳輸完成之后, Client 再次請(qǐng)求 NameNode 上傳第二個(gè) block 到服務(wù) 1

10.HDFS 文件讀取過(guò)程

1558574532408.png
  1. Client向NameNode發(fā)起RPC請(qǐng)求拗踢,來(lái)確定請(qǐng)求文件block所在的位置;
  2. 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庵芭,這樣的排靠后;
  3. Client 選取排序靠前的 DataNode 來(lái)讀取 block雀监,如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)(短路讀取特性)双吆;
  4. 底層上本質(zhì)是建立 Socket Stream(FSDataInputStream),重復(fù)的調(diào)用父類 DataInputStream 的 read 方法会前,直到這個(gè)塊上的數(shù)據(jù)讀取完畢好乐;
  5. 當(dāng)讀完列表的 block 后,若文件讀取還沒(méi)有結(jié)束瓦宜,客戶端會(huì)繼續(xù)向NameNode 獲取下一批的 block 列表蔚万;
  6. 讀取完一個(gè) block 都會(huì)進(jìn)行 checksum 驗(yàn)證,如果讀取 DataNode 時(shí)出現(xiàn)錯(cuò)誤临庇,客戶端會(huì)通知 NameNode反璃,然后再?gòu)南乱粋€(gè)擁有該 block 副本的DataNode 繼續(xù)讀。
  7. read 方法是并行的讀取 block 信息假夺,不是一塊一塊的讀然打凇;NameNode 只是返回Client請(qǐng)求包含塊的DataNode地址已卷,并不是返回請(qǐng)求塊的數(shù)據(jù)梧田;
  8. 最終讀取來(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 合并

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>
      
1561707242581.png
  1. SecondaryNameNode 通知 NameNode 切換 editlog
  2. SecondaryNameNode 從 NameNode 中獲得 fsimage 和 editlog(通過(guò)http方式)
  3. SecondaryNameNode 將 fsimage 載入內(nèi)存, 然后開始合并 editlog, 合并之后成為新的 fsimage
  4. SecondaryNameNode 將新的 fsimage 發(fā)回給 NameNode
  5. 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ī)器上
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裁眯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子讳癌,更是在濱河造成了極大的恐慌未状,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析桥,死亡現(xiàn)場(chǎng)離奇詭異司草,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泡仗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門埋虹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娩怎,你說(shuō)我怎么就攤上這事搔课。” “怎么了截亦?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵爬泥,是天一觀的道長(zhǎng)柬讨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)袍啡,這世上最難降的妖魔是什么踩官? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮境输,結(jié)果婚禮上蔗牡,老公的妹妹穿的比我還像新娘。我一直安慰自己嗅剖,他們只是感情好辩越,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著信粮,像睡著了一般黔攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上强缘,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天亏钩,我揣著相機(jī)與錄音,去河邊找鬼欺旧。 笑死姑丑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辞友。 我是一名探鬼主播栅哀,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼称龙!你這毒婦竟也來(lái)了留拾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲫尊,失蹤者是張志新(化名)和其女友劉穎痴柔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疫向,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咳蔚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搔驼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谈火。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舌涨,靈堂內(nèi)的尸體忽然破棺而出糯耍,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布温技,位于F島的核電站革为,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舵鳞。R本人自食惡果不足惜震檩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望系任。 院中可真熱鬧恳蹲,春花似錦虐块、人聲如沸俩滥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)霜旧。三九已至,卻和暖如春儡率,著一層夾襖步出監(jiān)牢的瞬間挂据,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工儿普, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崎逃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓眉孩,卻偏偏與公主長(zhǎng)得像个绍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浪汪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容