您好,登錄后才能下訂單哦!
這篇文章主要講解了“Hadoop的DataNode是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Hadoop的DataNode是什么”吧!
類圖如下:
publipublic class DataNode extends Configured
implements InterDatanodeProtocol, ClientDatanodeProtocol, FSConsta nts, Runnable
上面給出了DataNode 的繼承關系,我們發現,DataNode 實現了兩個通信接口,其中ClientDatanodeProtocol 是用于和Client
交互的,InterDatanodeProtocol,就是我們前面提到的DataNode 間的通信接口。ipcServer(類圖的左下方)是DataNode 的
一個成員變量,它啟動了一個IPC 服務,這樣,DataNode 就能提供ClientDatanodeProtocol 和InterDatanodeProtocol 的能
力了。
我們從main 函數開始吧。這個函數很簡單,調用了createDataNode 的方法,然后就等著DataNode 的線程結束。createDataNode
首先調用instantiateDataNode 初始化DataNode,然后執行runDatanodeDaemon。runDatanodeDaemon 會向NameNode 注冊,如
果成功,才啟動DataNode 線程,DataNode 就開始干活了。
初始化DataNode 的方法instantiateDataNode 會讀取DataNode 需要的配置文件,同時讀取配置的storage 目錄(可能有多個,
看storage 的討論部分),然后把這兩參數送到makeInstance 中,makeInstance 會先檢查目錄(存在,是目錄,可讀,可寫),
然后調用:
new DataNode(conf, dirs);
接下來控制流就到了構造函數上。構造函數調用startDataNode,完成和DataNode 相關的初始化工作(注意,DataNode 工作線
程不在這個函數里啟動)。首先是初始化一堆的配置參數,什么NameNode 地址,socket 參數等等。然后,向NameNode 請求配
置信息(DatanodeProtocol.versionRequest),并檢查返回的NamespaceInfo 和本地的版本是否一致。
正常情況的下一步是檢查文件系統的狀態并做必要的恢復,初始化FSDataset(到這個時候,上面圖中storage 和data 成員變
量已經初始化)。
然后,找一個端口并創建DataXceiverServer(run 方法里啟動),創建DataBlockScanner(根據需要在offerService 中啟動,
只啟動一次),創建DataNode 上的HttpServer,啟動ipcServer。這樣就結束了DataNode 相關的初始化工作。
在啟動DataNode 工作線程前,DataNode 需要向NameNode 注冊。注冊信息在初始化的時候已經構造完畢,包括DataXceiverServer
端口,ipcServer 端口,文件布局版本號等重要信息。注冊成功后就可以啟動DataNode 線程。
DataNode 的run 方法,循環里有兩種選擇,升級(暫時不討論)/正常工作。我們來看正常工作的offerService 方法。offerService
也是個循環,在循環里,offerService 會定時向NameNode 發送心跳,報告系統中Block 狀態的變化,報告DataNode 現在管理
的Block 狀態。發送心跳和Block 狀態報告時,NameNode 會返回一些命令,DataNode 將執行這些命令。
心跳的處理比較簡單,以heartBeatInterval 間隔發送。
Block 狀態變化報告,會利用保存在receivedBlockList 和delHints 兩個列表中的信息。receivedBlockList 表明在這個
DataNode 成功創建的新的數據塊,而delHints,是可以刪除該數據塊的節點。如在DataXceiver 的replaceBlock 中,有調用:
datanode.notifyNamenodeReceivedBlock(block, sourceID)
這表明,DataNode 已經從sourceID 上接收了一個Block,sourceID 上對應的Block 可以刪除了(這個場景出現在當系統需要
做負載均衡時,Block 在DataNode 之間拷貝)。
Block 狀態變化報告通過NameNode.blockReceived 來報告。
Block 狀態報告也比較簡單,以blockReportInterval 間隔發送。
心跳和Block 狀態報告可以返回命令,這也是NameNode 先DataNode 發起請求的唯一方法。我們來看一下都有那些命令:
DNA_TRANSFER:拷貝數據塊到其他DataNode
DNA_INVALIDATE:刪除數據塊(簡單方法)
DNA_SHUTDOWN:關閉DataNode(簡單方法)
DNA_REGISTER:DataNode 重新注冊(簡單方法)
DNA_FINALIZE :提交升級(簡單方法)
DNA_RECOVERBLOCK:恢復數據塊
拷貝數據塊到其他DataNode 由transferBlocks 方法執行。注意,返回的命令可以包含多個數據塊,每一個數據塊可以包含多
個目標地址。transferBlocks 方法將為每一個Block 啟動一個DataTransfer 線程,用于傳輸數據。
DataTransfer 是一個DataNode 的內部類,它利用OP_WRITE_BLOCK 寫數據塊操作,發送數據到多個目標上面。
感謝各位的閱讀,以上就是“Hadoop的DataNode是什么”的內容了,經過本文的學習后,相信大家對Hadoop的DataNode是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。