HadoopHDFS分布式文件系統(tǒng)怎么理解

本篇內(nèi)容介紹了“Hadoop HDFS分布式文件系統(tǒng)怎么理解”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有普陀免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

1. HDFS概述

Hadoop 分布式系統(tǒng)框架中,首要的基礎(chǔ)功能就是文件系統(tǒng),在 Hadoop 中使用 FileSystem 這個(gè)抽象類來表示我們的文件系統(tǒng),這個(gè)抽象類下面有很多子實(shí)現(xiàn)類,究竟使用哪一種,需要看我們具體的實(shí)現(xiàn)類,在我們實(shí)際工作中,用到的最多的就是HDFS(分布式文件系統(tǒng))以及LocalFileSystem(本地文件系統(tǒng))了。

在現(xiàn)代的企業(yè)環(huán)境中,單機(jī)容量往往無法存儲(chǔ)大量數(shù)據(jù),需要跨機(jī)器存儲(chǔ)。統(tǒng)一管理分布在集群上的文件系統(tǒng)稱為分布式文件系統(tǒng)。

HDFS(Hadoop Distributed File System)是 Hadoop 項(xiàng)目的一個(gè)子項(xiàng)目。是 Hadoop 的核心組件之一, Hadoop 非常適于存儲(chǔ)大型數(shù)據(jù) (比如 TB 和 PB),其就是使用 HDFS 作為存儲(chǔ)系統(tǒng). HDFS 使用多臺(tái)計(jì)算機(jī)存儲(chǔ)文件,并且提供統(tǒng)一的訪問接口,像是訪問一個(gè)普通文件系統(tǒng)一樣使用分布式文件系統(tǒng)。

Hadoop HDFS分布式文件系統(tǒng)怎么理解

HDFS文件系統(tǒng)

2. HDFS架構(gòu)

HDFS是一個(gè)主/從(Mater/Slave)體系結(jié)構(gòu),由三部分組成: NameNodeDataNode以及 SecondaryNamenode

  • NameNode 負(fù)責(zé)管理整個(gè)文件系統(tǒng)的元數(shù)據(jù),以及每一個(gè)路徑(文件)所對(duì)應(yīng)的數(shù)據(jù)塊信息。

  • DataNode 負(fù)責(zé)管理用戶的文件數(shù)據(jù)塊,每一個(gè)數(shù)據(jù)塊都可以在多個(gè) DataNode 上存儲(chǔ)多個(gè)副本,默認(rèn)為3個(gè)。

  • Secondary NameNode 用來監(jiān)控 HDFS 狀態(tài)的輔助后臺(tái)程序,每隔一段時(shí)間獲取 HDFS 元數(shù)據(jù)的快照。最主要作用是輔助 NameNode 管理元數(shù)據(jù)信息

Hadoop HDFS分布式文件系統(tǒng)怎么理解

3. HDFS的特性

首先,它是一個(gè)文件系統(tǒng),用于存儲(chǔ)文件,通過統(tǒng)一的命名空間目錄樹來定位文件;

其次,它是分布式的,由很多服務(wù)器聯(lián)合起來實(shí)現(xiàn)其功能,集群中的服務(wù)器有各自的角色。

  • 1. master/slave 架構(gòu)(主從架構(gòu))

HDFS 采用 master/slave 架構(gòu)。一般一個(gè) HDFS 集群是有一個(gè) Namenode 和一定數(shù)目的 Datanode 組成。Namenode 是 HDFS 集群主節(jié)點(diǎn),Datanode 是 HDFS 集群從節(jié)點(diǎn),兩種角色各司其職,共同協(xié)調(diào)完成分布式的文件存儲(chǔ)服務(wù)。

  • 2. 分塊存儲(chǔ)

HDFS 中的文件在物理上是分塊存儲(chǔ)(block)的,塊的大小可以通過配置參數(shù)來規(guī)定,默認(rèn)大小在 hadoop2.x 版本中是 128M。

  • 3. 名字空間(NameSpace)

HDFS 支持傳統(tǒng)的層次型文件組織結(jié)構(gòu)。用戶或者應(yīng)用程序可以創(chuàng)建目錄,然后將文件保存在這些目錄里。文件系統(tǒng)名字空間的層次結(jié)構(gòu)和大多數(shù)現(xiàn)有的文件系統(tǒng)類似:用戶可以創(chuàng)建、刪除、移動(dòng)或重命名文件。
Namenode 負(fù)責(zé)維護(hù)文件系統(tǒng)的名字空間,任何對(duì)文件系統(tǒng)名字空間或?qū)傩缘男薷亩紝⒈?Namenode 記錄下來。
HDFS 會(huì)給客戶端提供一個(gè)統(tǒng)一的抽象目錄樹,客戶端通過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。

  • 4. NameNode 元數(shù)據(jù)管理

我們把目錄結(jié)構(gòu)及文件分塊位置信息叫做元數(shù)據(jù)。NameNode 負(fù)責(zé)維護(hù)整個(gè) HDFS 文件系統(tǒng)的目錄樹結(jié)構(gòu),以及每一個(gè)文件所對(duì)應(yīng)的 block 塊信息(block 的 id,及所在的 DataNode 服務(wù)器)。

  • 5. DataNode 數(shù)據(jù)存儲(chǔ)

文件的各個(gè) block 的具體存儲(chǔ)管理由 DataNode 節(jié)點(diǎn)承擔(dān)。每一個(gè) block 都可以在多個(gè) DataNode 上。DataNode 需要定時(shí)向 NameNode 匯報(bào)自己持有的 block 信息。 存儲(chǔ)多個(gè)副本(副本數(shù)量也可以通過參數(shù)設(shè)置 dfs.replication,默認(rèn)是 3)

  • 6. 副本機(jī)制

