帶你入坑大數(shù)據(jù)(一) --- HDFS基礎(chǔ)概念篇
## 一、HDFS的概念 先簡(jiǎn)單過(guò)一下基礎(chǔ)概念,起碼知道接下來(lái)要說(shuō)的東西和這個(gè)東西是用來(lái)干啥的
1.1 Hadoop架構(gòu) HDFS(Hadoop Distributed FileSystem),由3個(gè)模塊組成:分布式存儲(chǔ)HDFS,分布式計(jì)算MapReduce,資源調(diào)度框架Yarn ![](https://user-gold-cdn.xitu.io/2019/11/10/16e5189e5518edf6?w=564&h=426&f=png&s=32400) 大量的文件可以分散存儲(chǔ)在不同的服務(wù)器上面 單個(gè)文件比較大,單塊磁盤放不下,可以切分成很多小的block塊,分散存儲(chǔ)在不同的服務(wù)器上面,各服務(wù)器通過(guò)網(wǎng)絡(luò)連接,造成一個(gè)整體。
1.2 核心概念block HDFS3.x上的文件會(huì)按照128M為單位切分成一個(gè)個(gè)的block,分散存儲(chǔ)在集群的不同的數(shù)據(jù)節(jié)點(diǎn)datanode上,需要注意的是,這個(gè)操作是HDFS自動(dòng)完成的。 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e518b1f473fd46?w=785&h=909&f=png&s=131162) 假設(shè)我們現(xiàn)在要存儲(chǔ)一個(gè)300M的文件,這個(gè)300M就會(huì)被切分成 datanode1:128M + datanode2:128M + datanode3:44M 這時(shí)我們需要知道,就算它的底層邏輯會(huì)按照128M進(jìn)行劃分,可是datanode3一個(gè)實(shí)際占用44M的塊也是不會(huì)占據(jù)128M的空間的
1.3 block的副本 為什么hadoop直至今天會(huì)這么流行,就是因?yàn)樗某跏荚O(shè)計(jì)就是可以部署在商用服務(wù)器上,而我們知道,商用服務(wù)器是非常廉價(jià)的,而這種廉價(jià)的服務(wù)器就很容易出現(xiàn)故障,比如CPU,IO內(nèi)存等等都可能會(huì)產(chǎn)生問(wèn)題 按照我們剛剛1.2的說(shuō)法,一個(gè)文件被分成了3塊存儲(chǔ)在不同的datanode上,萬(wàn)一其中的一個(gè)datanode掛掉,那豈不是這個(gè)文件就找不回來(lái)了嗎,所以hadoop還對(duì)我們的每一個(gè)數(shù)據(jù)塊做了一個(gè)副本,保證數(shù)據(jù)的可靠性 副本數(shù)可以自己進(jìn)行手動(dòng)設(shè)置,一般是3個(gè)副本 hdfs-site.xml dfs.replication 3 可以清晰看到value的值為3,我們的副本數(shù)就為3 類似于這些個(gè)屬性我們是如何得知它們的作用的呢,在上可以查看,這里用的2.7.3。點(diǎn)開(kāi)官方文檔,在左側(cè)邊欄拉至最下方可以看到configuration項(xiàng) 當(dāng)然我們需要找對(duì)文件,是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ù)說(shuō)明寫著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ī)架存儲(chǔ)策略 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e5188fc1f2be0e?w=811&h=810&f=png&s=820078) 實(shí)際機(jī)房中,會(huì)有(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ī)架上會(huì)有若干臺(tái)服務(wù)器 一般來(lái)說(shuō)我們會(huì)把一個(gè)block的3個(gè)副本分別按照下述方法進(jìn)行存儲(chǔ): 第一個(gè)副本就存儲(chǔ)在一個(gè)機(jī)架A上 第二個(gè)副本存儲(chǔ)在和這個(gè)block塊不同機(jī)架(比如機(jī)架B)的一個(gè)服務(wù)器上 我們存儲(chǔ)第2個(gè)副本時(shí)會(huì)優(yōu)先把副本存儲(chǔ)在不同的機(jī)架上,這是為了防止出現(xiàn)一個(gè)機(jī)架斷電的情況,如果副本也存儲(chǔ)在同機(jī)架上的不同服務(wù)器上,這時(shí)候數(shù)據(jù)就可能丟失了。 第三個(gè)副本存儲(chǔ)在機(jī)架B的另外一個(gè)服務(wù)器上(注意副本2,3都存儲(chǔ)在了機(jī)架B) 為什么會(huì)這么選擇,因?yàn)槿绻覀儼迅北?也放在另外一個(gè)機(jī)架C上,副本2和副本3之間的通信就需要副本2通過(guò)它的交換機(jī)去聯(lián)系總交換機(jī),然后總交換機(jī)去聯(lián)系機(jī)架C的交換機(jī),需要走的路線非常長(zhǎng),而且機(jī)房中的帶寬資源非常寶貴,如果處于高并發(fā)的情況,很容易就把機(jī)房的帶寬打滿,此時(shí)整一個(gè)集群的響應(yīng)速度會(huì)急劇下降,這時(shí)候服務(wù)就會(huì)出現(xiàn)問(wèn)題了。 當(dāng)然我們的副本數(shù)也是可以手動(dòng)通過(guò)命令增加的,在客戶端訪問(wèn)量多的時(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又分別存儲(chǔ)在哪個(gè)服務(wù)器上,這種用于描述文件的信息被稱為文件的元數(shù)據(jù)信息(metaData),而metaData就是存儲(chǔ)在NameNode的內(nèi)存中的
2.2 metaData的介紹 metaData的大?。何募?,block,目錄占用大概150byte字節(jié)的元數(shù)據(jù),所以為什么說(shuō)HDFS適合存儲(chǔ)大文件而不適合存儲(chǔ)小文件,可想而知存儲(chǔ)一個(gè)大文件就只有一份150byte的元數(shù)據(jù),存儲(chǔ)N多個(gè)小文件就會(huì)伴隨存在N份150Byte字節(jié)的元數(shù)據(jù)文件,這就非常地不劃算 元數(shù)據(jù)信息以命名空間鏡像文件(以下稱為fsimage)和編輯日志(以下稱為edits log)的方式保存,兩者的作用分別是 fsimage:元數(shù)據(jù)鏡像文件,保存了文件系統(tǒng)目錄樹(shù)信息以及文件和塊的對(duì)應(yīng)關(guān)系 edits log:日志文件,保存了文件的更改記錄 為什么元數(shù)據(jù)需要存儲(chǔ)在NameNode的內(nèi)存中呢,答案很簡(jiǎn)單,存儲(chǔ)在內(nèi)存中意味著快,當(dāng)然也會(huì)存在問(wèn)題,就是如果NameNode宕機(jī)了,內(nèi)存就無(wú)法讀取了,此時(shí)為了防止這種情況出現(xiàn),也為了加快NameNode從故障中恢復(fù)的速度,就設(shè)計(jì)了一個(gè)SecondaryNameNode的角色 日志緩存方面:客戶端向 HDFS 寫文件,會(huì)記錄下來(lái)操作日志,而這時(shí)我們會(huì)預(yù)先準(zhǔn)備好兩塊緩存區(qū)域,這個(gè)日志在寫滿了第一塊緩存時(shí),會(huì)開(kāi)始錄入磁盤,也就是edits log,NameNode的內(nèi)存中,這種狀態(tài)就是一個(gè)雙緩存異步寫的操作。這樣可以保證客戶端寫的日志時(shí)刻都能被記錄下來(lái)。 #### 2.3 SecondaryNameNode的介紹 它的作用主要有以下幾點(diǎn) 1.備份NameNode中的元數(shù)據(jù)信息 2.提高NameNode的重啟速度 3.必要的時(shí)候可作為新的NameNode ##### 為什么說(shuō)SecondaryNameNode可以提高NameNode的恢復(fù)速度? 當(dāng)集群?jiǎn)?dòng)的時(shí)候,會(huì)記錄下啟動(dòng)的時(shí)間t,而隨著一段時(shí)間過(guò)去后或者NameNode中的edits log文件存滿后就會(huì)觸發(fā)checkPoint操作,在Spark中也會(huì)有這個(gè)知識(shí)點(diǎn),主要作用就是對(duì)重要的數(shù)據(jù)進(jìn)行備份的一個(gè)操作 對(duì)操作步驟進(jìn)行一個(gè)分點(diǎn)闡述方便大家閱讀 1.SecondaryNameNode 會(huì)通過(guò)http get方式把edits log和fsimage的信息拉取過(guò)來(lái) 2.在SecondaryNameNode中把edits log和fsimage做一個(gè)合并,產(chǎn)生一個(gè)新的文件叫做fsimage.ckpt 3.在SecondaryNameNode中合并完成之后,再回傳給NameNode里面 4.這時(shí)大概率會(huì)有客戶端還在對(duì)NameNode進(jìn)行讀寫操作,也會(huì)產(chǎn)生新的日志,會(huì)單獨(dú)放在一份edits new文件中 5.剛剛回傳回來(lái)的fsimage.ckpt進(jìn)行分解,原本的fsimage和edits log,不過(guò)此時(shí)的edits log會(huì)把edits new中的日志文件一同合并作為完整的一份edits log文件 ##### 為什么說(shuō)SecondaryNameNode可以提高NameNode的重啟速度 首先搞清楚NameNode節(jié)點(diǎn)掛掉后它是如何進(jìn)行恢復(fù)的 首先它會(huì)把內(nèi)存中的鏡像文件fsimage讀到內(nèi)存當(dāng)中,然后通過(guò)edits log所記錄的所有操作重新執(zhí)行一遍,把所有的元數(shù)據(jù)都恢復(fù)之后,才能回到關(guān)機(jī)之前的狀態(tài),這個(gè)過(guò)程十分緩慢 但是有了SecondaryNameNode之后,通過(guò)它提供的fsimage.ckpt可以恢復(fù)很大一部分的元數(shù)據(jù)信息,再直接通過(guò)執(zhí)行edits log中所記錄下來(lái)的,從edits new中合并過(guò)來(lái)的新操作,就可以進(jìn)行恢復(fù) 而在NameNode確定無(wú)法重啟之后,SecondaryNameNode就可以通過(guò)以下命令作為新的NameNode對(duì)外提供服務(wù) hadoop-daemon.sh start namenode 當(dāng)然我們不難發(fā)現(xiàn),這種方式非常地不優(yōu)雅,因?yàn)樵贜ameNode進(jìn)行重啟或者SecondaryNameNode進(jìn)行上位的時(shí)間段中我們的集群肯定都會(huì)有一段空白期,所以之后講到的hadoop HA的方式就會(huì)幫助我們解決這個(gè)問(wèn)題
三、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集群間的通信問(wèn)題,還是NameNode命令DataNode執(zhí)行操作的途徑 1.master namenode啟動(dòng)之后,會(huì)開(kāi)一個(gè)ipc server 2.slave DataNode啟動(dòng),連接NameNode,每隔3s向NameNode發(fā)送一個(gè)心跳,并攜帶狀態(tài)信息 3.NameNode通過(guò)對(duì)這個(gè)心跳的返回值來(lái)給DataNode傳達(dá)任務(wù)指令 心跳機(jī)制的作用
1.NameNode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性從集群中的每個(gè)DataNode接收心跳信號(hào)和塊狀態(tài)報(bào)告(blockReport),接收到心跳信號(hào)意味著該DataNode節(jié)點(diǎn)工作正常,塊狀態(tài)報(bào)告包含了該DataNode上所有數(shù)據(jù)塊的列表
2.DataNode啟動(dòng)時(shí)向NameNode注冊(cè),通過(guò)后周期性地向NameNode上報(bào)blockReport,每3秒向NameNode發(fā)送一次心跳,NameNode返回對(duì)該DataNode的指令,如將數(shù)據(jù)塊復(fù)制到另一臺(tái)機(jī)器,或刪除某個(gè)數(shù)據(jù)塊等···而當(dāng)某一個(gè)DataNode超過(guò)10min還沒(méi)向NameNode發(fā)送心跳,此時(shí)NameNode就會(huì)判定該DataNode不可用,此時(shí)客戶端的讀寫操作就不會(huì)再傳達(dá)到該DataNode上
3.hadoop集群剛開(kāi)始啟動(dòng)時(shí)會(huì)進(jìn)入安全模式(99.99%),就用到了心跳機(jī)制,其實(shí)就是在集群剛啟動(dòng)的時(shí)候,每一個(gè)DataNode都會(huì)向NameNode發(fā)送blockReport,NameNode會(huì)統(tǒng)計(jì)它們上報(bào)的總block數(shù),除以一開(kāi)始知道的總個(gè)數(shù)total,當(dāng) block/total < 99.99% 時(shí),會(huì)觸發(fā)安全模式,安全模式下客戶端就沒(méi)法向HDFS寫數(shù)據(jù),只能進(jìn)行讀數(shù)據(jù)。
3.2 負(fù)載均衡 其實(shí)就是節(jié)點(diǎn)的增加或減少,或者節(jié)點(diǎn)的磁盤使用率高低的問(wèn)題,主要就是通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)的遷移工作以達(dá)到高可用率 觸發(fā)命令 $ HADOOP_HOME/sbin/start-balancer.sh -t 5% 5%其實(shí)就是剛剛提到的磁盤的利用率差值,大于5%時(shí)會(huì)觸發(fā)負(fù)載均衡策略。
聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)
送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)
需注明出處:新網(wǎng)idc知識(shí)百科