在配置hbase集群將 hdfs 掛接到其它鏡像盤時(shí),有不少困惑的地方,結(jié)合以前的資料再次學(xué)習(xí); 大數(shù)據(jù)底層技術(shù)的三大基石起源于Google在2006年之前的三篇論文GFS、Map-Reduce、 Bigtable,其中GFS、Map-Reduce技術(shù)直接支持了ApacheHadoop項(xiàng)目的誕生,Bigtable催生了NoSQL這個(gè)嶄新的數(shù)據(jù)庫(kù)領(lǐng)域,由于map-Reduce處理框架高延時(shí)的缺陷, Google在2009年后推出的Dremel促使了實(shí)時(shí)計(jì)算系統(tǒng)的興起,以此引發(fā)大數(shù)據(jù)第二波技術(shù)浪潮,一些大數(shù)據(jù)公司紛紛推出自己的大數(shù)據(jù)查詢分析產(chǎn)品,如: Cloudera 開源了大數(shù)據(jù)查詢分析引擎 Impala 、 Hortonworks 開源了 Stinger 、 Fackbook 開源了 Presto 、UC Berkeley AMPLAB實(shí)驗(yàn)室開發(fā)了 Spark 計(jì)算框架,所有這些技術(shù)的數(shù)據(jù)來源均基于hdsf, 對(duì)于 hdsf 最基本的不外乎就是其讀寫操作
目錄:hdfs 名詞解釋hdsf 架構(gòu)NameNode(NN)Secondary NNhdfs 寫文件hdfs 讀文件block持續(xù)化結(jié)構(gòu)HDFS名詞解釋:Block: 在HDFS中,每個(gè)文件都是采用的分塊的方式存儲(chǔ),每個(gè)block放在不同的datanode上,每個(gè)block的標(biāo)識(shí)是一個(gè)三元組( block id, numBytes,generationStamp ),其中block id是具有唯一性,具體分配是由namenode節(jié)點(diǎn)設(shè)置,然后再由datanode上建立block文件,同時(shí)建立對(duì)應(yīng)block meta文件Packet: 在DFSclient與DataNode之間通信的過程中,發(fā)送和接受數(shù)據(jù)過程都是以一個(gè)packet為基礎(chǔ) 的方式進(jìn)行Chunk: 中文名字也可以稱為塊,但是為了與block區(qū)分,還是稱之為chunk。在DFSClient與DataNode之間通信的過程中,由于文件采用的是基于塊的方式來進(jìn)行的,但是在發(fā)送數(shù)據(jù)的過程中是以packet的方式來進(jìn)行的, 每個(gè)packet包含了多個(gè)chunk ,同時(shí)對(duì)于每個(gè)chunk進(jìn)行checksum計(jì)算,生成checksum bytes小結(jié):Packet結(jié)構(gòu)與定義: Packet分為兩類,一類是實(shí)際數(shù)據(jù)包,另一類是heatbeat包。一個(gè)Packet數(shù)據(jù)包的組成結(jié)構(gòu),如圖所示上圖中,一個(gè)Packet是由Header和Data兩部分組成,其中Header部分包含了一個(gè)Packet的概要屬性信息,如下表所示:Data部分是一個(gè)Packet的實(shí)際數(shù)據(jù)部分,主要包括一個(gè)4字節(jié)校驗(yàn)和(Checksum)與一個(gè)Chunk部分,Chunk部分最大為512字節(jié)在構(gòu)建一個(gè)Packet的過程中,首先將字節(jié)流數(shù)據(jù)寫入一個(gè)buffer緩沖區(qū)中,也就是從偏移量為25的位置(checksumStart)開始寫Packet數(shù)據(jù)Chunk的Checksum部分,從偏移量為533的位置(dataStart)開始寫Packet數(shù)據(jù)的Chunk Data部分,直到一個(gè)Packet創(chuàng)建完成為止。當(dāng)寫一個(gè)文件的最后一個(gè)Block的最后一個(gè)Packet時(shí),如果一個(gè)Packet的大小未能達(dá)到最大長(zhǎng)度,也就是上圖對(duì)應(yīng)的緩沖區(qū)中,Checksum與Chunk Data之間還保留了一段未被寫過的緩沖區(qū)位置,在發(fā)送這個(gè)Packet之前,會(huì)檢查Chunksum與Chunk Data之間的緩沖區(qū)是否為空白緩沖區(qū)(gap),如果有則將Chunk Data部分向前移動(dòng),使得Chunk Data 1與Chunk Checksum N相鄰,然后才會(huì)被發(fā)送到DataNode節(jié)點(diǎn)hdsf架構(gòu):hdfs的構(gòu)架圖網(wǎng)上一堆,抓了一張表述比較清楚的圖如下, 主要包含因類角色:Client、NameNode、SecondayNameNode、DataNodeHDFS Client: 系統(tǒng)使用者,調(diào)用HDFS API操作文件;與 NN交互獲取文件元數(shù)據(jù) ;與DN交互進(jìn)行數(shù)據(jù)讀寫, 注意: 寫數(shù)據(jù)時(shí)文件 切分由Client完成 Namenode: Master節(jié)點(diǎn)(也稱元數(shù)據(jù)節(jié)點(diǎn)),是系統(tǒng)唯一的管理者。負(fù)責(zé)元數(shù)據(jù)的管理( 名稱空間和數(shù)據(jù)塊映射信息 );配置 副本策略 ;處理客戶端請(qǐng)求Datanode: 數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)(也稱Slave節(jié)點(diǎn)), 存儲(chǔ)實(shí)際的數(shù)據(jù);執(zhí)行 數(shù)據(jù)塊的讀寫;匯報(bào)存儲(chǔ)信息給NNSecondary NameNode: 小弟角色,分擔(dān)大哥namenode的工作量;是NameNode的冷備份; 合并fsimage和fsedits然后再發(fā)給namenode, 注意: 在hadoop 2.x 版本,當(dāng)啟用 hdfs ha 時(shí),將沒有這一角色。(詳見第二單)解釋說明:hdfs構(gòu)架原則:NameNode:NameNode是整個(gè)文件系統(tǒng)的管理節(jié)點(diǎn),也是HDFS中最復(fù)雜的一個(gè)實(shí)體,它維護(hù)著HDFS文件系統(tǒng)中最重要的兩個(gè)關(guān)系:第一個(gè)關(guān)系即目錄樹、元數(shù)據(jù)和數(shù)據(jù)塊的索引信息會(huì) 持久化到物理存儲(chǔ) 中,實(shí)現(xiàn)是保存在命名空間的鏡像 fsimage 和編輯 日志edits 中, 注意: 在fsimage中, 并沒有記錄每一個(gè)block對(duì)應(yīng)到哪幾個(gè)Datanodes的對(duì)應(yīng)表信息第二個(gè)關(guān)系是在NameNode啟動(dòng)后,每個(gè)Datanode對(duì)本地磁盤進(jìn)行掃描,將 本Datanode上保存的block信息匯報(bào)給Namenode ,Namenode在接收到每個(gè)Datanode的塊信息匯報(bào)后,將接收到的塊信息,以及其所在的Datanode信息等保存在內(nèi)存中。HDFS就是通過這種塊信息匯報(bào)的方式來 完成 block -> Datanodes list的對(duì)應(yīng)表構(gòu)建fsimage 記錄了自最后一次檢查點(diǎn)之前HDFS文件系統(tǒng)中所有目錄和文件的序列化信息;edits 是元數(shù)據(jù)操作日志(記錄每次保存fsimage之后到下次保存之間的所有hdfs操作)在NameNode啟動(dòng)時(shí)候,會(huì)先將fsimage中的文件系統(tǒng)元數(shù)據(jù)信息 加載到內(nèi)存 ,然后根據(jù)eidts中的記錄將內(nèi)存中的元數(shù)據(jù) 同步至最新狀態(tài), 將這個(gè)新版本的 FsImage 從內(nèi)存中保存到本地磁盤上,然后刪除 舊的 Editlog,這個(gè)過程稱為一個(gè) 檢查 點(diǎn) (checkpoint), 多長(zhǎng)時(shí)間做一次 checkpoint?( 見第四章 參數(shù)配置 ) checkpoint 能手工觸發(fā)嗎? 驗(yàn)證重啟hdfs服務(wù)后editlog沒刪除呢?類似于 據(jù)庫(kù)中的檢查點(diǎn),為了避免edits日志過大,在Hadoop1.X中,SecondaryNameNode會(huì)按照時(shí)間閾值(比如24小時(shí))或者edits大小閾值(比如1G),周期性的將fsimage和edits的合并,然后將最新的fsimage推送給NameNode。而在Hadoop2.X中,這個(gè)動(dòng)作是由Standby NameNode來完成 .由此可看出,這兩個(gè)文件一旦損壞或丟失,將導(dǎo)致整個(gè)HDFS文件系統(tǒng)不可用,在HDP2.4安裝(五):集群及組件安裝 集 群安裝過程中,hdfs 默認(rèn)的只能選擇一個(gè)NN,是否意味著 NN存在單點(diǎn)呢?,2.X版本默認(rèn)block的大小是 128M (見第四章參數(shù)配置)Client將FileA按64M分塊。分成兩塊,block1和Block2;Client向nameNode發(fā)送寫數(shù)據(jù)請(qǐng)求,如圖藍(lán)色虛線①------>NameNode節(jié)點(diǎn),記錄block信息。并返回可用的DataNode ( NameNode按什么規(guī)則返回DataNode? 參見第三單 hadoop機(jī)架感知 ),如粉色虛線②--------->Block1: host2,host1,host3Block2: host7,host8,host4client向DataNode發(fā)送block1;發(fā)送過程是以流式寫入,流式寫入過程如下:將64M的block1按64k的packet劃分然后將第一個(gè)packet發(fā)送給host2host2接收完后,將第一個(gè)packet發(fā)送給host1,同時(shí)client想host2發(fā)送第二個(gè)packethost1接收完第一個(gè)packet后,發(fā)送給host3,同時(shí)接收host2發(fā)來的第二個(gè)packet以此類推,如圖紅線實(shí)線所示,直到將block1發(fā)送完畢host2,host1,host3向NameNode,host2向Client發(fā)送通知,說“消息發(fā)送完了”。如圖粉紅顏色實(shí)線所示client收到host2發(fā)來的消息后,向namenode發(fā)送消息,說我寫完了。這樣就真完成了。如圖黃色粗實(shí)線發(fā)送完block1后,再向host7,host8,host4發(fā)送block2,如圖藍(lán)色實(shí)線所示 說明:小結(jié):寫入的過程,按hdsf默認(rèn)設(shè)置, 1T文件,我們需要3T的存儲(chǔ) , 3T的網(wǎng)絡(luò)流量在執(zhí)行讀或?qū)懙倪^程中,NameNode和DataNode通過HeartBeat進(jìn)行保存通信,確定DataNode活著。如果發(fā)現(xiàn)DataNode死掉了,就將死掉的DataNode上的數(shù)據(jù),放到其他節(jié)點(diǎn)去。讀取時(shí),要讀其他節(jié)點(diǎn)去掛掉一個(gè)節(jié)點(diǎn),沒關(guān)系,還有其他節(jié)點(diǎn)可以備份;甚至,掛掉某一個(gè)機(jī)架,也沒關(guān)系;其他機(jī)架上,也有備份hdfs讀文件: 讀到文件示意圖如下:客戶端通過調(diào)用FileSystem對(duì)象的open()方法來打開希望讀取的文件,對(duì)于HDFS來說,這個(gè)對(duì)象時(shí)分布文件系統(tǒng)的一個(gè)實(shí)例;DistributedFileSystem通過使用RPC來調(diào)用NameNode以確定文件起始?jí)K的位置,同一Block按照重復(fù)數(shù)會(huì)返回多個(gè)位置,這些位置按照 Hadoop集群拓?fù)浣Y(jié)構(gòu)排序,距離客戶端近的排在前 面 ( 詳見第三章 )前兩步會(huì)返回一個(gè)FSDataInputStream對(duì)象,該對(duì)象會(huì)被封裝成DFSInputStream對(duì)象,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流,客戶端對(duì)這個(gè)輸入流調(diào)用read()方法存儲(chǔ)著文件起始?jí)K的DataNode地址的DFSInputStream隨即連接距離最近的DataNode,通過對(duì)數(shù)據(jù)流反復(fù)調(diào)用read()方法,將數(shù)據(jù)從DataNode傳輸?shù)娇蛻舳说竭_(dá)塊的末端時(shí),DFSInputStream會(huì)關(guān)閉與該DataNode的連接,然后尋找下一個(gè)塊的最佳DataNode,這些操作對(duì)客戶端來說是透明的,客戶端的角度看來只是讀一個(gè)持續(xù)不斷的流一旦客戶端完成讀取,就對(duì)FSDataInputStream調(diào)用close()方法關(guān)閉文件讀取block持續(xù)化結(jié)構(gòu): DataNode節(jié)點(diǎn)上一個(gè)Block持久化到磁盤上的物理存儲(chǔ)結(jié)構(gòu),如下圖所示:每個(gè)Block文件(如上圖中blk_1084013198文件)都對(duì)應(yīng)一個(gè)meta文件(如上圖中blk_1084013198_10273532.meta文件), Block文件是一個(gè)一個(gè)Chunk的二進(jìn)制數(shù)據(jù) (每個(gè)Chunk的大小是512字節(jié)),而meta文件是與 每一個(gè)Chunk對(duì)應(yīng)的Checksum數(shù)據(jù) ,是序列化形式存儲(chǔ)Loading...