為了容錯(cuò),文件的所有 block 都會(huì)有副本。每個(gè)文件的 block 大小和副本系數(shù)都是可配置的。應(yīng)用程序可以指定某個(gè)文件的副本數(shù)目。副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也可以在之后改變。

  • 7. 一次寫入,多次讀出

HDFS 是設(shè)計(jì)成適應(yīng)一次寫入,多次讀出的場(chǎng)景,且不支持文件的修改。
正因?yàn)槿绱?,HDFS 適合用來做大數(shù)據(jù)分析的底層存儲(chǔ)服務(wù),并不適合用來做網(wǎng)盤等應(yīng)用,因?yàn)樾薷牟环奖?,延遲大,網(wǎng)絡(luò)開銷大,成本太高。

4. HDFS 的命令行使用

如果沒有配置 hadoop 的環(huán)境變量,則在 hadoop 的安裝目錄下的bin目錄中執(zhí)行以下命令,如已配置 hadoop 環(huán)境變量,則可在任意目錄下執(zhí)行

help

格式:  hdfs dfs -help 操作命令
作用: 查看某一個(gè)操作命令的參數(shù)信息

ls

格式:hdfs dfs -ls  URI
作用:類似于Linux的ls命令,顯示文件列表

lsr

格式  :   hdfs  dfs -lsr URI
作用  : 在整個(gè)目錄下遞歸執(zhí)行l(wèi)s, 與UNIX中的ls-R類似

mkdir

格式 : hdfs  dfs  -mkdir [-p] <paths>
作用 :   以<paths>中的URI作為參數(shù),創(chuàng)建目錄。使用-p參數(shù)可以遞歸創(chuàng)建目錄

put

格式   : 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  /rooot/bigdata.txt  /dir1

moveFromLocal

格式: hdfs  dfs -moveFromLocal  <localsrc>   <dst>
作用:  和put命令類似,但是源文件localsrc拷貝之后自身被刪除
hdfs  dfs -moveFromLocal  /root/bigdata.txt  /

copyFromLocal

格式:  hdfs dfs -copyFromLocal <localsrc> ... <dst>作用: 從本地文件系統(tǒng)中拷貝文件到hdfs路徑去

appendToFile

格式: hdfs dfs -appendToFile <localsrc> ... <dst>
作用: 追加一個(gè)或者多個(gè)文件到hdfs指定文件中.也可以從命令行讀取輸入.
 hdfs dfs -appendToFile  a.xml b.xml  /big.xml

moveToLocal

在 hadoop 2.6.4 版本測(cè)試還未未實(shí)現(xiàn)此方法
格式:hadoop  dfs  -moveToLocal [-crc] <src> <dst>
作用:將本地文件剪切到 HDFS

get

格式   hdfs dfs  -get [-ignorecrc ]  [-crc]  <src> <localdst>

作用:將文件拷貝到本地文件系統(tǒng)。 CRC 校驗(yàn)失敗的文件通過-ignorecrc選項(xiàng)拷貝。 文件和CRC校驗(yàn)可以通過-CRC選項(xiàng)拷貝
hdfs dfs  -get   /bigdata.txt  /export/servers

getmerge

格式: hdfs dfs -getmerge <src> <localdst>
作用: 合并下載多個(gè)文件,比如hdfs的目錄 /aaa/下有多個(gè)文件:log.1, log.2,log.3,...

copyToLocal

格式:  hdfs dfs -copyToLocal <src> ... <localdst>作用:  從hdfs拷貝到本地

mv

格式  : hdfs  dfs -mv URI   <dest>
作用: 將hdfs上的文件從原路徑移動(dòng)到目標(biāo)路徑(移動(dòng)之后文件刪除),該命令不能跨文件系統(tǒng)
hdfs  dfs  -mv  /dir1/bigdata.txt   /dir2

rm

格式: hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 。。。】
作用: 刪除參數(shù)指定的文件,參數(shù)可以有多個(gè)。  此命令只刪除文件和非空目錄。
如果指定-skipTrash選項(xiàng),那么在回收站可用的情況下,該選項(xiàng)將跳過回收站而直接刪除文件;
否則,在回收站可用時(shí),在HDFS Shell 中執(zhí)行此命令,會(huì)將文件暫時(shí)放到回收站中。
hdfs  dfs  -rm  -r  /dir1

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/bigdata.txt

cat

hdfs dfs  -cat  URI [uri  ...]
作用:將參數(shù)所指示的文件內(nèi)容輸出到stdout
hdfs dfs  -cat /bigdata.txt

tail

格式: hdfs dfs -tail path
作用: 顯示一個(gè)文件的末尾

text

格式:hdfs dfs -text path作用: 以字符形式打印一個(gè)文件的內(nèi)容

chmod

格式:hdfs  dfs  -chmod  [-R]  URI[URI  ...]
作用:改變文件權(quán)限。如果使用  -R 選項(xiàng),則對(duì)整個(gè)目錄有效遞歸執(zhí)行。使用這一命令的用戶必須是文件的所屬用戶,或者超級(jí)用戶。
hdfs dfs -chmod -R 777 /bigdata.txt

chown

格式:  hdfs  dfs  -chmod  [-R]  URI[URI ...]
作用:  改變文件的所屬用戶和用戶組。如果使用  -R 選項(xiàng),則對(duì)整個(gè)目錄有效遞歸執(zhí)行。使用這一命令的用戶必須是文件的所屬用戶,或者超級(jí)用戶。
hdfs  dfs  -chown  -R hadoop:hadoop  /bigdata.txt

