日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

耗时一个月,整理出这份Hadoop吐血宝典

發(fā)布時(shí)間:2025/1/21 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 耗时一个月,整理出这份Hadoop吐血宝典 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

本文檔參考了關(guān)于 Hadoop 的官網(wǎng)及其他眾多資料整理而成,為了整潔的排版及舒適的閱讀,對(duì)于模糊不清晰的圖片及黑白圖片進(jìn)行重新繪制成了高清彩圖。

目前企業(yè)應(yīng)用較多的是Hadoop2.x,所以本文是以Hadoop2.x為主,對(duì)于Hadoop3.x新增的內(nèi)容會(huì)進(jìn)行說(shuō)明!

一、HDFS

1. HDFS概述

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

在現(xiàn)代的企業(yè)環(huán)境中,單機(jī)容量往往無(wú)法存儲(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)一的訪問(wèn)接口,像是訪問(wèn)一個(gè)普通文件系統(tǒng)一樣使用分布式文件系統(tǒng)。

2. HDFS架構(gòu)

HDFS是一個(gè)主/從(Mater/Slave)體系結(jié)構(gòu),由三部分組成:?NameNode?和?DataNode?以及?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 用來(lái)監(jiān)控 HDFS 狀態(tài)的輔助后臺(tái)程序,每隔一段時(shí)間獲取 HDFS 元數(shù)據(jù)的快照。最主要作用是輔助 NameNode 管理元數(shù)據(jù)信息。

3. HDFS的特性

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

其次,它是分布式的,由很多服務(wù)器聯(lián)合起來(lái)實(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)的,塊的大小可以通過(guò)配置參數(shù)來(lái)規(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 記錄下來(lái)。
HDFS 會(huì)給客戶端提供一個(gè)統(tǒng)一的抽象目錄樹(shù),客戶端通過(guò)路徑來(lái)訪問(wèn)文件,形如: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)的目錄樹(shù)結(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ù)量也可以通過(guò)參數(shù)設(shè)置 dfs.replication,默認(rèn)是 3)

6. 副本機(jī)制

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

7. 一次寫(xiě)入,多次讀出

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

4. HDFS 的命令行使用

如果沒(méi)有配置 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)輸入中讀取輸入,寫(xiě)入目標(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)失敗的文件通過(guò)-ignorecrc選項(xiàng)拷貝。 文件和CRC校驗(yàn)可以通過(guò)-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)將跳過(guò)回收站而直接刪除文件; 否則,在回收站可用時(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è)置的超過(guò)了datanode的數(shù)量,副本的數(shù)量也最多只能和datanode的數(shù)量是一致的

expunge (慎用)

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

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

5.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)盤(pán)網(wǎng)盤(pán)等限制每個(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è)副本,超過(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)離開(kāi)安全模式。30s

安全模式操作命令

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

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

