溫馨提示×

溫馨提示×

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

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

如何解析HDFS的寫文件流程

發(fā)布時(shí)間:2021-12-09 11:40:34 來源:億速云 閱讀:93 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)如何解析HDFS的寫文件流程的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

文件是如何寫入HDFS的 ?

下面我們來先看看下面的“寫”流程圖: 
如何解析HDFS的寫文件流程

        假如我們有一個(gè)文件test.txt,想要把它放到Hadoop上,執(zhí)行如下命令:

引用


        # hadoop fs  -put  /usr/bigdata/dataset/input/20130706/test.txt   /opt/bigdata/hadoop/dataset/input/20130706  //或執(zhí)行下面的命令 
        # hadoop fs -copyFromLocal /usr/bigdata/dataset/input/20130706/test.txt  /opt/bigdata/hadoop/dataset/input/20130706        
       

        整個(gè)寫流程如下: 
        第一步,客戶端調(diào)用DistributedFileSystem的create()方法,開始創(chuàng)建新文件:DistributedFileSystem創(chuàng)建DFSOutputStream,產(chǎn)生一個(gè)RPC調(diào)用,讓NameNode在文件系統(tǒng)的命名空間中創(chuàng)建這一新文件; 
        第二步,NameNode接收到用戶的寫文件的RPC請求后,誰偶先要執(zhí)行各種檢查,如客戶是否有相關(guān)的創(chuàng)佳權(quán)限和該文件是否已存在等,檢查都通過后才會(huì)創(chuàng)建一個(gè)新文件,并將操作記錄到編輯日志,然后DistributedFileSystem會(huì)將DFSOutputStream對象包裝在FSDataOutStream實(shí)例中,返回客戶端;否則文件創(chuàng)建失敗并且給客戶端拋IOException。 
        第三步,客戶端開始寫文件:DFSOutputStream會(huì)將文件分割成packets數(shù)據(jù)包,然后將這些packets寫到其內(nèi)部的一個(gè)叫做data queue(數(shù)據(jù)隊(duì)列)。data queue會(huì)向NameNode節(jié)點(diǎn)請求適合存儲數(shù)據(jù)副本的DataNode節(jié)點(diǎn)的列表,然后這些DataNode之前生成一個(gè)Pipeline數(shù)據(jù)流管道,我們假設(shè)副本集參數(shù)被設(shè)置為3,那么這個(gè)數(shù)據(jù)流管道中就有三個(gè)DataNode節(jié)點(diǎn)。 
        第四步,首先DFSOutputStream會(huì)將packets向Pipeline數(shù)據(jù)流管道中的第一個(gè)DataNode節(jié)點(diǎn)寫數(shù)據(jù),第一個(gè)DataNode接收packets然后把packets寫向Pipeline中的第二個(gè)節(jié)點(diǎn),同理,第二個(gè)節(jié)點(diǎn)保存接收到的數(shù)據(jù)然后將數(shù)據(jù)寫向Pipeline中的第三個(gè)DataNode節(jié)點(diǎn)。 
        第五步,DFSOutputStream內(nèi)部同樣維護(hù)另外一個(gè)內(nèi)部的寫數(shù)據(jù)確認(rèn)隊(duì)列——ack queue。當(dāng)Pipeline中的第三個(gè)DataNode節(jié)點(diǎn)將packets成功保存后,該節(jié)點(diǎn)回向第二個(gè)DataNode返回一個(gè)確認(rèn)數(shù)據(jù)寫成功的信息,第二個(gè)DataNode接收到該確認(rèn)信息后在當(dāng)前節(jié)點(diǎn)數(shù)據(jù)寫成功后也會(huì)向Pipeline中第一個(gè)DataNode節(jié)點(diǎn)發(fā)送一個(gè)確認(rèn)數(shù)據(jù)寫成功的信息,然后第一個(gè)節(jié)點(diǎn)在收到該信息后如果該節(jié)點(diǎn)的數(shù)據(jù)也寫成功后,會(huì)將packets從ack queue中將數(shù)據(jù)刪除。 
        在寫數(shù)據(jù)的過程中,如果Pipeline數(shù)據(jù)流管道中的一個(gè)DataNode節(jié)點(diǎn)寫失敗了會(huì)發(fā)生什問題、需要做哪些內(nèi)部處理呢?如果這種情況發(fā)生,那么就會(huì)執(zhí)行一些操作: 
        首先,Pipeline數(shù)據(jù)流管道會(huì)被關(guān)閉,ack queue中的packets會(huì)被添加到data queue的前面以確保不會(huì)發(fā)生packets數(shù)據(jù)包的丟失,為存儲在另一正常dataname的當(dāng)前數(shù)據(jù)指定一個(gè)新的標(biāo)識,并將該標(biāo)識傳送給namenode,以便故障datanode在恢復(fù)后可以刪除存儲的部分?jǐn)?shù)據(jù)塊; 
        接著,在正常的DataNode節(jié)點(diǎn)上的以保存好的block的ID版本會(huì)升級——這樣發(fā)生故障的DataNode節(jié)點(diǎn)上的block數(shù)據(jù)會(huì)在節(jié)點(diǎn)恢復(fù)正常后被刪除,失效節(jié)點(diǎn)也會(huì)被從Pipeline中刪除; 
        最后,剩下的數(shù)據(jù)會(huì)被寫入到Pipeline數(shù)據(jù)流管道中的其他兩個(gè)節(jié)點(diǎn)中。 
        如果Pipeline中的多個(gè)節(jié)點(diǎn)在寫數(shù)據(jù)是發(fā)生失敗,那么只要寫成功的block的數(shù)量達(dá)到dfs.replication.min(默認(rèn)為1),那么就任務(wù)是寫成功的,然后NameNode后通過一步的方式將block復(fù)制到其他節(jié)點(diǎn),最后事數(shù)據(jù)副本達(dá)到dfs.replication參數(shù)配置的個(gè)數(shù)。 
        第六步,,完成寫操作后,客戶端調(diào)用close()關(guān)閉寫操作,刷新數(shù)據(jù); 
        第七步,,在數(shù)據(jù)刷新完后NameNode后關(guān)閉寫操作流。到此,整個(gè)寫操作完成。      

感謝各位的閱讀!關(guān)于“如何解析HDFS的寫文件流程”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向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