df

格式: hdfs dfs  -df  -h  path
作用: 統(tǒng)計(jì)文件系統(tǒng)的可用空間信息

du

格式: hdfs dfs -du -s -h path
作用: 統(tǒng)計(jì)文件夾的大小信息

count

格式: hdfs dfs -count path
作用: 統(tǒng)計(jì)一個(gè)指定目錄下的文件節(jié)點(diǎn)數(shù)量

setrep

格式:  hdfs dfs -setrep num filePath
作用: 設(shè)置hdfs中文件的副本數(shù)量
注意: 即使設(shè)置的超過了datanode的數(shù)量,副本的數(shù)量也最多只能和datanode的數(shù)量是一致的

expunge (慎用)

格式:  hdfs dfs  -expunge
作用: 清空hdfs垃圾桶

5. hdfs的高級(jí)使用命令

5.1. HDFS文件限額配置

在多人共用HDFS的環(huán)境下,配置設(shè)置非常重要。特別是在 Hadoop 處理大量資料的環(huán)境,如果沒有配額管理,很容易把所有的空間用完造成別人無法存取。HDFS 的配額設(shè)定是針對(duì)目錄而不是針對(duì)賬號(hào),可以讓每個(gè)賬號(hào)僅操作某一個(gè)目錄,然后對(duì)目錄設(shè)置配置

HDFS 文件的限額配置允許我們以文件個(gè)數(shù),或者文件大小來限制我們?cè)谀硞€(gè)目錄下上傳的文件數(shù)量或者文件內(nèi)容總量,以便達(dá)到我們類似百度網(wǎng)盤網(wǎng)盤等限制每個(gè)用戶允許上傳的最大的文件的量。

 hdfs dfs -count -q -h /user/root/dir1  #查看配額信息

結(jié)果:

5.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ù)量限制
5.1.2. 空間大小限額

在設(shè)置空間配額時(shí),設(shè)置的空間至少是 block_size * 3 大小

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

5.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è)副本,超過我們?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)離開安全模式。30s

安全模式操作命令

    hdfs  dfsadmin  -safemode  get #查看安全模式狀態(tài)
    hdfs  dfsadmin  -safemode  enter #進(jìn)入安全模式
    hdfs  dfsadmin  -safemode  leave #離開安全模式

6. HDFS 的 block 塊和副本機(jī)制

HDFS 將所有的文件全部抽象成為 block 塊來進(jìn)行存儲(chǔ),不管文件大小,全部一視同仁都是以 block 塊的統(tǒng)一大小和形式進(jìn)行存儲(chǔ),方便我們的分布式文件系統(tǒng)對(duì)文件的管理。

所有的文件都是以 block 塊的方式存放在 hdfs 文件系統(tǒng)當(dāng)中,在 Hadoop 1 版本當(dāng)中,文件的 block 塊默認(rèn)大小是 64M,Hadoop 2 版本當(dāng)中,文件的 block 塊大小默認(rèn)是128M,block塊的大小可以通過 hdfs-site.xml 當(dāng)中的配置文件進(jìn)行指定。

<property>    <name>dfs.block.size</name>    <value>塊大小 以字節(jié)為單位</value> //只寫數(shù)值就可以</property>

6.1 抽象為block塊的好處

  • 1) 一個(gè)文件有可能大于集群中任意一個(gè)磁盤
    10T*3/128 = xxx塊 2T,2T,2T 文件方式存—–>多個(gè)block塊,這些block塊屬于一個(gè)文件

  • 2) 使用塊抽象而不是文件可以簡(jiǎn)化存儲(chǔ)子系統(tǒng)

  • 3) 塊非常適合用于數(shù)據(jù)備份進(jìn)而提供數(shù)據(jù)容錯(cuò)能力和可用性

6.2 塊緩存

通常 DataNode 從磁盤中讀取塊,但對(duì)于訪問頻繁的文件,其對(duì)應(yīng)的塊可能被顯示的緩存在 DataNode 的內(nèi)存中,以堆外塊緩存的形式存在。默認(rèn)情況下,一個(gè)塊僅緩存在一個(gè)DataNode的內(nèi)存中,當(dāng)然可以針對(duì)每個(gè)文件配置DataNode的數(shù)量。作業(yè)調(diào)度器通過在緩存塊的DataNode上運(yùn)行任務(wù),可以利用塊緩存的優(yōu)勢(shì)提高讀操作的性能

例如:
連接(join)操作中使用的一個(gè)小的查詢表就是塊緩存的一個(gè)很好的候選。 用戶或應(yīng)用通過在緩存池中增加一個(gè)cache directive來告訴namenode需要緩存哪些文件及存多久。緩存池(cache pool)是一個(gè)擁有管理緩存權(quán)限和資源使用的管理性分組。

例如:

一個(gè)文件 130M,會(huì)被切分成2個(gè)block塊,保存在兩個(gè)block塊里面,實(shí)際占用磁盤130M空間,而不是占用256M的磁盤空間

6.3 hdfs的文件權(quán)限驗(yàn)證

hdfs的文件權(quán)限機(jī)制與linux系統(tǒng)的文件權(quán)限機(jī)制類似

r:read w:write x:execute
權(quán)限x對(duì)于文件表示忽略,對(duì)于文件夾表示是否有權(quán)限訪問其內(nèi)容

如果linux系統(tǒng)用戶zhangsan使用hadoop命令創(chuàng)建一個(gè)文件,那么這個(gè)文件在HDFS當(dāng)中的owner就是zhangsan

HDFS文件權(quán)限的目的,防止好人做錯(cuò)事,而不是阻止壞人做壞事。HDFS相信你告訴我你是誰,你就是誰

