×

帶你入坑大數(shù)據(jù)(一) --- HDFS基礎(chǔ)概念篇

分類:互聯(lián)網(wǎng)熱點 編輯:新網(wǎng)小青年 瀏覽量:417
2020-07-20 13:33:06

## 一、HDFS的概念 先簡單過一下基礎(chǔ)概念,起碼知道接下來要說的東西和這個東西是用來干啥的

1.1 Hadoop架構(gòu) HDFS(Hadoop Distributed FileSystem),由3個模塊組成:分布式存儲HDFS,分布式計算MapReduce,資源調(diào)度框架Yarn ![](https://user-gold-cdn.xitu.io/2019/11/10/16e5189e5518edf6?w=564&h=426&f=png&s=32400) 大量的文件可以分散存儲在不同的服務(wù)器上面 單個文件比較大,單塊磁盤放不下,可以切分成很多小的block塊,分散存儲在不同的服務(wù)器上面,各服務(wù)器通過網(wǎng)絡(luò)連接,造成一個整體。 

 1.2 核心概念block HDFS3.x上的文件會按照128M為單位切分成一個個的block,分散存儲在集群的不同的數(shù)據(jù)節(jié)點datanode上,需要注意的是,這個操作是HDFS自動完成的。 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e518b1f473fd46?w=785&h=909&f=png&s=131162) 假設(shè)我們現(xiàn)在要存儲一個300M的文件,這個300M就會被切分成 datanode1:128M + datanode2:128M + datanode3:44M 這時我們需要知道,就算它的底層邏輯會按照128M進行劃分,可是datanode3一個實際占用44M的塊也是不會占據(jù)128M的空間的 

