4. 申請block
下面我們應(yīng)該再去從dataQueue
中讀取packet
了正卧。而從dataQueue
讀取packet
是Datastream
線程,所以我們直接看它的run方法
-
Datastream.run()
普筹,代碼比較多狮鸭,分開看看。
1.1 這里看while的判斷條件性昭,如果dataQueue
的size=0竿开,那么就等待
image
1.21
:錯誤判斷捎琐,pass;2
:空判斷pass;3
:在這里獲取了第一個packet
;
image
1.3 這里可注釋,就是從namenode上獲取block叉庐。其實還有管道舒帮。nextBlockOutputStream()
這里是獲取block和管道。
image -
Datastream.nextBlockOutputStream()
,這里有個方法名字很怪locateFollowingBlock()
陡叠,但是他就是申請block的方法玩郊。
image -
Datastream.locateFollowingBlock()
,看到了熟悉的RPC調(diào)用。那么接下來該去NanmeNodeRpcServer.addBlock()
了匾竿。
image -
NanmeNodeRpcServer.addBlock()
,又是調(diào)用了FSNamesystem
的一個方法瓦宜。那么我們跟進(jìn)FSNamesystem.getAdditionalBlock()
吧。
image -
FSNamesystem.getAdditionalBlock()
,這的代碼比較多岭妖,還好有注釋临庇。
5.1 看注釋,這里就是為新的block選擇目標(biāo)host.
image
5.21
:創(chuàng)建個新的block
;2
:然后把創(chuàng)建的這個block
信息添加到fsimage
中并持久化(元數(shù)據(jù)管理的內(nèi)容);3
:最后把block
和5.1中獲得的主機地址一起封裝到LocatedBlock
對象里.然后返回LocatedBlock
昵慌。
image
這些就是申請一個block了假夺。畫個圖簡單總結(jié)下:
image