6.4 hdfs的副本因子

為了保證block塊的安全性,也就是數(shù)據(jù)的安全性,在hadoop2當(dāng)中,文件默認(rèn)保存三個(gè)副本,我們可以更改副本數(shù)以提高數(shù)據(jù)的安全性

、在hdfs-site.xml當(dāng)中修改以下配置屬性,即可更改文件的副本數(shù)

<property>     <name>dfs.replication</name>     <value>3</value></property>

7. HDFS 文件寫入過程(非常重要)

Hadoop HDFS分布式文件系統(tǒng)怎么理解

HDFS 文件寫入過程

  1. Client 發(fā)起文件上傳請(qǐng)求,通過 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)上一份。

  1. 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;

  2. 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)答;

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

  4. 當(dāng)一個(gè) block 傳輸完成之后,Client 再次請(qǐng)求 NameNode 上傳第二個(gè) block,重復(fù)步驟 2;

7.1 網(wǎng)絡(luò)拓?fù)涓拍?/h4>

在本地網(wǎng)絡(luò)中,兩個(gè)節(jié)點(diǎn)被稱為“彼此近鄰”是什么意思?在海量數(shù)據(jù)處理中,其主要限制因素是節(jié)點(diǎn)之間數(shù)據(jù)的傳輸速率——帶寬很稀缺。這里的想法是將兩個(gè)節(jié)點(diǎn)間的帶寬作為距離的衡量標(biāo)準(zhǔn)。

節(jié)點(diǎn)距離:兩個(gè)節(jié)點(diǎn)到達(dá)最近的共同祖先的距離總和。

例如,假設(shè)有數(shù)據(jù)中心d1機(jī)架r1中的節(jié)點(diǎn)n1。該節(jié)點(diǎn)可以表示為/d1/r1/n1。利用這種標(biāo)記,這里給出四種距離描述。

Distance(/d1/r1/n1, /d1/r1/n1)=0(同一節(jié)點(diǎn)上的進(jìn)程)

Distance(/d1/r1/n1, /d1/r1/n2)=2(同一機(jī)架上的不同節(jié)點(diǎn))

Distance(/d1/r1/n1, /d1/r3/n2)=4(同一數(shù)據(jù)中心不同機(jī)架上的節(jié)點(diǎn))

Distance(/d1/r1/n1, /d2/r4/n2)=6(不同數(shù)據(jù)中心的節(jié)點(diǎn))

Hadoop HDFS分布式文件系統(tǒng)怎么理解

機(jī)架感知

2) Hadoop2.7.2 副本節(jié)點(diǎn)選擇

第一個(gè)副本在client所處的節(jié)點(diǎn)上。如果客戶端在集群外,隨機(jī)選一個(gè)。

第二個(gè)副本和第一個(gè)副本位于相同機(jī)架,隨機(jī)節(jié)點(diǎn)。

第三個(gè)副本位于不同機(jī)架,隨機(jī)節(jié)點(diǎn)。

Hadoop HDFS分布式文件系統(tǒng)怎么理解

HDFS 文件讀取過程

  1. Client向NameNode發(fā)起RPC請(qǐng)求,來確定請(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 來讀取 block,如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)(短路讀取特性);

  4. 底層上本質(zhì)是建立 Socket Stream(FSDataInputStream),重復(fù)的調(diào)用父類 DataInputStream 的 read 方法,直到這個(gè)塊上的數(shù)據(jù)讀取完畢;

  5. 當(dāng)讀完列表的 block 后,若文件讀取還沒有結(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. 最終讀取來所有的 block 會(huì)合并成一個(gè)完整的最終文件。

從 HDFS 文件讀寫過程中,可以看出,HDFS 文件寫入時(shí)是串行寫入的,數(shù)據(jù)包先發(fā)送給節(jié)點(diǎn)A,然后節(jié)點(diǎn)A發(fā)送給B,B在給C;而HDFS文件讀取是并行的, 客戶端 Client 直接并行讀取block所在的節(jié)點(diǎn)。

9. NameNode 工作機(jī)制以及元數(shù)據(jù)管理(重要)

NameNode 工作機(jī)制

NameNode 工作機(jī)制

9.1 namenode 與 datanode 啟動(dòng)

  • namenode工作機(jī)制

  1. 第一次啟動(dòng)namenode格式化后,創(chuàng)建fsimage和edits文件。如果不是第一次啟動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。

  2. 客戶端對(duì)元數(shù)據(jù)進(jìn)行增刪改的請(qǐng)求。

  3. namenode記錄操作日志,更新滾動(dòng)日志。

  4. namenode在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行增刪改查。

  • secondary namenode

  1. secondary namenode詢問 namenode 是否需要 checkpoint。直接帶回 namenode 是否檢查結(jié)果。

  2. secondary namenode 請(qǐng)求執(zhí)行 checkpoint。

  3. namenode 滾動(dòng)正在寫的edits日志。

  4. 將滾動(dòng)前的編輯日志和鏡像文件拷貝到 secondary namenode。

  5. secondary namenode 加載編輯日志和鏡像文件到內(nèi)存,并合并。

  6. 生成新的鏡像文件 fsimage.chkpoint。

  7. 拷貝 fsimage.chkpoint 到 namenode。

  8. namenode將 fsimage.chkpoint 重新命名成fsimage。

9.2 FSImage與edits詳解

所有的元數(shù)據(jù)信息都保存在了FsImage與Eidts文件當(dāng)中,這兩個(gè)文件就記錄了所有的數(shù)據(jù)的元數(shù)據(jù)信息,元數(shù)據(jù)信息的保存目錄配置在了 hdfs-site.xml當(dāng)中

        <!--fsimage文件存儲(chǔ)的路徑-->        <property>                <name>dfs.namenode.name.dir</name>                <value>file:///opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/namenodeDatas</value>        </property>        <!-- edits文件存儲(chǔ)的路徑 -->        <property>                <name>dfs.namenode.edits.dir</name>                <value>file:///opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/dfs/nn/edits</value>          </property>

客戶端對(duì)hdfs進(jìn)行寫文件時(shí)會(huì)首先被記錄在edits文件中。

edits修改時(shí)元數(shù)據(jù)也會(huì)更新。

每次hdfs更新時(shí)edits先更新后客戶端才會(huì)看到最新信息。

fsimage:是namenode中關(guān)于元數(shù)據(jù)的鏡像,一般稱為檢查點(diǎn)。

一般開始時(shí)對(duì)namenode的操作都放在edits中,為什么不放在fsimage中呢?

因?yàn)閒simage是namenode的完整的鏡像,內(nèi)容很大,如果每次都加載到內(nèi)存的話生成樹狀拓?fù)浣Y(jié)構(gòu),這是非常耗內(nèi)存和CPU。

