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