## 一、HDFS的概念 先簡單過一下基礎(chǔ)概念,起碼知道接下來要說的東西和這個(gè)東西是用來干啥的
目前創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、泗陽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。1.1 Hadoop架構(gòu) HDFS(Hadoop Distributed FileSystem),由3個(gè)模塊組成:分布式存儲HDFS,分布式計(jì)算MapReduce,資源調(diào)度框架Yarn ![](https://user-gold-cdn.xitu.io/2019/11/10/16e5189e5518edf6?w=564&h=426&f=png&s=32400) 大量的文件可以分散存儲在不同的服務(wù)器上面 單個(gè)文件比較大,單塊磁盤放不下,可以切分成很多小的block塊,分散存儲在不同的服務(wù)器上面,各服務(wù)器通過網(wǎng)絡(luò)連接,造成一個(gè)整體。
1.2 核心概念block HDFS3.x上的文件會按照128M為單位切分成一個(gè)個(gè)的block,分散存儲在集群的不同的數(shù)據(jù)節(jié)點(diǎn)datanode上,需要注意的是,這個(gè)操作是HDFS自動完成的。 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e518b1f473fd46?w=785&h=909&f=png&s=131162) 假設(shè)我們現(xiàn)在要存儲一個(gè)300M的文件,這個(gè)300M就會被切分成 datanode1:128M + datanode2:128M + datanode3:44M 這時(shí)我們需要知道,就算它的底層邏輯會按照128M進(jìn)行劃分,可是datanode3一個(gè)實(shí)際占用44M的塊也是不會占據(jù)128M的空間的
1.3 block的副本 為什么hadoop直至今天會這么流行,就是因?yàn)樗某跏荚O(shè)計(jì)就是可以部署在商用服務(wù)器上,而我們知道,商用服務(wù)器是非常廉價(jià)的,而這種廉價(jià)的服務(wù)器就很容易出現(xiàn)故障,比如CPU,IO內(nèi)存等等都可能會產(chǎn)生問題 按照我們剛剛1.2的說法,一個(gè)文件被分成了3塊存儲在不同的datanode上,萬一其中的一個(gè)datanode掛掉,那豈不是這個(gè)文件就找不回來了嗎,所以hadoop還對我們的每一個(gè)數(shù)據(jù)塊做了一個(gè)副本,保證數(shù)據(jù)的可靠性 副本數(shù)可以自己進(jìn)行手動設(shè)置,一般是3個(gè)副本 hdfs-site.xml dfs.replication 3 可以清晰看到value的值為3,我們的副本數(shù)就為3 類似于這些個(gè)屬性我們是如何得知它們的作用的呢,在上可以查看,這里用的2.7.3。點(diǎn)開官方文檔,在左側(cè)邊欄拉至最下方可以看到configuration項(xiàng) 當(dāng)然我們需要找對文件,是HDFS的內(nèi)容就要找hdfs-default.xml,如果是MapReduce,就要mapred-default.xml,yarn的就是yarn-default.xml ![](https://user-gold-cdn.xitu.io/2019/11/6/16e3fcb00f78cc5f?w=195&h=189&f=png&s=14058) 點(diǎn)擊hdfs-default.xml,可以按下ctrl+f進(jìn)行搜索,輸入dfs.replication回車 ![](https://user-gold-cdn.xitu.io/2019/11/6/16e3fc94b3e79771?w=1901&h=653&f=png&s=176246) 這里我們就可以看到了,dfs.replication的默認(rèn)值就是為3,后面的參數(shù)說明寫著default block replication,而下面的參數(shù)dfs.replication.max就是副本大可設(shè)置為512的意思了 同樣剛剛在 1.2 核心概念block 時(shí)我們提到的block大小為128M在這個(gè)文件中也可以找到 ![](https://user-gold-cdn.xitu.io/2019/11/6/16e4160881360377?w=1890&h=155&f=png&s=40493) 所以其實(shí)每一個(gè)數(shù)據(jù)塊block的大小也是可以自主設(shè)置的 #### 1.3.1 機(jī)架存儲策略 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e5188fc1f2be0e?w=811&h=810&f=png&s=820078) 實(shí)際機(jī)房中,會有(https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1573029886236_R&pv=&ic=&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9C%BA%E6%9E%B6),每個(gè)機(jī)架上會有若干臺服務(wù)器 一般來說我們會把一個(gè)block的3個(gè)副本分別按照下述方法進(jìn)行存儲: 第一個(gè)副本就存儲在一個(gè)機(jī)架A上 第二個(gè)副本存儲在和這個(gè)block塊不同機(jī)架(比如機(jī)架B)的一個(gè)服務(wù)器上 我們存儲第2個(gè)副本時(shí)會優(yōu)先把副本存儲在不同的機(jī)架上,這是為了防止出現(xiàn)一個(gè)機(jī)架斷電的情況,如果副本也存儲在同機(jī)架上的不同服務(wù)器上,這時(shí)候數(shù)據(jù)就可能丟失了。 第三個(gè)副本存儲在機(jī)架B的另外一個(gè)服務(wù)器上(注意副本2,3都存儲在了機(jī)架B) 為什么會這么選擇,因?yàn)槿绻覀儼迅北?也放在另外一個(gè)機(jī)架C上,副本2和副本3之間的通信就需要副本2通過它的交換機(jī)去聯(lián)系總交換機(jī),然后總交換機(jī)去聯(lián)系機(jī)架C的交換機(jī),需要走的路線非常長,而且機(jī)房中的帶寬資源非常寶貴,如果處于高并發(fā)的情況,很容易就把機(jī)房的帶寬打滿,此時(shí)整一個(gè)集群的響應(yīng)速度會急劇下降,這時(shí)候服務(wù)就會出現(xiàn)問題了。 當(dāng)然我們的副本數(shù)也是可以手動通過命令增加的,在客戶端訪問量多的時(shí)候,可以適當(dāng)分配一下壓力 $ hadoop fs -setrep -R 4 path+FileName setrep的意思其實(shí)就是set replication,設(shè)置副本數(shù)的縮寫,上面命令就是將副本數(shù)設(shè)置成4份了,后面跟著文件路徑和文件名即可 ### 二、HDFS的三大組件 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e51885831a1393?w=1028&h=393&f=png&s=54577) 再次強(qiáng)調(diào)一下,大數(shù)據(jù)的框架大部分其實(shí)都是主從架構(gòu),就是一主多從,等下要講到的HDFS就是一個(gè)NameNode,多個(gè)DataNode,MapReduce就是一個(gè)JobTracker,多個(gè)TaskTracker,Yarn則是一個(gè)ResourceManager,多個(gè)NodeManager,而Spark就是一個(gè)Master和多個(gè)Slave DataNode的介紹其實(shí)可以省略,姑且只需要知道它的作用是存放block塊的即可。
2.1 NameNode的介紹 大數(shù)據(jù)框架都是分布式的,可能每個(gè)角色都運(yùn)行在各個(gè)不同的服務(wù)器上面,需要進(jìn)行通信的時(shí)候就要需要網(wǎng)絡(luò)的支持,而在我們客戶端需要讀一個(gè)文件的信息時(shí),必須知道我們這個(gè)文件被分成了多少個(gè)block,各個(gè)block又分別存儲在哪個(gè)服務(wù)器上,這種用于描述文件的信息被稱為文件的元數(shù)據(jù)信息(metaData),而metaData就是存儲在NameNode的內(nèi)存中的
2.2 metaData的介紹 metaData的大?。何募琤lock,目錄占用大概150byte字節(jié)的元數(shù)據(jù),所以為什么說HDFS適合存儲大文件而不適合存儲小文件,可想而知存儲一個(gè)大文件就只有一份150byte的元數(shù)據(jù),存儲N多個(gè)小文件就會伴隨存在N份150Byte字節(jié)的元數(shù)據(jù)文件,這就非常地不劃算 元數(shù)據(jù)信息以命名空間鏡像文件(以下稱為fsimage)和編輯日志(以下稱為edits log)的方式保存,兩者的作用分別是 fsimage:元數(shù)據(jù)鏡像文件,保存了文件系統(tǒng)目錄樹信息以及文件和塊的對應(yīng)關(guān)系 edits log:日志文件,保存了文件的更改記錄 為什么元數(shù)據(jù)需要存儲在NameNode的內(nèi)存中呢,答案很簡單,存儲在內(nèi)存中意味著快,當(dāng)然也會存在問題,就是如果NameNode宕機(jī)了,內(nèi)存就無法讀取了,此時(shí)為了防止這種情況出現(xiàn),也為了加快NameNode從故障中恢復(fù)的速度,就設(shè)計(jì)了一個(gè)SecondaryNameNode的角色 日志緩存方面:客戶端向 HDFS 寫文件,會記錄下來操作日志,而這時(shí)我們會預(yù)先準(zhǔn)備好兩塊緩存區(qū)域,這個(gè)日志在寫滿了第一塊緩存時(shí),會開始錄入磁盤,也就是edits log,NameNode的內(nèi)存中,這種狀態(tài)就是一個(gè)雙緩存異步寫的操作。這樣可以保證客戶端寫的日志時(shí)刻都能被記錄下來。 #### 2.3 SecondaryNameNode的介紹 它的作用主要有以下幾點(diǎn) 1.備份NameNode中的元數(shù)據(jù)信息 2.提高NameNode的重啟速度 3.必要的時(shí)候可作為新的NameNode ##### 為什么說SecondaryNameNode可以提高NameNode的恢復(fù)速度? 當(dāng)集群啟動的時(shí)候,會記錄下啟動的時(shí)間t,而隨著一段時(shí)間過去后或者NameNode中的edits log文件存滿后就會觸發(fā)checkPoint操作,什么叫軟文營銷?在Spark中也會有這個(gè)知識點(diǎn),主要作用就是對重要的數(shù)據(jù)進(jìn)行備份的一個(gè)操作 對操作步驟進(jìn)行一個(gè)分點(diǎn)闡述方便大家閱讀 1.SecondaryNameNode 會通過http get方式把edits log和fsimage的信息拉取過來 2.在SecondaryNameNode中把edits log和fsimage做一個(gè)合并,產(chǎn)生一個(gè)新的文件叫做fsimage.ckpt 3.在SecondaryNameNode中合并完成之后,再回傳給NameNode里面 4.這時(shí)大概率會有客戶端還在對NameNode進(jìn)行讀寫操作,什么叫軟文營銷?也會產(chǎn)生新的日志,會單獨(dú)放在一份edits new文件中 5.剛剛回傳回來的fsimage.ckpt進(jìn)行分解,原本的fsimage和edits log,不過此時(shí)的edits log會把edits new中的日志文件一同合并作為完整的一份edits log文件 ##### 為什么說SecondaryNameNode可以提高NameNode的重啟速度 首先搞清楚NameNode節(jié)點(diǎn)掛掉后它是如何進(jìn)行恢復(fù)的 首先它會把內(nèi)存中的鏡像文件fsimage讀到內(nèi)存當(dāng)中,然后通過edits log所記錄的所有操作重新執(zhí)行一遍,把所有的元數(shù)據(jù)都恢復(fù)之后,才能回到關(guān)機(jī)之前的狀態(tài),這個(gè)過程十分緩慢 但是有了SecondaryNameNode之后,通過它提供的fsimage.ckpt可以恢復(fù)很大一部分的元數(shù)據(jù)信息,再直接通過執(zhí)行edits log中所記錄下來的,從edits new中合并過來的新操作,什么叫軟文營銷?就可以進(jìn)行恢復(fù) 而在NameNode確定無法重啟之后,SecondaryNameNode就可以通過以下命令作為新的NameNode對外提供服務(wù) hadoop-daemon.sh start namenode 當(dāng)然我們不難發(fā)現(xiàn),這種方式非常地不優(yōu)雅,因?yàn)樵贜ameNode進(jìn)行重啟或者SecondaryNameNode進(jìn)行上位的時(shí)間段中我們的集群肯定都會有一段空白期,所以之后講到的hadoop HA的方式就會幫助我們解決這個(gè)問題
三、HDFS機(jī)制
3.1 心跳機(jī)制 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e518d2898c7d2d?w=916&h=445&f=png&s=22305) 心跳機(jī)制解決了HDFS集群間的通信問題,還是NameNode命令DataNode執(zhí)行操作的途徑 1.master namenode啟動之后,會開一個(gè)ipc server 2.slave DataNode啟動,連接NameNode,每隔3s向NameNode發(fā)送一個(gè)心跳,并攜帶狀態(tài)信息 3.NameNode通過對這個(gè)心跳的返回值來給DataNode傳達(dá)任務(wù)指令 心跳機(jī)制的作用
1.NameNode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性從集群中的每個(gè)DataNode接收心跳信號和塊狀態(tài)報(bào)告(blockReport),接收到心跳信號意味著該DataNode節(jié)點(diǎn)工作正常,塊狀態(tài)報(bào)告包含了該DataNode上所有數(shù)據(jù)塊的列表
2.DataNode啟動時(shí)向NameNode注冊,通過后周期性地向NameNode上報(bào)blockReport,每3秒向NameNode發(fā)送一次心跳,NameNode返回對該DataNode的指令,如將數(shù)據(jù)塊復(fù)制到另一臺機(jī)器,或刪除某個(gè)數(shù)據(jù)塊等···而當(dāng)某一個(gè)DataNode超過10min還沒向NameNode發(fā)送心跳,此時(shí)NameNode就會判定該DataNode不可用,此時(shí)客戶端的讀寫操作就不會再傳達(dá)到該DataNode上
3.hadoop集群剛開始啟動時(shí)會進(jìn)入安全模式(99.99%),就用到了心跳機(jī)制,其實(shí)就是在集群剛啟動的時(shí)候,每一個(gè)DataNode都會向NameNode發(fā)送blockReport,NameNode會統(tǒng)計(jì)它們上報(bào)的總block數(shù),除以一開始知道的總個(gè)數(shù)total,當(dāng) block/total < 99.99% 時(shí),會觸發(fā)安全模式,安全模式下客戶端就沒法向HDFS寫數(shù)據(jù),只能進(jìn)行讀數(shù)據(jù)。
3.2 負(fù)載均衡 其實(shí)就是節(jié)點(diǎn)的增加或減少,或者節(jié)點(diǎn)的磁盤使用率高低的問題,主要就是通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)的遷移工作以達(dá)到高可用率 觸發(fā)命令 $ HADOOP_HOME/sbin/start-balancer.sh -t 5% 5%其實(shí)就是剛剛提到的磁盤的利用率差值,大于5%時(shí)會觸發(fā)負(fù)載均衡策略。