fsimage內(nèi)容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元數(shù)據(jù)信息。隨著edits內(nèi)容增大,就需要在一定時(shí)間點(diǎn)和fsimage合并。

9.3 FSimage文件當(dāng)中的文件信息查看

  • 使用命令 hdfs oiv

cd  /opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/namenodeDatas/current
hdfs oiv -i fsimage_0000000000000000112 -p XML -o hello.xml

9.4 edits當(dāng)中的文件信息查看

  • 查看命令 hdfs oev

cd  /opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/dfs/nn/edits
hdfs oev -i  edits_0000000000000000112-0000000000000000113 -o myedit.xml -p XML

9.5 secondarynameNode如何輔助管理FSImage與Edits文件

  1. secnonaryNN通知NameNode切換editlog。

  2. secondaryNN從NameNode中獲得FSImage和editlog(通過http方式)。

  3. secondaryNN將FSImage載入內(nèi)存,然后開始合并editlog,合并之后成為新的fsimage。

  4. secondaryNN將新的fsimage發(fā)回給NameNode。

  5. NameNode用新的fsimage替換舊的fsimage。

Hadoop HDFS分布式文件系統(tǒng)怎么理解

完成合并的是 secondarynamenode,會(huì)請(qǐng)求namenode停止使用edits,暫時(shí)將新寫操作放入一個(gè)新的文件中(edits.new)。

secondarynamenode從namenode中通過http get獲得edits,因?yàn)橐蚮simage合并,所以也是通過http get 的方式把fsimage加載到內(nèi)存,然后逐一執(zhí)行具體對(duì)文件系統(tǒng)的操作,與fsimage合并,生成新的fsimage,然后把fsimage發(fā)送給namenode,通過http post的方式

namenode從secondarynamenode獲得了fsimage后會(huì)把原有的fsimage替換為新的fsimage,把edits.new變成edits。同時(shí)會(huì)更新fsimage。

hadoop進(jìn)入安全模式時(shí)需要管理員使用dfsadmin的save namespace來創(chuàng)建新的檢查點(diǎn)。

secondarynamenode在合并edits和fsimage時(shí)需要消耗的內(nèi)存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的機(jī)器上。

fsimage與edits的合并時(shí)機(jī)取決于兩個(gè)參數(shù),第一個(gè)參數(shù)是默認(rèn)1小時(shí)fsimage與edits合并一次。

  • 第一個(gè)參數(shù):時(shí)間達(dá)到一個(gè)小時(shí)fsimage與edits就會(huì)進(jìn)行合并

dfs.namenode.checkpoint.period     3600
  • 第二個(gè)參數(shù):hdfs操作達(dá)到1000000次也會(huì)進(jìn)行合并

dfs.namenode.checkpoint.txns       1000000
  • 第三個(gè)參數(shù):每隔多長(zhǎng)時(shí)間檢查一次hdfs的操作次數(shù)

dfs.namenode.checkpoint.check.period   60

9.6 namenode元數(shù)據(jù)信息多目錄配置

為了保證元數(shù)據(jù)的安全性,我們一般都是先確定好我們的磁盤掛載目錄,將元數(shù)據(jù)的磁盤做RAID1

namenode的本地目錄可以配置成多個(gè),且每個(gè)目錄存放內(nèi)容相同,增加了可靠性。

  • 具體配置方案:

    hdfs-site.xml

    <property>         <name>dfs.namenode.name.dir</name>         <value>file:///export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/namenodeDatas</value>    </property>

9.7 namenode故障恢復(fù)

在我們的secondaryNamenode對(duì)namenode當(dāng)中的fsimage和edits進(jìn)行合并的時(shí)候,每次都會(huì)先將namenode的fsimage與edits文件拷貝一份過來,所以fsimage與edits文件在secondarNamendoe當(dāng)中也會(huì)保存有一份,如果namenode的fsimage與edits文件損壞,那么我們可以將secondaryNamenode當(dāng)中的fsimage與edits拷貝過去給namenode繼續(xù)使用,只不過有可能會(huì)丟失一部分?jǐn)?shù)據(jù)。這里涉及到幾個(gè)配置選項(xiàng)

  • namenode保存fsimage的配置路徑

<!--  namenode元數(shù)據(jù)存儲(chǔ)路徑,實(shí)際工作當(dāng)中一般使用SSD固態(tài)硬盤,并使用多個(gè)固態(tài)硬盤隔開,冗余元數(shù)據(jù) -->    <property>        <name>dfs.namenode.name.dir</name>        <value>file:///export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/namenodeDatas</value>    </property>
  • namenode保存edits文件的配置路徑

