HDFS寫數據的過程

HDFS寫數據:

         客戶端(rpc調用)鏈接上namenode

         客戶端有一個文件aaa.avi,要上傳:

                   1、先要向namenode請求上傳文件(namenode要先查看自己的內部賬本,(哪個目錄下面有什麼文件)這個賬本就是元數據(相當於數據庫),看看是否有這個 aaa.avi,如果沒有就返回namenode給客戶端,說你可以上傳。

                   2、客戶端要再發一次請求,調用元數據上面的方法(函數),說客戶端要上傳一個block這個block是aaa.avi的部分文件,請namenode分客戶端幾個datanode, namenode返回客戶端幾個datanode。

                   3、namenode給客戶端返回幾個datanode(datanode列表dn1.dn2.dn3.dn4)考慮的因素有:空間和距離(數據到datanode的跳轉)第一次選擇datanode的選擇會選擇和 客戶端最近的,第二個會選擇跨機架的datanode,因爲安全,增加可靠性,第三個會在第一個副本同一個機架上;還有個機架感知有興趣可以看看。返回datanode的 數量是和客戶端的block有關。

                   4、開始傳數據,傳之前,客戶端需要首先建一個和dn1的流(爲了和目標機器建立一個socket通道)然後客戶端從這個socket通道里面拿到一個流,客戶端將本地這個 文件流,往與dn1的通道里面去寫。(先向dn1發送rpc請求。nio)建立請求傳輸通道nio,給dn1傳的時候,dn1會告訴dn2,dn3,dn4,讓後面的幾個準備接受數 據,然後dn4,dn3,dn2響應前面的datanode,後面幾個dn都沒問題之後,dn1在應答客戶端。

                   5、開始傳輸數據,用戶先讀取數據,把數據從文件channel(客戶端內部實現的),讀取到socketchannel中(客戶端與dn1的鏈接的channel),然後再寫入dn1,(剛 開始是小數據包packat,64k,然後dn1要先校驗,然後在寫)寫完一個packat之後,交給通道,通道交給dn2,或者dn3用byteBuf存儲,大小夠了64k之後,再往 dn2,3,4開始寫,這樣副本就有了。(packat裏面有一個trunk,上傳以packat爲單位,檢驗以trunk爲單位,一個trank512個字節)

                   6、一個block傳完以後,客戶端會再向namenode去申請datanode,重複上面的1-4步驟。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章