HDFS 將所有的文件全部抽象成為 block 塊來(lái)進(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塊的大小可以通過(guò) hdfs-site.xml 當(dāng)中的配置文件進(jìn)行指定。

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

6.1 抽象為block塊的好處

  • 一個(gè)文件有可能大于集群中任意一個(gè)磁盤(pán)
    10T*3/128 = xxx塊 2T,2T,2T 文件方式存—–>多個(gè)block塊,這些block塊屬于一個(gè)文件
  • 使用塊抽象而不是文件可以簡(jiǎn)化存儲(chǔ)子系統(tǒng)
  • 塊非常適合用于數(shù)據(jù)備份進(jìn)而提供數(shù)據(jù)容錯(cuò)能力和可用性

6.2 塊緩存

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

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

例如:

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

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)限訪問(wèn)其內(nèi)容

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

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

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 文件寫(xiě)入過(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 開(kāi)始往 A 上傳第一個(gè) block(先從磁盤(pán)讀取數(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,重復(fù)步驟 2;

  • 7.2 機(jī)架感知(副本節(jié)點(diǎn)選擇)

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

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

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

  • 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)。

    8.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è)完整的最終文件。

  • 從 HDFS 文件讀寫(xiě)過(guò)程中,可以看出,HDFS 文件寫(xiě)入時(shí)是串行寫(xiě)入的,數(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ù)管理(重要)

    9.1 namenode 與 datanode 啟動(dòng)

    • namenode工作機(jī)制
  • 第一次啟動(dòng)namenode格式化后,創(chuàng)建fsimage和edits文件。如果不是第一次啟動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。
  • 客戶端對(duì)元數(shù)據(jù)進(jìn)行增刪改的請(qǐng)求。
  • namenode記錄操作日志,更新滾動(dòng)日志。
  • namenode在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行增刪改查。
    • secondary namenode
  • secondary namenode詢問(wèn) namenode 是否需要 checkpoint。直接帶回 namenode 是否檢查結(jié)果。
  • secondary namenode 請(qǐng)求執(zhí)行 checkpoint。
  • namenode 滾動(dòng)正在寫(xiě)的edits日志。
  • 將滾動(dòng)前的編輯日志和鏡像文件拷貝到 secondary namenode。
  • secondary namenode 加載編輯日志和鏡像文件到內(nèi)存,并合并。
  • 生成新的鏡像文件 fsimage.chkpoint。
  • 拷貝 fsimage.chkpoint 到 namenode。
  • 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-cdh5.14.0/hadoopDatas/namenodeDatas</value></property><!-- edits文件存儲(chǔ)的路徑 --><property><name>dfs.namenode.edits.dir</name><value>file:///opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits</value></property>

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

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

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

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

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

    因?yàn)閒simage是namenode的完整的鏡像,內(nèi)容很大,如果每次都加載到內(nèi)存的話生成樹(shù)狀拓?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-cdh5.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-cdh5.14.0/hadoopDatas/dfs/nn/edits hdfs oev -i edits_0000000000000000112-0000000000000000113 -o myedit.xml -p XML

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

  • secnonaryNN通知NameNode切換editlog。
  • secondaryNN從NameNode中獲得FSImage和editlog(通過(guò)http方式)。
  • secondaryNN將FSImage載入內(nèi)存,然后開(kāi)始合并editlog,合并之后成為新的fsimage。
  • secondaryNN將新的fsimage發(fā)回給NameNode。
  • NameNode用新的fsimage替換舊的fsimage。
  • 完成合并的是 secondarynamenode,會(huì)請(qǐng)求namenode停止使用edits,暫時(shí)將新寫(xiě)操作放入一個(gè)新的文件中(edits.new)。

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

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

    hadoop進(jìn)入安全模式時(shí)需要管理員使用dfsadmin的save namespace來(lái)創(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ù)的安全性,我們一般都是先確定好我們的磁盤(pán)掛載目錄,將元數(shù)據(jù)的磁盤(pán)做RAID1

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

    • 具體配置方案:

      hdfs-site.xml

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

    9.7 namenode故障恢復(fù)

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

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

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

  • 殺死namenode進(jìn)程: 使用jps查看namenode的進(jìn)程號(hào) , kill -9 直接殺死。
  • 刪除namenode的fsimage文件和edits文件。
  • 根據(jù)上述配置, 找到namenode放置fsimage和edits路徑. 直接全部rm -rf 刪除。

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

  • 重新啟動(dòng)namenode, 觀察數(shù)據(jù)是否存在。
  • 10. datanode工作機(jī)制以及數(shù)據(jù)存儲(chǔ)

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

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

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

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

    • 數(shù)據(jù)完整性
  • 當(dāng)DataNode讀取block的時(shí)候,它會(huì)計(jì)算checksum。
  • 如果計(jì)算后的checksum,與block創(chuàng)建時(shí)值不一樣,說(shuō)明block已經(jīng)損壞。
  • client讀取其他DataNode上的block。
  • datanode在其文件創(chuàng)建后周期驗(yàn)證checksum。
    • 掉線時(shí)限參數(shù)設(shè)置

    datanode進(jìn)程死亡或者網(wǎng)絡(luò)故障造成datanode無(wú)法與namenode通信,namenode不會(huì)立即把該節(jié)點(diǎn)判定為死亡,要經(jīng)過(guò)一段時(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-cdh5.14.0/hadoopDatas/datanodeDatas/current這個(gè)目錄下查看版本號(hào)

    cat VERSION #Thu Mar 14 07:58:46 CST 2019storageID=DS-47bcc6d5-c9b7-4c88-9cc8-6154b8a2bf39clusterID=CID-dac2e9fa-65d2-4963-a7b5-bb4d0280d3f4cTime=0datanodeUuid=c44514a0-9ed6-4642-b3a8-5af79f03d7a4storageType=DATA_NODElayoutVersion=-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-cdh5.14.0/etc/hadoop<!-- 定義dataNode數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)位置,實(shí)際工作中,一般先確定磁盤(pán)的掛載目錄,然后多個(gè)目錄用,進(jìn)行分割 --><property><name>dfs.datanode.data.dir</name><value>file:///opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas</value></property>

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

    需求說(shuō)明:

    隨著公司業(yè)務(wù)的增長(zhǎng),數(shù)據(jù)量越來(lái)越大,原有的數(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)備

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

  • 修改mac地址以及IP地址
  • 修改mac地址命令vim /etc/udev/rules.d/70-persistent-net.rules 修改ip地址命令vim /etc/sysconfig/network-scripts/ifcfg-eth0
  • 關(guān)閉防火墻,關(guān)閉selinux
  • 關(guān)閉防火墻service iptables stop 關(guān)閉selinuxvim /etc/selinux/config
  • 更改主機(jī)名
  • 更改主機(jī)名命令,將node04主機(jī)名更改為node04.hadoop.com vim /etc/sysconfig/network
  • 四臺(tái)機(jī)器更改主機(jī)名與IP地址映射
  • 四臺(tái)機(jī)器都要添加hosts文件 vim /etc/hosts192.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
  • node04服務(wù)器關(guān)機(jī)重啟
  • node04執(zhí)行以下命令關(guān)機(jī)重啟reboot -h now
  • node04安裝jdk
  • node04統(tǒng)一兩個(gè)路徑mkdir -p /export/softwares/mkdir -p /export/servers/

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

  • 解壓hadoop安裝包
  • 在node04服務(wù)器上面解壓hadoop安裝包到/export/servers , node01執(zhí)行以下命令將hadoop安裝包拷貝到node04服務(wù)器cd /export/softwares/scp hadoop-2.6.0-cdh5.14.0-自己編譯后的版本.tar.gz node04:$PWDnode04解壓安裝包tar -zxf hadoop-2.6.0-cdh5.14.0-自己編譯后的版本.tar.gz -C /export/servers/
  • 將node01關(guān)于hadoop的配置文件全部拷貝到node04
  • node01執(zhí)行以下命令,將hadoop的配置文件全部拷貝到node04服務(wù)器上面cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/scp ./* node04:$PWD

    10.1.2 服役新節(jié)點(diǎn)具體步驟

  • 創(chuàng)建dfs.hosts文件
  • 在node01也就是namenode所在的機(jī)器的/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop目錄下創(chuàng)建dfs.hosts文件[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop [root@node01 hadoop]# touch dfs.hosts [root@node01 hadoop]# vim dfs.hosts添加如下主機(jī)名稱(包含新服役的節(jié)點(diǎn)) node01 node02 node03 node04
  • node01編輯hdfs-site.xml添加以下配置
  • 在namenode的hdfs-site.xml配置文件中增加dfs.hosts屬性

    node01執(zhí)行以下命令 :cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop vim hdfs-site.xml# 添加一下內(nèi)容<property><name>dfs.hosts</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value></property><!--動(dòng)態(tài)上下線配置: 如果配置文件中有, 就不需要配置--><property><name>dfs.hosts</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/accept_host</value></property><property><name>dfs.hosts.exclude</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/deny_host</value></property>
  • 刷新namenode
    • node01執(zhí)行以下命令刷新namenode
    [root@node01 hadoop]# hdfs dfsadmin -refreshNodes Refresh nodes successful
  • 更新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
  • 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-cdh5.14.0/etc/hadoopvim slaves添加一下內(nèi)容: node01 node02 node03 node04
  • 單獨(dú)啟動(dòng)新增節(jié)點(diǎn)
  • node04服務(wù)器執(zhí)行以下命令,啟動(dòng)datanode和nodemanager : cd /export/servers/hadoop-2.6.0-cdh5.14.0/sbin/hadoop-daemon.sh start datanodesbin/yarn-daemon.sh start nodemanager
  • 使用負(fù)載均衡命令,讓數(shù)據(jù)均勻負(fù)載所有機(jī)器
  • node01執(zhí)行以下命令 : cd /export/servers/hadoop-2.6.0-cdh5.14.0/sbin/start-balancer.sh

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

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

    node01執(zhí)行以下命令 : cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadooptouch dfs.hosts.excludevim dfs.hosts.exclude 添加以下內(nèi)容:node04.hadoop.com特別注意:該文件當(dāng)中一定要寫(xiě)真正的主機(jī)名或者ip地址都行,不能寫(xiě)node04
  • 編輯namenode所在機(jī)器的hdfs-site.xml
  • 編輯namenode所在的機(jī)器的hdfs-site.xml配置文件,添加以下配置

    cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop vim hdfs-site.xml#添加一下內(nèi)容:<property><name>dfs.hosts.exclude</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts.exclude</value></property>
  • 刷新namenode,刷新resourceManager
  • 在namenode所在的機(jī)器執(zhí)行以下命令,刷新namenode,刷新resourceManager : hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes
  • 節(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-cdh5.14.0sbin/hadoop-daemon.sh stop datanodesbin/yarn-daemon.sh stop nodemanager
  • 從include文件中刪除退役節(jié)點(diǎn)
  • namenode所在節(jié)點(diǎn)也就是node01執(zhí)行以下命令刪除退役節(jié)點(diǎn) :cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoopvim dfs.hosts刪除后的內(nèi)容: 刪除了node04 node01 node02 node03
  • node01執(zhí)行一下命令刷新namenode,刷新resourceManager
  • hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes
  • 從namenode的slave文件中刪除退役節(jié)點(diǎn)
  • namenode所在機(jī)器也就是node01執(zhí)行以下命令從slaves文件中刪除退役節(jié)點(diǎn) : cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoopvim slaves 刪除后的內(nèi)容: 刪除了 node04 node01 node02 node03
  • 如果數(shù)據(jù)負(fù)載不均衡,執(zhí)行以下命令進(jìn)行均衡負(fù)載
  • node01執(zhí)行以下命令進(jìn)行均衡負(fù)載cd /export/servers/hadoop-2.6.0-cdh5.14.0/sbin/start-balancer.sh

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

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

  • 上傳一個(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 /
  • web瀏覽器界面查看jdk的兩個(gè)block塊id
  • 這里我們看到兩個(gè)block塊id分別為

    1073742699和1073742700

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

  • 根據(jù)我們的配置文件找到block塊所在的路徑
  • 根據(jù)我們hdfs-site.xml的配置,找到datanode所在的路徑 <!-- 定義dataNode數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)位置,實(shí)際工作中,一般先確定磁盤(pán)的掛載目錄,然后多個(gè)目錄用,進(jìn)行分割 --><property><name>dfs.datanode.data.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas</value></property>進(jìn)入到以下路徑 : 此基礎(chǔ)路徑為 上述配置中value的路徑 cd /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current/BP-557466926-192.168.52.100-1549868683602/current/finalized/subdir0/subdir3
  • 執(zhí)行block塊的拼接
  • 將不同的各個(gè)block塊按照順序進(jìn)行拼接起來(lái),成為一個(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 正常解壓,沒(méi)有問(wèn)題,說(shuō)明我們的程序按照block塊存儲(chǔ)沒(méi)有問(wèn)題

    12. HDFS其他重要功能

    1. 多個(gè)集群之間的數(shù)據(jù)拷貝

    在我們實(shí)際工作當(dāng)中,極有可能會(huì)遇到將測(cè)試集群的數(shù)據(jù)拷貝到生產(chǎn)環(huán)境集群,或者將生產(chǎn)環(huán)境集群的數(shù)據(jù)拷貝到測(cè)試集群,那么就需要我們?cè)诙鄠€(gè)集群之間進(jìn)行數(shù)據(jù)的遠(yuǎn)程拷貝,hadoop自帶也有命令可以幫我們實(shí)現(xiàn)這個(gè)功能

  • 本地文件拷貝scp
  • cd /export/softwares/scp -r jdk-8u141-linux-x64.tar.gz root@node02:/export/
  • 集群之間的數(shù)據(jù)拷貝distcp
  • cd /export/servers/hadoop-2.6.0-cdh5.14.0/bin/hadoop distcp hdfs://node01:8020/jdk-8u141-linux-x64.tar.gz hdfs://cluster2:8020/

    2. hadoop歸檔文件archive

    每個(gè)文件均按塊存儲(chǔ),每個(gè)塊的元數(shù)據(jù)存儲(chǔ)在namenode的內(nèi)存中,因此hadoop存儲(chǔ)小文件會(huì)非常低效。因?yàn)榇罅康男∥募?huì)耗盡namenode中的大部分內(nèi)存。但注意,存儲(chǔ)小文件所需要的磁盤(pán)容量和存儲(chǔ)這些文件原始內(nèi)容所需要的磁盤(pán)空間相比也不會(huì)增多。例如,一個(gè)1MB的文件以大小為128MB的塊存儲(chǔ),使用的是1MB的磁盤(pán)空間,而不是128MB。

    Hadoop存檔文件或HAR文件,是一個(gè)更高效的文件存檔工具,它將文件存入HDFS塊,在減少namenode內(nèi)存使用的同時(shí),允許對(duì)文件進(jìn)行透明的訪問(wèn)。具體說(shuō)來(lái),Hadoop存檔文件可以用作MapReduce的輸入。

    創(chuàng)建歸檔文件

    • 第一步:創(chuàng)建歸檔文件

      注意:歸檔文件一定要保證yarn集群?jiǎn)?dòng)

    cd /export/servers/hadoop-2.6.0-cdh5.14.0bin/hadoop archive -archiveName myhar.har -p /user/root /user
    • 第二步:查看歸檔文件內(nèi)容
    hdfs dfs -lsr /user/myhar.harhdfs dfs -lsr har:///user/myhar.har
    • 第三步:解壓歸檔文件
    hdfs dfs -mkdir -p /user/har hdfs dfs -cp har:///user/myhar.har/* /user/har/

    3. hdfs快照snapShot管理

    快照顧名思義,就是相當(dāng)于對(duì)我們的hdfs文件系統(tǒng)做一個(gè)備份,我們可以通過(guò)快照對(duì)我們指定的文件夾設(shè)置備份,但是添加快照之后,并不會(huì)立即復(fù)制所有文件,而是指向同一個(gè)文件。當(dāng)寫(xiě)入發(fā)生時(shí),才會(huì)產(chǎn)生新文件

  • 快照使用基本語(yǔ)法
  • 1、 開(kāi)啟指定目錄的快照功能hdfs dfsadmin -allowSnapshot 路徑 2、禁用指定目錄的快照功能(默認(rèn)就是禁用狀態(tài))hdfs dfsadmin -disallowSnapshot 路徑 3、給某個(gè)路徑創(chuàng)建快照snapshothdfs dfs -createSnapshot 路徑 4、指定快照名稱進(jìn)行創(chuàng)建快照snapshothdfs dfs -createSanpshot 路徑 名稱 5、給快照重新命名hdfs dfs -renameSnapshot 路徑 舊名稱 新名稱 6、列出當(dāng)前用戶所有可快照目錄hdfs lsSnapshottableDir 7、比較兩個(gè)快照的目錄不同之處hdfs snapshotDiff 路徑1 路徑2 8、刪除快照snapshothdfs dfs -deleteSnapshot <path> <snapshotName>
  • 快照操作實(shí)際案例
  • 1、開(kāi)啟與禁用指定目錄的快照[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfsadmin -allowSnapshot /userAllowing snaphot on /user succeeded[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfsadmin -disallowSnapshot /userDisallowing snaphot on /user succeeded2、對(duì)指定目錄創(chuàng)建快照注意:創(chuàng)建快照之前,先要允許該目錄創(chuàng)建快照[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfsadmin -allowSnapshot /userAllowing snaphot on /user succeeded[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfs -createSnapshot /user Created snapshot /user/.snapshot/s20190317-210906.549通過(guò)web瀏覽器訪問(wèn)快照http://node01:50070/explorer.html#/user/.snapshot/s20190317-210906.5493、指定名稱創(chuàng)建快照[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfs -createSnapshot /user mysnap1Created snapshot /user/.snapshot/mysnap14、重命名快照hdfs dfs -renameSnapshot /user mysnap1 mysnap25、列出當(dāng)前用戶所有可以快照的目錄hdfs lsSnapshottableDir6、比較兩個(gè)快照不同之處hdfs dfs -createSnapshot /user snap1hdfs dfs -createSnapshot /user snap2hdfs snapshotDiff snap1 snap27、刪除快照hdfs dfs -deleteSnapshot /user snap1

    4. hdfs回收站

    任何一個(gè)文件系統(tǒng),基本上都會(huì)有垃圾桶機(jī)制,也就是刪除的文件,不會(huì)直接徹底清掉,我們一把都是將文件放置到垃圾桶當(dāng)中去,過(guò)一段時(shí)間之后,自動(dòng)清空垃圾桶當(dāng)中的文件,這樣對(duì)于文件的安全刪除比較有保證,避免我們一些誤操作,導(dǎo)致誤刪除文件或者數(shù)據(jù)

  • 回收站配置兩個(gè)參數(shù)
  • 默認(rèn)值fs.trash.interval=0,0表示禁用回收站,可以設(shè)置刪除文件的存活時(shí)間。

    默認(rèn)值fs.trash.checkpoint.interval=0,檢查回收站的間隔時(shí)間。

    要求fs.trash.checkpoint.interval<=fs.trash.interval。

  • 啟用回收站
  • 修改所有服務(wù)器的core-site.xml配置文件

    <!-- 開(kāi)啟hdfs的垃圾桶機(jī)制,刪除掉的數(shù)據(jù)可以從垃圾桶中回收,單位分鐘 --><property><name>fs.trash.interval</name><value>10080</value></property>
  • 查看回收站
  • 回收站在集群的 /user/root/.Trash/ 這個(gè)路徑下

  • 通過(guò)javaAPI刪除的數(shù)據(jù),不會(huì)進(jìn)入回收站,需要調(diào)用moveToTrash()才會(huì)進(jìn)入回收站
  • //使用回收站的方式: 刪除數(shù)據(jù)@Testpublic void deleteFile() throws Exception{//1. 獲取FileSystem對(duì)象Configuration configuration = new Configuration();FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), configuration, "root");//2. 執(zhí)行刪除操作// fileSystem.delete(); 這種操作會(huì)直接將數(shù)據(jù)刪除, 不會(huì)進(jìn)入垃圾桶Trash trash = new Trash(fileSystem,configuration);boolean flag = trash.isEnabled(); // 是否已經(jīng)開(kāi)啟了垃圾桶機(jī)制System.out.println(flag);trash.moveToTrash(new Path("/quota"));//3. 釋放資源fileSystem.close();}
  • 恢復(fù)回收站數(shù)據(jù)
  • hdfs dfs -mv trashFileDir hdfsdir

    trashFileDir :回收站的文件路徑

    hdfsdir :將文件移動(dòng)到hdfs的哪個(gè)路徑下

  • 清空回收站
  • hdfs dfs -expunge

    總結(jié)

    以上是生活随笔為你收集整理的耗时一个月,整理出这份Hadoop吐血宝典的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。