<property>        <name>dfs.namenode.edits.dir</name>        <value>file:///export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/dfs/nn/edits</value></property>
  • secondaryNamenode保存fsimage文件的配置路徑

<property>        <name>dfs.namenode.checkpoint.dir</name>        <value>file:///export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/dfs/snn/name</value></property>
  • secondaryNamenode保存edits文件的配置路徑

<property>        <name>dfs.namenode.checkpoint.edits.dir</name>        <value>file:///export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/dfs/nn/snn/edits</value></property>

接下來我們來模擬namenode的故障恢復(fù)功能

  1. 殺死namenode進(jìn)程: 使用jps查看namenode的進(jìn)程號(hào) , kill -9 直接殺死。

  2. 刪除namenode的fsimage文件和edits文件。

根據(jù)上述配置, 找到namenode放置fsimage和edits路徑. 直接全部rm -rf 刪除。

  1. 拷貝secondaryNamenode的fsimage與edits文件到namenode的fsimage與edits文件夾下面去。
    根據(jù)上述配置, 找到secondaryNamenode的fsimage和edits路徑, 將內(nèi)容 使用cp -r 全部復(fù)制到namenode對(duì)應(yīng)的目錄下即可。

  2. 重新啟動(dòng)namenode, 觀察數(shù)據(jù)是否存在。

10 datanode工作機(jī)制以及數(shù)據(jù)存儲(chǔ)

  • datanode工作機(jī)制

  1. 一個(gè)數(shù)據(jù)塊在datanode上以文件形式存儲(chǔ)在磁盤上,包括兩個(gè)文件,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù)包括數(shù)據(jù)塊的長(zhǎng)度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳。

  2. DataNode啟動(dòng)后向namenode注冊(cè),通過后,周期性(1小時(shí))的向namenode上報(bào)所有的塊信息。(dfs.blockreport.intervalMsec)。

  3. 心跳是每3秒一次,心跳返回結(jié)果帶有namenode給該datanode的命令如復(fù)制塊數(shù)據(jù)到另一臺(tái)機(jī)器,或刪除某個(gè)數(shù)據(jù)塊。如果超過10分鐘沒有收到某個(gè)datanode的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。

  4. 集群運(yùn)行中可以安全加入和退出一些機(jī)器。

  • 數(shù)據(jù)完整性

  1. 當(dāng)DataNode讀取block的時(shí)候,它會(huì)計(jì)算checksum。

  2. 如果計(jì)算后的checksum,與block創(chuàng)建時(shí)值不一樣,說明block已經(jīng)損壞。

  3. client讀取其他DataNode上的block。

  4. datanode在其文件創(chuàng)建后周期驗(yàn)證checksum。

  • 掉線時(shí)限參數(shù)設(shè)置

datanode進(jìn)程死亡或者網(wǎng)絡(luò)故障造成datanode無法與namenode通信,namenode不會(huì)立即把該節(jié)點(diǎn)判定為死亡,要經(jīng)過一段時(shí)間,這段時(shí)間暫稱作超時(shí)時(shí)長(zhǎng)。HDFS默認(rèn)的超時(shí)時(shí)長(zhǎng)為10分鐘+30秒。如果定義超時(shí)時(shí)間為timeout,則超時(shí)時(shí)長(zhǎng)的計(jì)算公式為:

timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

而默認(rèn)的dfs.namenode.heartbeat.recheck-interval 大小為5分鐘,dfs.heartbeat.interval默認(rèn)為3秒。

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。

<property>    <name>dfs.namenode.heartbeat.recheck-interval</name>    <value>300000</value></property><property>    <name>dfs.heartbeat.interval </name>    <value>3</value></property>
  • DataNode的目錄結(jié)構(gòu)

    和namenode不同的是,datanode的存儲(chǔ)目錄是初始階段自動(dòng)創(chuàng)建的,不需要額外格式化。

在/opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/datanodeDatas/current這個(gè)目錄下查看版本號(hào)

    cat VERSION 

    #Thu Mar 14 07:58:46 CST 2019
    storageID=DS-47bcc6d5-c9b7-4c88-9cc8-6154b8a2bf39
    clusterID=CID-dac2e9fa-65d2-4963-a7b5-bb4d0280d3f4
    cTime=0
    datanodeUuid=c44514a0-9ed6-4642-b3a8-5af79f03d7a4
    storageType=DATA_NODE
    layoutVersion=-56

具體解釋:

storageID:存儲(chǔ)id號(hào)。

clusterID集群id,全局唯一。

cTime屬性標(biāo)記了datanode存儲(chǔ)系統(tǒng)的創(chuàng)建時(shí)間,對(duì)于剛剛格式化的存儲(chǔ)系統(tǒng),這個(gè)屬性為0;但是在文件系統(tǒng)升級(jí)之后,該值會(huì)更新到新的時(shí)間戳。

datanodeUuid:datanode的唯一識(shí)別碼。

storageType:存儲(chǔ)類型。

layoutVersion是一個(gè)負(fù)整數(shù)。通常只有HDFS增加新特性時(shí)才會(huì)更新這個(gè)版本號(hào)。

  • datanode多目錄配置

