您好,登錄后才能下訂單哦!
這篇文章主要講解了“Hadoop中DataNode的啟動過程介紹”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Hadoop中DataNode的啟動過程介紹”吧!
DataNode同NameNode都一樣,是一個java進程,所以從main方法開始,看代碼:
public class DataNode extends Configured implements InterDatanodeProtocol, ClientDatanodeProtocol, DataNodeMXBean { public static void main(String args[]) { secureMain(args, null); } public static void secureMain(String args[], SecureResources resources) { DataNode datanode = createDataNode(args, null, resources); } public static DataNode createDataNode(String args[], Configuration conf, SecureResources resources) throws IOException { DataNode dn = instantiateDataNode(args, conf, resources); if (dn != null) { dn.runDatanodeDaemon(); } return dn; } public static DataNode instantiateDataNode(String args [], Configuration conf, SecureResources resources) throws IOException { return makeInstance(dataLocations, conf, resources); } static DataNode makeInstance(Collection<StorageLocation> dataDirs, Configuration conf, SecureResources resources) throws IOException { return new DataNode(conf, locations, resources); } DataNode(final Configuration conf, final List<StorageLocation> dataDirs, final SecureResources resources) throws IOException { startDataNode(conf, dataDirs, resources); } public void runDatanodeDaemon() throws IOException { blockPoolManager.startAll(); // start dataXceiveServer dataXceiverServer.start(); if (localDataXceiverServer != null) { localDataXceiverServer.start(); } ipcServer.start(); startPlugins(conf); } }
上面的代碼跟蹤不難,但是最終需要注意兩個方法:startDataNode和runDatanodeDaemon方法,前面一個用于初始化DataNode,后面一個啟動DataNode的后臺線程,這些線程是會伴隨DataNode進程一直跑著的。接著,讓我們重點研究下方法startDataNode,看代碼:
void startDataNode(Configuration conf, List<StorageLocation> dataDirs, // DatanodeProtocol namenode, SecureResources resources ) throws IOException { storage = new DataStorage(); // global DN settings registerMXBean(); initDataXceiver(conf); startInfoServer(conf); pauseMonitor = new JvmPauseMonitor(conf); pauseMonitor.start(); initIpcServer(conf); blockPoolManager = new BlockPoolManager(this); blockPoolManager.refreshNamenodes(conf); }
registerMXBean這個方法可以忽略,用來注冊MBean信息;initDataXceiver這個方法應該來說還是比較重要,實例化的dataXceiverServer用來接受客戶端或者其他datanode的數據接收或者發送請求;startInfoServer方法用來啟動datanode的web服務器;pauseMonitor用來監控jvm是否有停頓;initIpcServer方法比較重要,用來啟動datanode上的rpc服務,主要包括兩個服務:ClientDatanodeProtocolPB和InterDatanodeProtocolPB。
然后屬于DataNode的重點來了,blockPoolManager對象的實例化,注意一點,2.4.1 這個版本的hadoop已經支持了hadoop Federation的特性,而blockPooolManager就是支撐這個特性來的。現在讓我們來看看他里面的東西。還是先上代碼吧。
class BlockPoolManager { BlockPoolManager(DataNode dn) { this.dn = dn; } void refreshNamenodes(Configuration conf) throws IOException { synchronized (refreshNamenodesLock) { doRefreshNamenodes(newAddressMap); } } private void doRefreshNamenodes( Map<String, Map<String, InetSocketAddress>> addrMap) throws IOException { synchronized (this) { startAll(); } } synchronized void startAll() throws IOException { for (BPOfferService bpos : offerServices) { bpos.start(); } } } class BPOfferService { void start() { for (BPServiceActor actor : bpServices) { actor.start(); } } } class BPServiceActor implements Runnable { void start() { if ((bpThread != null) && (bpThread.isAlive())) { //Thread is started already return; } bpThread = new Thread(this, formatThreadName()); bpThread.setDaemon(true); // needed for JUnit testing bpThread.start(); } public void run() { while (true) { connectToNNAndHandshake(); break; } while (shouldRun()) { offerService(); } } private void offerService() throws Exception { while (shouldRun()) { HeartbeatResponse resp = sendHeartBeat(); List<DatanodeCommand> cmds = blockReport(); } } }
順著代碼往下走,整個思路都會比較清晰了,BPServiceActor這個類做了具體的事情,包括datanode跟namenode的握手,發送心跳和報告塊信息,執行namenode發回來的命名。
詳細的過程就不啰嗦了。
到這里DataNode的啟動過程就搞了一個段落。
感謝各位的閱讀,以上就是“Hadoop中DataNode的啟動過程介紹”的內容了,經過本文的學習后,相信大家對Hadoop中DataNode的啟動過程介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。