datanode无法启动_Hadoop DataNode启动和初始化过程
簡介
我們先看DataNode的doc文檔的介紹,DataNode是一個類,用于存儲一組塊,用于DFS部署。單個部署可以有一個或多個DataNode。每個DataNode通信定期與單個NameNode進行通信。它還可以與客戶端和其他的DataNodes通信。
DataNode存儲一系列命名的塊。DataNode允許客戶端代碼讀取這些塊,或者寫新的塊數據。DataNode也可以響應于以下指令從其NameNode中刪除區塊或將區塊復制到/從其他的DataNodes。
DataNodes的一生都在無休止的循環中度過,詢問NameNode需要做哪些事情。NameNode不能直接連接到DataNode;NameNode只是從DataNode調用的函數中返回值。
DataNodes維護一個開放的 server socket,以便客戶端代碼 ?或其他數據節點可以讀/寫數據。讀取/寫入數據的主機/端口為匯報給NameNode,然后將該服務器的向客戶或其他可能感興趣的數據節點提供信息。
概括如下:1. 一個集群里面可以有好很多個datanode ,這些datanode就是用來存儲數據的。2. datanode啟動了以后會周期性的與namenode進行通信(心跳 、 回報塊)。3. namenode不能直接操作datanode , 而是通信心跳返回指令的方式去操作datanode。4. datanode啟動了以后會開放一個socket發服務(RPC),等待調用。
源碼解析
啟動datanode,主要是要完成3件事:
1、如何完成存儲。
2、如何與namenode進行通信,這個通過IPC 心跳連接實現。此外還有和客戶端 其它datanode之間的信息交換。
3、完成和客戶端還有其它節點的大規模通信,這個需要直接通過socket 協議實現。
本方法干兩件事:
1、打印datanode啟動日志,一些基本信息日志(域名、參數、版本、jdk環境等)
2、創建datanode
3、線程掛起
createDataNode方法主要兩件事:1、實例化一個DataNode2、運行datanode的守護線程
instantiateDataNode方法的作用
1、拿到數據存儲路徑(dfs.datanode.data.dir)
2、使用三個參數(數據存儲路徑、配置文件、SecureResources)去實例化Datanode
makeInstance方法主要的作用:
1、獲取客戶端校驗類。
2、拿到存儲數據目錄的權限。3、傳入磁盤檢測對象進行磁盤檢測,并返回可用的目錄列表。4、創建datanode對象。
checkStorageLocations方法主要是利用磁盤檢測對象進行磁盤目錄的檢測 , 返回可用磁盤目錄列表
1、聲明一個集合,用來存儲可用目錄列表
2、遍歷數據目錄,注意這里就是串行的方式
3、利用磁盤檢測對象進行磁盤目錄的檢測:校驗目錄的讀寫執行權限 ,如果目錄不存在,則創建目錄并給予700權限
4、檢測完畢沒有拋出異常,則說明目錄可用,加入到可用列表
5、如果出現IO異常,說明此磁盤目錄不可用,加入到目錄中
6、如果可用目錄數量為0,表明所有的目錄都不可用
7、最終,返回可用的磁盤目錄列表
初始化方法,這個構造方法主要做了這幾件事:
1、根據configuration,初始化一些成員變量
2、給出一個配置、一個dataDirs數組和一個Namenode代理,創建DataNode。
3、啟動datanode
startDataNode方法啟動datanode,這個方法很重要。
?startDataNode是最關鍵的方法,非常非常重要
1、實例化管理磁盤目錄的DataStorage
2、啟動http和RPC
3、datanode向namenode注冊和心跳
4、通過心跳匯報塊
dfs.datanode.max.locked.memory: DataNode在內存中緩存副本塊的最大內存數默認參數是0,表示不緩存副本塊到內存;而且本地庫還需要支持,如果不支持,也無法使用
DataNode最重要的功能就是管理磁盤上存儲的數據塊。DataNode將這個管理功能切分為2個部分:
1.?DataStorage:管理與組織磁盤存儲目錄,如current,previous,detach,tmp等,在Data Node數據目錄,你可以看到一些current tmp,rbw或者finalized文件夾 2. FsDatasetImpl:管理組織數據塊和元數據文件
DataXceiverServer是數據節點DataNode上一個用于接收數據讀寫請求的后臺工作線程,為每個數據讀寫請求創建一個單獨的線程去處理,DataNode#runDatanodeDaemon()中啟動,后面再詳細分析這個。
1. 創建構造DataXceiverServer需要的TcpPeerServer實例tcpPeerServer,它內部封裝了ServerSocket,是DataXceiverServer功能實現的最主要依托;2. 從tcpPeerServer中獲取Socket地址InetSocketAddress,賦值給DataNode成員變量streamingAddr3. 然后構造DataXceiverServer實例xserver,傳入tcpPeerServer;4. 構造dataXceiverServer守護線程,并將xserver加入之前創建的線程組threadGroup;5. 將線程組里的所有線程設置為設置為守護線程,方便虛擬機退出時自動銷毀。
initIpcServer初始化IpcServer(RPC通信),DataNode#runDatanodeDaemon()中啟動。用來啟動datanode上的rpc服務,主要包括兩個服務:ClientDatanodeProtocolPB和InterDatanodeProtocolPB。
BlockPoolManager抽象了datanode提供的數據塊存儲服務,每個DataNode上都有一個BlockPoolManager實例
總結
這篇主要是DadaNode的啟動和初始化的過程,可以看到還是比較復雜的,這篇文章只是寫了一些大概的流程,一些細節還需要慢慢的去了解,每天學習一點點,持續行動,日拱一卒無有盡,功不唐捐終入海。
總結
以上是生活随笔為你收集整理的datanode无法启动_Hadoop DataNode启动和初始化过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曝三星 Galaxy S23 Ultra
- 下一篇: mac地址修改_如何修改手机MAC地址?