datanode也可以配置成多個(gè)目錄,每個(gè)目錄存儲(chǔ)的數(shù)據(jù)不一樣。即:數(shù)據(jù)不是副本。具體配置如下:
- 只需要在value中使用逗號(hào)分隔出多個(gè)存儲(chǔ)目錄即可

  cd /opt/hadoop-2.6.0-cdh6.14.0/etc/hadoop
  <!--  定義dataNode數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)位置,實(shí)際工作中,一般先確定磁盤的掛載目錄,然后多個(gè)目錄用,進(jìn)行分割  -->
          <property>
                  <name>dfs.datanode.data.dir</name>
                  <value>file:///opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/datanodeDatas</value>
          </property>

10.1 服役新數(shù)據(jù)節(jié)點(diǎn)

需求說明:

隨著公司業(yè)務(wù)的增長(zhǎng),數(shù)據(jù)量越來越大,原有的數(shù)據(jù)節(jié)點(diǎn)的容量已經(jīng)不能滿足存儲(chǔ)數(shù)據(jù)的需求,需要在原有集群基礎(chǔ)上動(dòng)態(tài)添加新的數(shù)據(jù)節(jié)點(diǎn)。

10.1.1 環(huán)境準(zhǔn)備
  1. 復(fù)制一臺(tái)新的虛擬機(jī)出來

將我們純凈的虛擬機(jī)復(fù)制一臺(tái)出來,作為我們新的節(jié)點(diǎn)

  1. 修改mac地址以及IP地址

修改mac地址命令
    vim /etc/udev/rules.d/70-persistent-net.rules
修改ip地址命令
    vim /etc/sysconfig/network-scripts/ifcfg-eth0
  1. 關(guān)閉防火墻,關(guān)閉selinux

關(guān)閉防火墻
    service iptables stop
關(guān)閉selinux
    vim /etc/selinux/config
  1. 更改主機(jī)名

更改主機(jī)名命令,將node04主機(jī)名更改為node04.hadoop.com
vim /etc/sysconfig/network
  1. 四臺(tái)機(jī)器更改主機(jī)名與IP地址映射

四臺(tái)機(jī)器都要添加hosts文件
vim /etc/hosts

192.168.52.100 node01.hadoop.com  node01
192.168.52.110 node02.hadoop.com  node02
192.168.52.120 node03.hadoop.com  node03
192.168.52.130 node04.hadoop.com  node04
  1. node04服務(wù)器關(guān)機(jī)重啟

node04執(zhí)行以下命令關(guān)機(jī)重啟
    reboot -h now
  1. node04安裝jdk

node04統(tǒng)一兩個(gè)路徑
    mkdir -p /export/softwares/
    mkdir -p /export/servers/

然后解壓jdk安裝包,配置環(huán)境變量

  1. 解壓hadoop安裝包

在node04服務(wù)器上面解壓hadoop安裝包到/export/servers , node01執(zhí)行以下命令將hadoop安裝包拷貝到node04服務(wù)器
    cd /export/softwares/
    scp hadoop-2.6.0-cdh6.14.0-自己編譯后的版本.tar.gz node04:$PWD

node04解壓安裝包
    tar -zxf hadoop-2.6.0-cdh6.14.0-自己編譯后的版本.tar.gz -C /export/servers/
  1. 將node01關(guān)于hadoop的配置文件全部拷貝到node04

