溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

好程序員大數(shù)據(jù)學(xué)習(xí)路線分享HDFS讀流程

發(fā)布時(shí)間:2020-07-10 06:59:59 來源:網(wǎng)絡(luò) 閱讀:241 作者:wx5d42865f47214 欄目:大數(shù)據(jù)

  1.客戶端或者用戶通過調(diào)用FileSystem對象的Open()方法打開需要讀取的文件,這時(shí)就是HDSF分布式系統(tǒng)所獲取的一個(gè)對象
  2.FileSystem通過遠(yuǎn)程協(xié)議調(diào)用NameNode確定文件的前幾個(gè)Block的位置,對于每一個(gè)block,NameNode返回一個(gè)含有Block的元數(shù)據(jù)信息,接下來DataNode按照上面定義的距離(offSet偏移量)進(jìn)行排序,如果Client本身即是一個(gè)DataNode,那么就會優(yōu)先從本地DataNode節(jié)點(diǎn)讀取數(shù)據(jù). HDFS完成上面的工作之后返回一個(gè)FSDatalnputStream給客戶端,讓其從FSDatalnputStream中讀取。FSDatalnputStream包裝了一個(gè)類DFSInputStream,用來管理DataNode和NameNode的I/O操作。
  3.NameNode向客戶端返回一個(gè)包含了數(shù)據(jù)信息的地址,客戶端根據(jù)地址創(chuàng)建一個(gè)FSDDatalnputStream的對象開始進(jìn)行數(shù)據(jù)的讀取
  4.FSDatalnputStream根據(jù)開始存的前幾個(gè)Block的DataNode地址,連接到最近DataNode上對數(shù)據(jù)開始從頭讀取,客戶端會反復(fù)調(diào)用read()方法,以流的形式讀取DataNode這中的數(shù)據(jù)
  5.當(dāng)讀取到Block的結(jié)尾的時(shí)候,F(xiàn)SDatalnputStream會關(guān)閉當(dāng)前DataNode的連接然后查找能否讀取下一個(gè)Block的DataNode位置信息,此時(shí)給客戶端產(chǎn)生的感覺就是數(shù)據(jù)是連續(xù)讀取的,也就說在讀取的時(shí)候開始查找下一個(gè)塊所在的地址。讀取完成時(shí)需要使用close()方法關(guān)閉FSDatalnputStream
  HDFS寫流程:
  1.Client通過調(diào)用FileSystem類的Create()方法請求創(chuàng)建文件
  2.FileSystem通過對NameNode發(fā)出遠(yuǎn)程請求,在NameNode里面創(chuàng)建一個(gè)新的文件,但是此時(shí)并不關(guān)聯(lián)任何塊,NameNode進(jìn)行很多檢查來保證不存在要?jiǎng)?chuàng)建文件已經(jīng)在系統(tǒng)中,同時(shí)檢查是否有相當(dāng)權(quán)限來創(chuàng)建文件,如果這些都檢查完了,那么NamdNode會記錄下這個(gè)新文件的信息。FileSystem返回一個(gè)FSDatalnputStream給客戶端用來寫入數(shù)據(jù),F(xiàn)SDatalnputStream將包裝一個(gè)DFsOutputStream用于對DataNode和NameNode的通信,一旦文件創(chuàng)建失敗,會給客戶端返回一個(gè)l0Exception表示文件創(chuàng)建失敗并停止任務(wù)
  3.客戶端開始寫數(shù)據(jù)FSDatalnputStream把要寫的數(shù)據(jù)分成包的形式將其寫入到中間隊(duì)列中,其中的數(shù)據(jù)有DataStramer來讀取,DataStreamer的職責(zé)就是讓NameNode分配一個(gè)新的塊通過查找對應(yīng)DataNode來存數(shù)據(jù),來存儲的數(shù)據(jù)會被備份出一個(gè)副本,存儲到其他節(jié)點(diǎn)完成數(shù)據(jù)寫入即可
  4.FSDatalnputStream維護(hù)了一個(gè)內(nèi)部關(guān)于packets的隊(duì)列,里面存放著等待被DataNode確認(rèn)的信息,一旦數(shù)據(jù)信息寫入DataNode成功后,就會從隊(duì)列中移除
  5.當(dāng)數(shù)據(jù)完成寫入之后客戶會調(diào)用close方法,通過NameNode完成寫入之前通過一個(gè)方法flush將殘留數(shù)據(jù)一起寫進(jìn)去。和NameNode確定寫入的位置信息,并返回成功狀態(tài)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI