源自Google的GFS(Google分布式文件系統(tǒng))論文,分布式文件系統(tǒng)(HDFS)是GFS的克隆版。HDFS負(fù)責(zé)數(shù)據(jù)文件的存儲(chǔ),可讓多機(jī)器上分享存儲(chǔ)空間,讓實(shí)際上通過網(wǎng)絡(luò)來訪問文件的動(dòng)作,用戶就像是訪問本地磁盤一樣便捷。
即使HDFS集群中某些節(jié)點(diǎn)脫機(jī),整體來說系統(tǒng)仍然可以持續(xù)運(yùn)作而不會(huì)有數(shù)據(jù)丟失。
HDFS提供了一個(gè)低成本、高可靠、高容錯(cuò)、高性能的分布式文件系統(tǒng)。
1.低成本主要體現(xiàn)在搭建HDFS主要是通過橫向擴(kuò)展機(jī)器數(shù)量而非花高價(jià)錢購進(jìn)昂貴的服務(wù)器。
2.高可靠主要體現(xiàn)在
1)、HDFS解決了單點(diǎn)問題,HDFS集群中心節(jié)點(diǎn)是非常重要的,如果中心節(jié)點(diǎn)宕機(jī)整個(gè)集群將無法使用,所以中心節(jié)點(diǎn)NameNode會(huì)有主要節(jié)點(diǎn)(Primary)和備份節(jié)點(diǎn)(Stand By)。如果Primary出現(xiàn)問題Stand By可以自動(dòng)接替Primary工作。
2)、副本機(jī)制,HDFS集群中文件一般會(huì)存在多份,同一份數(shù)據(jù)會(huì)被存放在多臺(tái)不同的機(jī)器上,如果監(jiān)控到其中的一臺(tái)機(jī)器宕機(jī),隨即將該臺(tái)機(jī)器上的數(shù)據(jù)遷移到其他機(jī)器上保證數(shù)據(jù)的數(shù)量完整性。說明集群中一個(gè)節(jié)點(diǎn)宕機(jī)對(duì)整個(gè)集群的影響是有限可控的。
3)、HDFS負(fù)載均衡,中心節(jié)點(diǎn)(NameNode)不斷的接收數(shù)據(jù)節(jié)點(diǎn)(DataNode)發(fā)送過來的心跳檢測獲得子節(jié)點(diǎn)的運(yùn)行狀態(tài),發(fā)現(xiàn)集群負(fù)載較高的情況下。啟動(dòng)HDFS的balancer工具進(jìn)行數(shù)據(jù)遷移集群里面的數(shù)據(jù)降低系統(tǒng)負(fù)載。
4)、機(jī)架感知,大型HDFS集群是以機(jī)架的形式來組織的,同一個(gè)機(jī)架上不同節(jié)點(diǎn)間的網(wǎng)絡(luò)狀況比不同機(jī)架之間的更為理想。另外,中心節(jié)點(diǎn)(NameNode)設(shè)法數(shù)據(jù)塊副本保存在不同的機(jī)架上以提高容錯(cuò)性。
3.高容錯(cuò)主要體現(xiàn)在
分布式計(jì)算模型(MapReduce)容錯(cuò),一個(gè)MapReduce任務(wù)在集群機(jī)器上面以任務(wù)跟中(TaskTracker)執(zhí)行。每一個(gè)TaskTracker被Job監(jiān)控(jobTracker)監(jiān)控,如果發(fā)現(xiàn)一個(gè)TaskTracker執(zhí)行失敗JobTracker就會(huì)將該任務(wù)分配到其他機(jī)器上面運(yùn)行。
4.高性能體現(xiàn)在處理大型任務(wù)上集群處理效率,多臺(tái)機(jī)器分塊并行處理要比單臺(tái)機(jī)器串行處理要快很多。
HDFS分布式文件系統(tǒng),是怎樣做到的呢?
通常一個(gè)HDFS集群是由一個(gè)中心節(jié)點(diǎn)(NameNode)和多個(gè)數(shù)據(jù)節(jié)點(diǎn)(DataNode)組成的,中心節(jié)點(diǎn)負(fù)責(zé)管理整個(gè)集群,如果中心節(jié)點(diǎn)癱瘓那么整個(gè)集群就無法使用,上面我們給出設(shè)置備份中心節(jié)點(diǎn)的解決辦法,但是為了進(jìn)一步確保穩(wěn)定性通常會(huì)選用一臺(tái)高性能配置好的服務(wù)器作為中心節(jié)點(diǎn)。
數(shù)據(jù)文件大的文件切塊分散存儲(chǔ)
HDFS將數(shù)據(jù)以Block塊存儲(chǔ),每一個(gè)Block塊在搭建HDFS的時(shí)候可以被設(shè)置,如果數(shù)據(jù)文件大到超出了Block塊設(shè)定的大小,就會(huì)將這個(gè)文件按Block塊大小切分為多個(gè)文件塊存儲(chǔ)在HDFS中。
切分的Block塊不一定存放在同一臺(tái)Data Node上面,HDFS會(huì)根據(jù)節(jié)點(diǎn)的負(fù)載情況進(jìn)行調(diào)整數(shù)據(jù)存儲(chǔ)位置。
他們存儲(chǔ)位置由中心節(jié)點(diǎn)(NameNode)負(fù)責(zé)管理,NameNode不斷的監(jiān)控DataNode的運(yùn)行情況,如遇DataNode宕機(jī)好及時(shí)遷移數(shù)據(jù)。
元數(shù)據(jù)和數(shù)據(jù)分開存儲(chǔ)
HDFS的尋找文件地址通過從Root中找到元數(shù)據(jù),再從Meta找到文件存儲(chǔ)的服務(wù)器和地址。其中NameNode主要管理存放到DataNode中數(shù)據(jù)的元數(shù)據(jù)。由于將元數(shù)據(jù)和數(shù)據(jù)分開有利于文件系統(tǒng)的分布式部署,NameNode維護(hù)一份數(shù)據(jù)在集群中不會(huì)有名稱沖突,一份數(shù)據(jù)在集群中只有唯一的一個(gè)名字。
客戶端向NameNode發(fā)起請(qǐng)求,集群中NameNode向DataNode發(fā)起計(jì)算任務(wù)的請(qǐng)求,DataNode負(fù)責(zé)將計(jì)算的結(jié)果反饋給NameNode統(tǒng)計(jì)出結(jié)果。
一次寫入多次讀取
HDFS中存儲(chǔ)的文件只允許一次寫入,寫入之后就不能被修改,如有修改只能在文件中追加數(shù)據(jù)。
寫入的時(shí)候需要對(duì)數(shù)據(jù)進(jìn)行清洗,將壞的數(shù)據(jù)扔掉。
當(dāng)文件被創(chuàng)建,接著寫入數(shù)據(jù),最后,一旦文件被關(guān)閉,就不能再修改。這種模型可以有效地保證數(shù)據(jù)一致性,且避免了復(fù)雜的并發(fā)同步處理,很好地支持了對(duì)數(shù)據(jù)訪問的高吞吐量。
移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更劃算
分布式系統(tǒng)計(jì)算過程中距離數(shù)據(jù)越近,計(jì)算性能越好,尤其是在數(shù)據(jù)量特別大的時(shí)候。由于分布式系統(tǒng)數(shù)據(jù)存放在不同的機(jī)器上,對(duì)于計(jì)算而言就產(chǎn)生了兩種策略,移動(dòng)數(shù)據(jù)和移動(dòng)計(jì)算。如果數(shù)據(jù)量特別大移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)成本消耗非常大而且負(fù)責(zé)計(jì)算的機(jī)器的性能瓶頸也很容易限制運(yùn)算速度。相比移動(dòng)計(jì)算卻是非常劃算,將計(jì)算的方法分發(fā)給集群中DataNode節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)計(jì)算,DataNode節(jié)點(diǎn)將計(jì)算結(jié)果回傳給中心節(jié)點(diǎn),中心節(jié)點(diǎn)負(fù)責(zé)將回傳的結(jié)果匯總成結(jié)果。
移動(dòng)計(jì)算比較流行的有MapReduce,Spark等計(jì)算模型
小結(jié)
HDFS通過作為Hadoop主要的核心在數(shù)據(jù)存儲(chǔ)方面為我們提供了保證,是一款非常優(yōu)秀的分布式文件系統(tǒng)。通過對(duì)特點(diǎn)和架構(gòu)的分析我們能夠清晰的理解什么是HDFS。
HDFS在大數(shù)據(jù)中解決數(shù)據(jù)存儲(chǔ)問題,數(shù)據(jù)采用什么方法進(jìn)行高效的使用是我們關(guān)心的重點(diǎn),我們將下一回分享。