node01執(zhí)行以下命令,將hadoop的配置文件全部拷貝到node04服務(wù)器上面
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop/
    scp ./* node04:$PWD
10.1.2 服役新節(jié)點(diǎn)具體步驟
  1. 創(chuàng)建dfs.hosts文件

在node01也就是namenode所在的機(jī)器的/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop目錄下創(chuàng)建dfs.hosts文件

[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
[root@node01 hadoop]# touch dfs.hosts
[root@node01 hadoop]# vim dfs.hosts

添加如下主機(jī)名稱(包含新服役的節(jié)點(diǎn))
node01
node02
node03
node04
  1. node01編輯hdfs-site.xml添加以下配置

在namenode的hdfs-site.xml配置文件中增加dfs.hosts屬性

node01執(zhí)行以下命令 :

cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
vim hdfs-site.xml# 添加一下內(nèi)容    <property>
         <name>dfs.hosts</name>
         <value>/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop/dfs.hosts</value>
    </property>
    <!--動(dòng)態(tài)上下線配置: 如果配置文件中有, 就不需要配置-->
    <property>
        <name>dfs.hosts</name>
        <value>/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop/accept_host</value>
    </property>

    <property>
        <name>dfs.hosts.exclude</name>
        <value>/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop/deny_host</value>
    </property>
  1. 刷新namenode

  • node01執(zhí)行以下命令刷新namenode

[root@node01 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
  1. 更新resourceManager節(jié)點(diǎn)

  • node01執(zhí)行以下命令刷新resourceManager

[root@node01 hadoop]# yarn rmadmin -refreshNodes
19/03/16 11:19:47 INFO client.RMProxy: Connecting to ResourceManager at node01/192.168.52.100:8033
  1. namenode的slaves文件增加新服務(wù)節(jié)點(diǎn)主機(jī)名稱

node01編輯slaves文件,并添加新增節(jié)點(diǎn)的主機(jī),更改完后,slaves文件不需要分發(fā)到其他機(jī)器上面去

node01執(zhí)行以下命令編輯slaves文件 :
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
    vim slaves

添加一下內(nèi)容:     
node01
node02
node03
node04
  1. 單獨(dú)啟動(dòng)新增節(jié)點(diǎn)

node04服務(wù)器執(zhí)行以下命令,啟動(dòng)datanode和nodemanager : 
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/
    sbin/hadoop-daemon.sh start datanode
    sbin/yarn-daemon.sh start nodemanager
  1. 使用負(fù)載均衡命令,讓數(shù)據(jù)均勻負(fù)載所有機(jī)器

node01執(zhí)行以下命令 : 
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/
    sbin/start-balancer.sh

10.2 退役舊數(shù)據(jù)

  1. 創(chuàng)建dfs.hosts.exclude配置文件

在namenod所在服務(wù)器的/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop目錄下創(chuàng)建dfs.hosts.exclude文件,并添加需要退役的主機(jī)名稱

node01執(zhí)行以下命令 : 
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
    touch dfs.hosts.exclude
    vim dfs.hosts.exclude
添加以下內(nèi)容:
    node04.hadoop.com

特別注意:該文件當(dāng)中一定要寫真正的主機(jī)名或者ip地址都行,不能寫node04
  1. 編輯namenode所在機(jī)器的hdfs-site.xml

編輯namenode所在的機(jī)器的hdfs-site.xml配置文件,添加以下配置

cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
vim hdfs-site.xml#添加一下內(nèi)容:    <property>
         <name>dfs.hosts.exclude</name>
         <value>/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop/dfs.hosts.exclude</value>
   </property>
  1. 刷新namenode,刷新resourceManager

在namenode所在的機(jī)器執(zhí)行以下命令,刷新namenode,刷新resourceManager : 

hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
  1. 節(jié)點(diǎn)退役完成,停止該節(jié)點(diǎn)進(jìn)程

等待退役節(jié)點(diǎn)狀態(tài)為decommissioned(所有塊已經(jīng)復(fù)制完成),停止該節(jié)點(diǎn)及節(jié)點(diǎn)資源管理器。注意:如果副本數(shù)是3,服役的節(jié)點(diǎn)小于等于3,是不能退役成功的,需要修改副本數(shù)后才能退役。

node04執(zhí)行以下命令,停止該節(jié)點(diǎn)進(jìn)程 : 
    cd /export/servers/hadoop-2.6.0-cdh6.14.0
    sbin/hadoop-daemon.sh stop datanode
    sbin/yarn-daemon.sh stop nodemanager
  1. 從include文件中刪除退役節(jié)點(diǎn)

namenode所在節(jié)點(diǎn)也就是node01執(zhí)行以下命令刪除退役節(jié)點(diǎn) :
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
    vim dfs.hosts

刪除后的內(nèi)容: 刪除了node04
node01
node02
node03
  1. node01執(zhí)行一下命令刷新namenode,刷新resourceManager

hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
  1. 從namenode的slave文件中刪除退役節(jié)點(diǎn)

namenode所在機(jī)器也就是node01執(zhí)行以下命令從slaves文件中刪除退役節(jié)點(diǎn) : 
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop
    vim slaves
刪除后的內(nèi)容: 刪除了 node04 
node01
node02
node03
  1. 如果數(shù)據(jù)負(fù)載不均衡,執(zhí)行以下命令進(jìn)行均衡負(fù)載

node01執(zhí)行以下命令進(jìn)行均衡負(fù)載
    cd /export/servers/hadoop-2.6.0-cdh6.14.0/
    sbin/start-balancer.sh

11 block塊手動(dòng)拼接成為完整數(shù)據(jù)

所有的數(shù)據(jù)都是以一個(gè)個(gè)的block塊存儲(chǔ)的,只要我們能夠?qū)⑽募乃衎lock塊全部找出來,拼接到一起,又會(huì)成為一個(gè)完整的文件,接下來我們就來通過命令將文件進(jìn)行拼接:

  1. 上傳一個(gè)大于128M的文件到hdfs上面去

我們選擇一個(gè)大于128M的文件上傳到hdfs上面去,只有一個(gè)大于128M的文件才會(huì)有多個(gè)block塊。

這里我們選擇將我們的jdk安裝包上傳到hdfs上面去。

node01執(zhí)行以下命令上傳jdk安裝包

cd /export/softwares/
hdfs dfs -put jdk-8u141-linux-x64.tar.gz  /
  1. web瀏覽器界面查看jdk的兩個(gè)block塊id

這里我們看到兩個(gè)block塊id分別為

1073742699和1073742700

那么我們就可以通過blockid將我們兩個(gè)block塊進(jìn)行手動(dòng)拼接了。

  1. 根據(jù)我們的配置文件找到block塊所在的路徑

根據(jù)我們hdfs-site.xml的配置,找到datanode所在的路徑
<!--  定義dataNode數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)位置,實(shí)際工作中,一般先確定磁盤的掛載目錄,然后多個(gè)目錄用,進(jìn)行分割  -->
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:///export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/datanodeDatas</value>
        </property>


進(jìn)入到以下路徑 : 此基礎(chǔ)路徑為 上述配置中value的路徑
cd /export/servers/hadoop-2.6.0-cdh6.14.0/hadoopDatas/datanodeDatas/current/BP-557466926-192.168.52.100-1549868683602/current/finalized/subdir0/subdir3
  • 4. 執(zhí)行block塊的拼接

將不同的各個(gè)block塊按照順序進(jìn)行拼接起來,成為一個(gè)完整的文件
cat blk_1073742699 >> jdk8u141.tar.gz
cat blk_1073742700 >> jdk8u141.tar.gz
移動(dòng)我們的jdk到/export路徑,然后進(jìn)行解壓
mv  jdk8u141.tar.gz /export/
cd /export/
tar -zxf jdk8u141.tar.gz
正常解壓,沒有問題,說明我們的程序按照block塊存儲(chǔ)沒有問題

“Hadoop HDFS分布式文件系統(tǒng)怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

當(dāng)前文章:HadoopHDFS分布式文件系統(tǒng)怎么理解
文章鏈接:http://bm7419.com/article0/jdgpio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、響應(yīng)式網(wǎng)站、域名注冊(cè)、用戶體驗(yàn)、建站公司網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)