91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hadoop中DataNode的啟動過程介紹

發布時間:2021-09-16 17:35:15 來源:億速云 閱讀:440 作者:chen 欄目:云計算

這篇文章主要講解了“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的啟動過程介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

稷山县| 福鼎市| 龙江县| 紫金县| 来安县| 馆陶县| 上思县| 县级市| 连城县| 扎赉特旗| 平乐县| 巨野县| 福州市| 德格县| 尉犁县| 静乐县| 秦皇岛市| 弋阳县| 吉首市| 城市| 河西区| 乾安县| 峡江县| 万年县| 全椒县| 辽中县| 宣武区| 越西县| 金乡县| 庆元县| 浙江省| 竹北市| 竹山县| 城市| 青海省| 南溪县| 建德市| 临潭县| 富裕县| 临夏县| 探索|