1. HDFS:
HDFS:Hadoop Distributed File System Hadoop 分布式文件系統(tǒng)
優(yōu)點(diǎn):
- 存儲海量數(shù)據(jù):HDFS可橫向擴(kuò)展,其存儲的文件可以支持PB級數(shù)據(jù)
- 容錯性高:數(shù)據(jù)保存多個副本,副本丟失后自動恢復(fù)。
- 擴(kuò)展性強(qiáng):可構(gòu)建在廉價(與小型機(jī)大型機(jī)對比)的機(jī)器上,實現(xiàn)線性擴(kuò)展。
(隨著節(jié)點(diǎn)數(shù)量的增加,集群的性能-計算性能和存儲性能都會有所增加)
當(dāng)集群增加新節(jié)點(diǎn)之后,namenode也可以感知,進(jìn)行負(fù)載均衡,將數(shù)據(jù)分發(fā)和備份數(shù)據(jù)均衡到新的節(jié)點(diǎn)上。(負(fù)載均衡:集群可將原本使用容量較高的節(jié)點(diǎn)上的數(shù)據(jù)自動寫入新的節(jié)點(diǎn)上,達(dá)到所有節(jié)點(diǎn)容量均勻)每個節(jié)點(diǎn)磁盤使
用容量百分比的差異可以人工設(shè)置。 - 大文件存儲: 數(shù)據(jù)分塊存儲,將一個大塊的數(shù)據(jù)切分成多個小塊的數(shù)據(jù)。
缺點(diǎn)
1、不能做到低延遲數(shù)據(jù)訪問:HDFS針對一次性獲取大量的數(shù)據(jù)做了優(yōu)化,犧牲了小數(shù)據(jù)量快速查詢的性能。
2、多次寫入,一次讀取(擅長:HDFS適合一次寫入,多次讀取的場景。)
3、不支持多用戶的并行寫
4、不適合大量的小文件存儲
A: 由于namenode將文件系統(tǒng)的元數(shù)據(jù)存儲在內(nèi)存中,因此該文件系統(tǒng)所能存儲的文件總數(shù)受限于namenode的內(nèi)存容量。
B: 元數(shù)據(jù)信息中每個文件、目錄和數(shù)據(jù)塊的存儲信息大約占150字節(jié)。
(1G 數(shù)據(jù)存儲的元數(shù)據(jù)信息占用150字節(jié) ,1M的數(shù)據(jù)元數(shù)據(jù)信息占用150字節(jié))
受限于內(nèi)存,元數(shù)據(jù)信息的存儲機(jī)制導(dǎo)致無論數(shù)據(jù)多大,元數(shù)據(jù)信息中描述這個數(shù)據(jù)的信息都是150字節(jié)。
2. HDFS整體架構(gòu):
1)Client:客戶端。
(1)文件切分。文件上傳HDFS的時候,Client將文件切分成一個一個的Block,然后進(jìn)行存儲;
(2)與NameNode交互,獲取文件的位置信息;
(3)與DataNode交互,讀取或者寫入數(shù)據(jù);
(4)Client提供一些命令來管理HDFS,比如啟動或者關(guān)閉HDFS;
(5)Client可以通過一些命令來訪問HDFS;
2)NameNode:就是Master,它是一個主管、管理者。
(1)管理HDFS的名稱空間;namespace
(2)管理數(shù)據(jù)塊(Block)映射信息;
(3)配置副本策略(默認(rèn));3
(4)處理客戶端讀寫請求。
3) DataNode:就是Slave。NameNode下達(dá)命令,DataNode執(zhí)行實際的操作。
(1)存儲實際的數(shù)據(jù)塊;
(2)執(zhí)行數(shù)據(jù)塊的讀/寫操作。
4) SecondaryNameNode:并非NameNode的熱備,。當(dāng)NameNode掛掉的時候,它并不能馬上替換NameNode并提供服務(wù)。
(1)輔助NameNode,分擔(dān)其工作量;
(2)定期合并Fsimage和Edits日志,并推送給NameNode,協(xié)助NameNode管理;
(3)在緊急情況下,可輔助恢復(fù)NameNode。
3. HDFS文件格式:
文件格式按面向的存儲形式不同,分為面向行和面向列的兩大類文件格式。
面向行
1). 文本文件格式(.txt):
計算可切分;
查看編輯簡單;
無壓縮占空間大、傳輸壓力大、數(shù)據(jù)解析開銷大;
學(xué)習(xí)練習(xí)使用
2). sequenceFile序列文件格式(.seq):
計算可切分;
原生支持、二進(jìn)制 kv 存儲、支持行和塊壓縮
本地查看不方便: 小文件合并成 kv 結(jié)構(gòu)后不易查看內(nèi)部數(shù)據(jù)
生產(chǎn)環(huán)境使用、map 輸出的默認(rèn)文件格式
面向列
3).rcfile 文件格式(.rc)
計算可切分;
數(shù)據(jù)加載快、查詢快、空間利用率高、高負(fù)載能力
每一項都不是最高
學(xué)習(xí)生產(chǎn)均可
4).orcfile 文件格式(.orc)
計算可切分;
兼具了 rcfile 優(yōu)點(diǎn),進(jìn)一步提高了讀取、存儲效率、新數(shù)據(jù)類型的支持
每一項都不是最高
學(xué)習(xí)生產(chǎn)均可
4. HDFS壓縮算法:
1). Lzo 壓縮
優(yōu)點(diǎn):壓縮/解壓速度也比較快,合理的壓縮率;支持 split,是 hadoop 中最流行的壓縮格式;可以在 linux 系統(tǒng)下安裝 lzop 命令,使用方便。
缺點(diǎn):壓縮率比 gzip 要低一些; hadoop 本身不支持,需要安裝;在應(yīng)用中對 lzo 格式的文件需要做一些特殊處理(為了支持 split 需要建索引,還需要指定 inputformat 為 lzo 格式)。
應(yīng)用場景: 一個很大的文本文件,壓縮之后還大于 200M 以上的可以考慮,而且單個文件越大, lzo 優(yōu)點(diǎn)越越明顯。
2). Gzip壓縮
優(yōu)點(diǎn):
(1)壓縮比例比較高,而且壓縮、解壓速度比較快;
(2)hadoop 本身支持,大部分 linux 系統(tǒng)都自帶 gzip 命令,使用方便.
缺點(diǎn):不支持split切分。
應(yīng)用場景: 由于不可切分,當(dāng)每個文件壓縮之后在 130M 以內(nèi)的(1 個塊大小內(nèi)),都可以考慮用 gzip壓縮格式。
3). Bzip2 壓縮
優(yōu)點(diǎn):
(1)支持 split;具有很高的壓縮率,比 gzip 壓縮率都高;
(2)hadoop 本身支持,但不支持 native;在 linux 系統(tǒng)下自帶 bzip2 命令,使用方便。
缺點(diǎn):壓縮/解壓速度慢;不支持 native。
應(yīng)用場景: 適合對速度要求不高,但需要較高的壓縮率的時候,可以作為 mapreduce 作業(yè)的輸出格式; 或者輸出之后的數(shù)據(jù)比較大,處理之后的數(shù)據(jù)需要壓縮存檔減少磁盤空間并且以后數(shù)據(jù)用得比較少的情況;或者對單個很大的文本文件想壓縮減少存儲空間,同時又需要支持 split,而且兼容之前的應(yīng)用程序(即應(yīng)用程序不需要修改)的情況。
4). Snappy 壓縮
優(yōu)點(diǎn):高速壓縮速度和合理的壓縮率。
缺點(diǎn):不支持 split;壓縮率比 gzip 要低; hadoop 本身不支持,需要安裝;
應(yīng)用場景: 當(dāng) Mapreduce 作業(yè)的 Map 輸出的數(shù)據(jù)比較大的時候,作為 Map 到 Reduce的中間數(shù)據(jù)的壓縮格式;或者作為一個 Mapreduce 作業(yè)的輸出和另外一個 Mapreduce 作業(yè)的輸入。
5. HDFS寫數(shù)據(jù)流程:
1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳文件,NameNode檢查目標(biāo)文件是否已存在,父目錄是否存在。
2)NameNode返回是否可以上傳。
3)客戶端請求第一個 block上傳到哪幾個datanode服務(wù)器上。
4)NameNode返回3個datanode節(jié)點(diǎn),分別為dn1、dn2、dn3。
5)客戶端通過FSDataOutputStream模塊請求dn1上傳數(shù)據(jù),dn1收到請求會繼續(xù)調(diào)用dn2,然后dn2調(diào)用dn3,將這個通信管道建立完成。
6)dn1、dn2、dn3逐級應(yīng)答客戶端。
7)客戶端開始往dn1上傳第一個block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存),以packet為單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;
8)當(dāng)一個block傳輸完成之后,客戶端再次請求NameNode上傳第二個block的服務(wù)器。(重復(fù)執(zhí)行3-7步)。
6. HDFS讀數(shù)據(jù)流程:
1)客戶端通過Distributed FileSystem向NameNode請求下載文件,NameNode通過查詢元數(shù)據(jù),找到文件塊所在的DataNode地址。
2)挑選一臺DataNode(就近原則,然后隨機(jī))服務(wù)器,請求讀取數(shù)據(jù)。
3)DataNode開始傳輸數(shù)據(jù)給客戶端(從磁盤里面讀取數(shù)據(jù)輸入流,以packet為單位來做校驗)。
4)客戶端以packet為單位接收,先在本地緩存,然后寫入目標(biāo)文件。
7. NN和2NN工作機(jī)制
Edits:記錄客戶端更新元數(shù)據(jù)信息的每一步操作(可通過Edits運(yùn)算出元數(shù)據(jù))。
首先,我們做個假設(shè),如果存儲在NameNode節(jié)點(diǎn)的磁盤中,因為經(jīng)常需要進(jìn)行隨機(jī)訪問,還有響應(yīng)客戶請求,必然是效率過低。因此,元數(shù)據(jù)需要存放在內(nèi)存中。但如果只存在內(nèi)存中,一旦斷電,元數(shù)據(jù)丟失,整個集群就無法工作了。因此產(chǎn)生在磁盤中備份元數(shù)據(jù)序列化后文件的FsImage。
這樣又會帶來新的問題,當(dāng)在內(nèi)存中的元數(shù)據(jù)更新時,如果同時更新FsImage,就會導(dǎo)致效率過低,但如果不更新,就會發(fā)生一致性問題,一旦NameNode節(jié)點(diǎn)斷電,就會產(chǎn)生數(shù)據(jù)丟失。因此,引入Edits文件來記錄客戶端更新元數(shù)據(jù)信息的每一步操作(只進(jìn)行追加操作,效率很高),每當(dāng)元數(shù)據(jù)有更新或者添加元數(shù)據(jù)時,修改內(nèi)存中的元數(shù)據(jù)并追加到Edits中 。這樣,一旦NameNode節(jié)點(diǎn)斷電,可以通過FsImage和Edits的合并,合成元數(shù)據(jù)。
但是,如果長時間添加數(shù)據(jù)到Edits中,會導(dǎo)致該文件數(shù)據(jù)過大,效率降低,而且一旦斷電,恢復(fù)元數(shù)據(jù)需要的時間過長。因此,需要定期進(jìn)行FsImage和Edits的合并,如果這個操作由NameNode節(jié)點(diǎn)完成,又會效率過低。因此,引入一個新的節(jié)點(diǎn)SecondaryNamenode,專門用于FsImage和Edits的合并。
1). 第一階段:NameNode啟動
(1)第一次啟動NameNode格式化后,創(chuàng)建fsimage和edits文件。如果不是第一次啟動,直接加載編輯日志和鏡像文件到內(nèi)存。
(2)客戶端對元數(shù)據(jù)進(jìn)行增刪改的請求。
(3)NameNode記錄操作日志,更新滾動日志。
(4)NameNode在內(nèi)存中對數(shù)據(jù)進(jìn)行增刪改查。
2). 第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要checkpoint。直接帶回NameNode是否檢查結(jié)果。
(2)Secondary NameNode請求執(zhí)行checkpoint。
(3)NameNode滾動正在寫的edits日志。
(4)將滾動前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內(nèi)存,并合并。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
8. DataNode的工作機(jī)制
1)一個數(shù)據(jù)塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個是數(shù)據(jù)本身,一個是元數(shù)據(jù)包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗和,以及時間戳。
2)DataNode啟動后向NameNode注冊,通過后,周期性(1小時)的向NameNode上報所有的塊信息。
3)心跳是每3秒一次,心跳返回結(jié)果帶有NameNode給該DataNode的命令如復(fù)制塊數(shù)據(jù)到另一臺機(jī)器,或刪除某個數(shù)據(jù)塊。如果超過10分鐘沒有收到某個DataNode的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。