這篇文章給大家分享的是有關如何解析HDFS的寫文件流程的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
文件是如何寫入HDFS的 ?
下面我們來先看看下面的“寫”流程圖:
假如我們有一個文件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
整個寫流程如下:
第一步,客戶端調用DistributedFileSystem的create()方法,開始創(chuàng)建新文件:DistributedFileSystem創(chuàng)建DFSOutputStream,產(chǎn)生一個RPC調用,讓NameNode在文件系統(tǒng)的命名空間中創(chuàng)建這一新文件;
第二步,NameNode接收到用戶的寫文件的RPC請求后,誰偶先要執(zhí)行各種檢查,如客戶是否有相關的創(chuàng)佳權限和該文件是否已存在等,檢查都通過后才會創(chuàng)建一個新文件,并將操作記錄到編輯日志,然后DistributedFileSystem會將DFSOutputStream對象包裝在FSDataOutStream實例中,返回客戶端;否則文件創(chuàng)建失敗并且給客戶端拋IOException。
第三步,客戶端開始寫文件:DFSOutputStream會將文件分割成packets數(shù)據(jù)包,然后將這些packets寫到其內(nèi)部的一個叫做data queue(數(shù)據(jù)隊列)。data queue會向NameNode節(jié)點請求適合存儲數(shù)據(jù)副本的DataNode節(jié)點的列表,然后這些DataNode之前生成一個Pipeline數(shù)據(jù)流管道,我們假設副本集參數(shù)被設置為3,那么這個數(shù)據(jù)流管道中就有三個DataNode節(jié)點。
第四步,首先DFSOutputStream會將packets向Pipeline數(shù)據(jù)流管道中的第一個DataNode節(jié)點寫數(shù)據(jù),第一個DataNode接收packets然后把packets寫向Pipeline中的第二個節(jié)點,同理,第二個節(jié)點保存接收到的數(shù)據(jù)然后將數(shù)據(jù)寫向Pipeline中的第三個DataNode節(jié)點。
第五步,DFSOutputStream內(nèi)部同樣維護另外一個內(nèi)部的寫數(shù)據(jù)確認隊列——ack queue。當Pipeline中的第三個DataNode節(jié)點將packets成功保存后,該節(jié)點回向第二個DataNode返回一個確認數(shù)據(jù)寫成功的信息,第二個DataNode接收到該確認信息后在當前節(jié)點數(shù)據(jù)寫成功后也會向Pipeline中第一個DataNode節(jié)點發(fā)送一個確認數(shù)據(jù)寫成功的信息,然后第一個節(jié)點在收到該信息后如果該節(jié)點的數(shù)據(jù)也寫成功后,會將packets從ack queue中將數(shù)據(jù)刪除。
在寫數(shù)據(jù)的過程中,如果Pipeline數(shù)據(jù)流管道中的一個DataNode節(jié)點寫失敗了會發(fā)生什問題、需要做哪些內(nèi)部處理呢?如果這種情況發(fā)生,那么就會執(zhí)行一些操作:
首先,Pipeline數(shù)據(jù)流管道會被關閉,ack queue中的packets會被添加到data queue的前面以確保不會發(fā)生packets數(shù)據(jù)包的丟失,為存儲在另一正常dataname的當前數(shù)據(jù)指定一個新的標識,并將該標識傳送給namenode,以便故障datanode在恢復后可以刪除存儲的部分數(shù)據(jù)塊;
接著,在正常的DataNode節(jié)點上的以保存好的block的ID版本會升級——這樣發(fā)生故障的DataNode節(jié)點上的block數(shù)據(jù)會在節(jié)點恢復正常后被刪除,失效節(jié)點也會被從Pipeline中刪除;
最后,剩下的數(shù)據(jù)會被寫入到Pipeline數(shù)據(jù)流管道中的其他兩個節(jié)點中。
如果Pipeline中的多個節(jié)點在寫數(shù)據(jù)是發(fā)生失敗,那么只要寫成功的block的數(shù)量達到dfs.replication.min(默認為1),那么就任務是寫成功的,然后NameNode后通過一步的方式將block復制到其他節(jié)點,最后事數(shù)據(jù)副本達到dfs.replication參數(shù)配置的個數(shù)。
第六步,,完成寫操作后,客戶端調用close()關閉寫操作,刷新數(shù)據(jù);
第七步,,在數(shù)據(jù)刷新完后NameNode后關閉寫操作流。到此,整個寫操作完成。
感謝各位的閱讀!關于“如何解析HDFS的寫文件流程”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
標題名稱:如何解析HDFS的寫文件流程-創(chuàng)新互聯(lián)
分享URL:http://jinyejixie.com/article0/dhdiio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、App設計、企業(yè)建站、營銷型網(wǎng)站建設、用戶體驗、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容