1.3 block的副本 為什么hadoop直至今天會這么流行,就是因為它的初始設(shè)計就是可以部署在商用服務(wù)器上,而我們知道,商用服務(wù)器是非常廉價的,而這種廉價的服務(wù)器就很容易出現(xiàn)故障,比如CPU,IO內(nèi)存等等都可能會產(chǎn)生問題 按照我們剛剛1.2的說法,一個文件被分成了3塊存儲在不同的datanode上,萬一其中的一個datanode掛掉,那豈不是這個文件就找不回來了嗎,所以hadoop還對我們的每一個數(shù)據(jù)塊做了一個副本,保證數(shù)據(jù)的可靠性 副本數(shù)可以自己進行手動設(shè)置,一般是3個副本 hdfs-site.xml dfs.replication 3 可以清晰看到value的值為3,我們的副本數(shù)就為3 類似于這些個屬性我們是如何得知它們的作用的呢,在上可以查看,這里用的2.7.3。點開官方文檔,在左側(cè)邊欄拉至最下方可以看到configuration項 當(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) 點擊hdfs-default.xml,可以按下ctrl+f進行搜索,輸入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 時我們提到的block大小為128M在這個文件中也可以找到 ![](https://user-gold-cdn.xitu.io/2019/11/6/16e4160881360377?w=1890&h=155&f=png&s=40493) 所以其實每一個數(shù)據(jù)塊block的大小也是可以自主設(shè)置的 #### 1.3.1 機架存儲策略 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e5188fc1f2be0e?w=811&h=810&f=png&s=820078) 實際機房中,會有(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),每個機架上會有若干臺服務(wù)器 一般來說我們會把一個block的3個副本分別按照下述方法進行存儲: 第一個副本就存儲在一個機架A上 第二個副本存儲在和這個block塊不同機架(比如機架B)的一個服務(wù)器上 我們存儲第2個副本時會優(yōu)先把副本存儲在不同的機架上,這是為了防止出現(xiàn)一個機架斷電的情況,如果副本也存儲在同機架上的不同服務(wù)器上,這時候數(shù)據(jù)就可能丟失了。 第三個副本存儲在機架B的另外一個服務(wù)器上(注意副本2,3都存儲在了機架B) 為什么會這么選擇,因為如果我們把副本3也放在另外一個機架C上,副本2和副本3之間的通信就需要副本2通過它的交換機去聯(lián)系總交換機,然后總交換機去聯(lián)系機架C的交換機,需要走的路線非常長,而且機房中的帶寬資源非常寶貴,如果處于高并發(fā)的情況,很容易就把機房的帶寬打滿,此時整一個集群的響應(yīng)速度會急劇下降,這時候服務(wù)就會出現(xiàn)問題了。 當(dāng)然我們的副本數(shù)也是可以手動通過命令增加的,在客戶端訪問量多的時候,可以適當(dāng)分配一下壓力 $ hadoop fs -setrep -R 4 path+FileName setrep的意思其實就是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) 再次強調(diào)一下,大數(shù)據(jù)的框架大部分其實都是主從架構(gòu),就是一主多從,等下要講到的HDFS就是一個NameNode,多個DataNode,MapReduce就是一個JobTracker,多個TaskTracker,Yarn則是一個ResourceManager,多個NodeManager,而Spark就是一個Master和多個Slave DataNode的介紹其實可以省略,姑且只需要知道它的作用是存放block塊的即可。 

 2.1 NameNode的介紹 大數(shù)據(jù)框架都是分布式的,可能每個角色都運行在各個不同的服務(wù)器上面,需要進行通信的時候就要需要網(wǎng)絡(luò)的支持,而在我們客戶端需要讀一個文件的信息時,必須知道我們這個文件被分成了多少個block,各個block又分別存儲在哪個服務(wù)器上,這種用于描述文件的信息被稱為文件的元數(shù)據(jù)信息(metaData),而metaData就是存儲在NameNode的內(nèi)存中的

2.2 metaData的介紹 metaData的大?。何募?,block,目錄占用大概150byte字節(jié)的元數(shù)據(jù),所以為什么說HDFS適合存儲大文件而不適合存儲小文件,可想而知存儲一個大文件就只有一份150byte的元數(shù)據(jù),存儲N多個小文件就會伴隨存在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宕機了,內(nèi)存就無法讀取了,此時為了防止這種情況出現(xiàn),也為了加快NameNode從故障中恢復(fù)的速度,就設(shè)計了一個SecondaryNameNode的角色 日志緩存方面:客戶端向 HDFS 寫文件,會記錄下來操作日志,而這時我們會預(yù)先準(zhǔn)備好兩塊緩存區(qū)域,這個日志在寫滿了第一塊緩存時,會開始錄入磁盤,也就是edits log,NameNode的內(nèi)存中,這種狀態(tài)就是一個雙緩存異步寫的操作。這樣可以保證客戶端寫的日志時刻都能被記錄下來。 #### 2.3 SecondaryNameNode的介紹 它的作用主要有以下幾點 1.備份NameNode中的元數(shù)據(jù)信息 2.提高NameNode的重啟速度 3.必要的時候可作為新的NameNode ##### 為什么說SecondaryNameNode可以提高NameNode的恢復(fù)速度? 當(dāng)集群啟動的時候,會記錄下啟動的時間t,而隨著一段時間過去后或者NameNode中的edits log文件存滿后就會觸發(fā)checkPoint操作,在Spark中也會有這個知識點,主要作用就是對重要的數(shù)據(jù)進行備份的一個操作 對操作步驟進行一個分點闡述方便大家閱讀 1.SecondaryNameNode 會通過http get方式把edits log和fsimage的信息拉取過來 2.在SecondaryNameNode中把edits log和fsimage做一個合并,產(chǎn)生一個新的文件叫做fsimage.ckpt 3.在SecondaryNameNode中合并完成之后,再回傳給NameNode里面 4.這時大概率會有客戶端還在對NameNode進行讀寫操作,也會產(chǎn)生新的日志,會單獨放在一份edits new文件中 5.剛剛回傳回來的fsimage.ckpt進行分解,原本的fsimage和edits log,不過此時的edits log會把edits new中的日志文件一同合并作為完整的一份edits log文件 ##### 為什么說SecondaryNameNode可以提高NameNode的重啟速度 首先搞清楚NameNode節(jié)點掛掉后它是如何進行恢復(fù)的 首先它會把內(nèi)存中的鏡像文件fsimage讀到內(nèi)存當(dāng)中,然后通過edits log所記錄的所有操作重新執(zhí)行一遍,把所有的元數(shù)據(jù)都恢復(fù)之后,才能回到關(guān)機之前的狀態(tài),這個過程十分緩慢 但是有了SecondaryNameNode之后,通過它提供的fsimage.ckpt可以恢復(fù)很大一部分的元數(shù)據(jù)信息,再直接通過執(zhí)行edits log中所記錄下來的,從edits new中合并過來的新操作,就可以進行恢復(fù) 而在NameNode確定無法重啟之后,SecondaryNameNode就可以通過以下命令作為新的NameNode對外提供服務(wù) hadoop-daemon.sh start namenode 當(dāng)然我們不難發(fā)現(xiàn),這種方式非常地不優(yōu)雅,因為在NameNode進行重啟或者SecondaryNameNode進行上位的時間段中我們的集群肯定都會有一段空白期,所以之后講到的hadoop HA的方式就會幫助我們解決這個問題 

三、HDFS機制 

3.1 心跳機制 ![](https://user-gold-cdn.xitu.io/2019/11/10/16e518d2898c7d2d?w=916&h=445&f=png&s=22305) 心跳機制解決了HDFS集群間的通信問題,還是NameNode命令DataNode執(zhí)行操作的途徑 1.master namenode啟動之后,會開一個ipc server 2.slave DataNode啟動,連接NameNode,每隔3s向NameNode發(fā)送一個心跳,并攜帶狀態(tài)信息 3.NameNode通過對這個心跳的返回值來給DataNode傳達任務(wù)指令 心跳機制的作用

 1.NameNode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性從集群中的每個DataNode接收心跳信號和塊狀態(tài)報告(blockReport),接收到心跳信號意味著該DataNode節(jié)點工作正常,塊狀態(tài)報告包含了該DataNode上所有數(shù)據(jù)塊的列表

 2.DataNode啟動時向NameNode注冊,通過后周期性地向NameNode上報blockReport,每3秒向NameNode發(fā)送一次心跳,NameNode返回對該DataNode的指令,如將數(shù)據(jù)塊復(fù)制到另一臺機器,或刪除某個數(shù)據(jù)塊等···而當(dāng)某一個DataNode超過10min還沒向NameNode發(fā)送心跳,此時NameNode就會判定該DataNode不可用,此時客戶端的讀寫操作就不會再傳達到該DataNode上

 3.hadoop集群剛開始啟動時會進入安全模式(99.99%),就用到了心跳機制,其實就是在集群剛啟動的時候,每一個DataNode都會向NameNode發(fā)送blockReport,NameNode會統(tǒng)計它們上報的總block數(shù),除以一開始知道的總個數(shù)total,當(dāng) block/total < 99.99% 時,會觸發(fā)安全模式,安全模式下客戶端就沒法向HDFS寫數(shù)據(jù),只能進行讀數(shù)據(jù)。 

3.2 負(fù)載均衡 其實就是節(jié)點的增加或減少,或者節(jié)點的磁盤使用率高低的問題,主要就是通過網(wǎng)絡(luò)進行數(shù)據(jù)的遷移工作以達到高可用率 觸發(fā)命令 $ HADOOP_HOME/sbin/start-balancer.sh -t 5% 5%其實就是剛剛提到的磁盤的利用率差值,大于5%時會觸發(fā)負(fù)載均衡策略。


聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)

送郵件至:operations@xinnet.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時

需注明出處:新網(wǎng)idc知識百科

免費咨詢獲取折扣

Loading