激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Hadoop源碼分析六啟動文件namenode原理詳解

Hadoop源碼分析六啟動文件namenode原理詳解

2021-12-16 10:54huserblog Java教程

本篇是Hadoop源碼分析系列文章第六篇,主要介紹Hadoop中的啟動文件namenode,后續(xù)本系列文章會持續(xù)更新,有需要的朋友可以借鑒參考下

1、 namenode啟動

本系列文章三中分析了hadoop的啟動文件,其中提到了namenode啟動的時候調(diào)用的類為

org.apache.hadoop.hdfs.server.namenode.NameNode

其main方法的內(nèi)容如下:

public static void main(String argv[]) throws Exception {
  if (DFSUtil.parseHelpArgument(argv, NameNode.USAGE, System.out, true)) {
    System.exit(0);
  }
  try {
    StringUtils.startupShutdownMessage(NameNode.class, argv, LOG);
    NameNode namenode = createNameNode(argv, null);
    if (namenode != null) {
      namenode.join();
    }
  } catch (Throwable e) {
    LOG.error("Failed to start namenode.", e);
    terminate(1, e);
  }
}

這段代碼的重點在第8行,這里createNameNode方法創(chuàng)建了一個namenode對象,然后調(diào)用其join方法阻塞等待請求。

createNameNode方法的內(nèi)容如下:

public static NameNode createNameNode(String argv[], Configuration conf)
    throws IOException {
  LOG.info("createNameNode " + Arrays.asList(argv));
  if (conf == null)
    conf = new HdfsConfiguration();
  // Parse out some generic args into Configuration.
  GenericOptionsParser hParser = new GenericOptionsParser(conf, argv);
  argv = hParser.getRemainingArgs();
  // Parse the rest, NN specific args.
  StartupOption startOpt = parseArguments(argv);
  if (startOpt == null) {
    printUsage(System.err);
    return null;
  }
  setStartupOption(conf, startOpt);
  switch (startOpt) {
    case FORMAT: {
      boolean aborted = format(conf, startOpt.getForceFormat(),
          startOpt.getInteractiveFormat());
      terminate(aborted ? 1 : 0);
      return null; // avoid javac warning
    }
    case GENCLUSTERID: {
      System.err.println("Generating new cluster id:");
      System.out.println(NNStorage.newClusterID());
      terminate(0);
      return null;
    }
    case FINALIZE: {
      System.err.println("Use of the argument '" + StartupOption.FINALIZE +
          "' is no longer supported. To finalize an upgrade, start the NN " +
          " and then run `hdfs dfsadmin -finalizeUpgrade'");
      terminate(1);
      return null; // avoid javac warning
    }
    case ROLLBACK: {
      boolean aborted = doRollback(conf, true);
      terminate(aborted ? 1 : 0);
      return null; // avoid warning
    }
    case BOOTSTRAPSTANDBY: {
      String toolArgs[] = Arrays.copyOfRange(argv, 1, argv.length);
      int rc = BootstrapStandby.run(toolArgs, conf);
      terminate(rc);
      return null; // avoid warning
    }
    case INITIALIZESHAREDEDITS: {
      boolean aborted = initializeSharedEdits(conf,
          startOpt.getForceFormat(),
          startOpt.getInteractiveFormat());
      terminate(aborted ? 1 : 0);
      return null; // avoid warning
    }
    case BACKUP:
    case CHECKPOINT: {
      NamenodeRole role = startOpt.toNodeRole();
      DefaultMetricsSystem.initialize(role.toString().replace(" ", ""));
      return new BackupNode(conf, role);
    }
    case RECOVER: {
      NameNode.doRecovery(startOpt, conf);
      return null;
    }
    case METADATAVERSION: {
      printMetadataVersion(conf);
      terminate(0);
      return null; // avoid javac warning
    }
    case UPGRADEONLY: {
      DefaultMetricsSystem.initialize("NameNode");
      new NameNode(conf);
      terminate(0);
      return null;
    }
    default: {
      DefaultMetricsSystem.initialize("NameNode");
      return new NameNode(conf);
    }
  }
}

這段代碼很簡單。主要做的操作有三個:

  • 1、 創(chuàng)建配置文件對象
  • 2、 解析命令行的參數(shù)
  • 3、 根據(jù)參數(shù)執(zhí)行對應(yīng)方法(switch塊)

其中創(chuàng)建的配置文件的為HdfsConfiguration(第5行),這里的HdfsConfiguration繼承于Configuration類,它會加載hadoop的配置文件到內(nèi)存中。然后解析傳入main方法的參數(shù),根據(jù)這個參數(shù)執(zhí)行具體的方法。正常啟動的時候執(zhí)行的default里的內(nèi)容。default的內(nèi)容也很簡單,就是創(chuàng)建一個Namenode對象。

這里先從HdfsConfiguration開始分析,詳細講解hdfs的配置文件處理。

首先看HdfsConfiguration的初始化方法如下:

public HdfsConfiguration() {
  super();
}

這里是調(diào)用其父類的初始化方法。

其父類為Configuration類,它的初始化方法如下:

/** A new configuration. */
public Configuration() {
  this(true);
}

這里可以看見他是調(diào)用了一個重載方法,傳入了一個參數(shù):true。

接著細看這個重載方法:

public Configuration(boolean loadDefaults) {
  this.loadDefaults = loadDefaults;
  updatingResource = new ConcurrentHashMap<String, String[]>();
  synchronized(Configuration.class) {
    REGISTRY.put(this, null);
  }
}

這里也很簡單,這里主要是為兩個參數(shù)賦值,并將新創(chuàng)建的Configuration添加到REGISTRY中。
至此便創(chuàng)建好了一個配置文件。但是關(guān)于配置文件的初始化解析還未完成。在java里可以使用static關(guān)鍵字聲明一段代碼塊,這段代碼塊在類加載的時候會被執(zhí)行。在Configuration和HdfsConfiguration中都有靜態(tài)代碼塊。
首先在Configuration類中,在第682行有一段靜態(tài)代碼塊,其內(nèi)容如下:

Hadoop源碼分析六啟動文件namenode原理詳解

這段代碼的重點在第695行和第696行,這里調(diào)用了一個addDefaultResource方法,這里傳入了兩個參數(shù)core-default.xml和core-site.xml。其中core-site.xml就是在安裝hadoop的時候設(shè)置的配置文件。而core-default.xml是hadoop自帶的配置文件,這個文件可以在hadoop的官方文檔里查到,文檔鏈接如下:https://hadoop.apache.org/docs/r2.7.6/hadoop-project-dist/hadoop-common/core-default.xml
同樣在hadoop的源碼里也有這個文件,它在hadoop-common-XX.jar中。

接著繼續(xù)分析調(diào)用的addDefaultResource方法

其內(nèi)容如下:

public static synchronized void addDefaultResource(String name) {
  if(!defaultResources.contains(name)) {
    defaultResources.add(name);
    for(Configuration conf : REGISTRY.keySet()) {
      if(conf.loadDefaults) {
        conf.reloadConfiguration();
      }
    }
  }
}

這段代碼也很簡單。首先是第二行先從defaultResources中判斷是否已經(jīng)存在該配置文件,

這里的defaultResources是一個list

其定義如下:

private static final CopyOnWriteArrayList<String> defaultResources =
  new CopyOnWriteArrayList<String>();

若defaultResources中不存在這個配置文件,則繼續(xù)向下執(zhí)行,將這個配置文件添加到defaultResources中(第3行)。然后遍歷REGISTRY中的key(第4行),這里的key就是在上文提到的Configuration對象。然后根據(jù)其loadDefaults的值來判斷是否執(zhí)行reloadConfiguration方法。
這里的loadDefaults的值就是上文分析的傳入重載方法的值,上文傳入的為true,所以其創(chuàng)建的Configuration對象在這里會執(zhí)行reloadConfiguration方法。

reloadConfiguration方法內(nèi)容如下:

public synchronized void reloadConfiguration() {
  properties = null;                            // trigger reload
  finalParameters.clear();                      // clear site-limits
}

這里可以看見這個reloadConfiguration方法并沒有真正的重新加載配置文件而是將properties的值設(shè)置為空。

同樣在HdfsConfiguration也有類似的靜態(tài)代碼塊,在第30行,其內(nèi)容如下:

Hadoop源碼分析六啟動文件namenode原理詳解

這里首先調(diào)用了一個addDeprecatedKeys方法然后調(diào)用了一個addDefaultResource。這里的addDefaultResource傳了兩個文件hdfs-default.xml和hdfs-site.xml。其中hdfs-site.xml是安裝時的配置文件,hdfs-default.xml是其自帶的默認文件,同上文的core-default.xml一樣。官網(wǎng)鏈接為:https://hadoop.apache.org/docs/r2.7.6/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml。文件位于:hadoop-hdfs-2.7.6.jar。

其中addDeprecatedKeys方法內(nèi)容如下:

private static void addDeprecatedKeys() {
  Configuration.addDeprecations(new DeprecationDelta[] {
    new DeprecationDelta("dfs.backup.address",
      DFSConfigKeys.DFS_NAMENODE_BACKUP_ADDRESS_KEY),
    new DeprecationDelta("dfs.backup.http.address",
      DFSConfigKeys.DFS_NAMENODE_BACKUP_HTTP_ADDRESS_KEY),
    new DeprecationDelta("dfs.balance.bandwidthPerSec",
      DFSConfigKeys.DFS_DATANODE_BALANCE_BANDWIDTHPERSEC_KEY),
    new DeprecationDelta("dfs.data.dir",
      DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY),
    new DeprecationDelta("dfs.http.address",
      DFSConfigKeys.DFS_NAMENODE_HTTP_ADDRESS_KEY),
    new DeprecationDelta("dfs.https.address",
      DFSConfigKeys.DFS_NAMENODE_HTTPS_ADDRESS_KEY),
    new DeprecationDelta("dfs.max.objects",
      DFSConfigKeys.DFS_NAMENODE_MAX_OBJECTS_KEY),
    new DeprecationDelta("dfs.name.dir",
      DFSConfigKeys.DFS_NAMENODE_NAME_DIR_KEY),
    new DeprecationDelta("dfs.name.dir.restore",
      DFSConfigKeys.DFS_NAMENODE_NAME_DIR_RESTORE_KEY),
    new DeprecationDelta("dfs.name.edits.dir",
      DFSConfigKeys.DFS_NAMENODE_EDITS_DIR_KEY),
    new DeprecationDelta("dfs.read.prefetch.size",
      DFSConfigKeys.DFS_CLIENT_READ_PREFETCH_SIZE_KEY),
    new DeprecationDelta("dfs.safemode.extension",
      DFSConfigKeys.DFS_NAMENODE_SAFEMODE_EXTENSION_KEY),
    new DeprecationDelta("dfs.safemode.threshold.pct",
      DFSConfigKeys.DFS_NAMENODE_SAFEMODE_THRESHOLD_PCT_KEY),
    new DeprecationDelta("dfs.secondary.http.address",
      DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_KEY),
    new DeprecationDelta("dfs.socket.timeout",
      DFSConfigKeys.DFS_CLIENT_SOCKET_TIMEOUT_KEY),
    new DeprecationDelta("fs.checkpoint.dir",
      DFSConfigKeys.DFS_NAMENODE_CHECKPOINT_DIR_KEY),
    new DeprecationDelta("fs.checkpoint.edits.dir",
      DFSConfigKeys.DFS_NAMENODE_CHECKPOINT_EDITS_DIR_KEY),
    new DeprecationDelta("fs.checkpoint.period",
      DFSConfigKeys.DFS_NAMENODE_CHECKPOINT_PERIOD_KEY),
    new DeprecationDelta("heartbeat.recheck.interval",
      DFSConfigKeys.DFS_NAMENODE_HEARTBEAT_RECHECK_INTERVAL_KEY),
    new DeprecationDelta("dfs.https.client.keystore.resource",
      DFSConfigKeys.DFS_CLIENT_HTTPS_KEYSTORE_RESOURCE_KEY),
    new DeprecationDelta("dfs.https.need.client.auth",
      DFSConfigKeys.DFS_CLIENT_HTTPS_NEED_AUTH_KEY),
    new DeprecationDelta("slave.host.name",
      DFSConfigKeys.DFS_DATANODE_HOST_NAME_KEY),
    new DeprecationDelta("session.id",
      DFSConfigKeys.DFS_METRICS_SESSION_ID_KEY),
    new DeprecationDelta("dfs.access.time.precision",
      DFSConfigKeys.DFS_NAMENODE_ACCESSTIME_PRECISION_KEY),
    new DeprecationDelta("dfs.replication.considerLoad",
      DFSConfigKeys.DFS_NAMENODE_REPLICATION_CONSIDERLOAD_KEY),
    new DeprecationDelta("dfs.replication.interval",
      DFSConfigKeys.DFS_NAMENODE_REPLICATION_INTERVAL_KEY),
    new DeprecationDelta("dfs.replication.min",
      DFSConfigKeys.DFS_NAMENODE_REPLICATION_MIN_KEY),
    new DeprecationDelta("dfs.replication.pending.timeout.sec",
      DFSConfigKeys.DFS_NAMENODE_REPLICATION_PENDING_TIMEOUT_SEC_KEY),
    new DeprecationDelta("dfs.max-repl-streams",
      DFSConfigKeys.DFS_NAMENODE_REPLICATION_MAX_STREAMS_KEY),
    new DeprecationDelta("dfs.permissions",
      DFSConfigKeys.DFS_PERMISSIONS_ENABLED_KEY),
    new DeprecationDelta("dfs.permissions.supergroup",
      DFSConfigKeys.DFS_PERMISSIONS_SUPERUSERGROUP_KEY),
    new DeprecationDelta("dfs.write.packet.size",
      DFSConfigKeys.DFS_CLIENT_WRITE_PACKET_SIZE_KEY),
    new DeprecationDelta("dfs.block.size",
      DFSConfigKeys.DFS_BLOCK_SIZE_KEY),
    new DeprecationDelta("dfs.datanode.max.xcievers",
      DFSConfigKeys.DFS_DATANODE_MAX_RECEIVER_THREADS_KEY),
    new DeprecationDelta("io.bytes.per.checksum",
      DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_KEY),
    new DeprecationDelta("dfs.federation.nameservices",
      DFSConfigKeys.DFS_NAMESERVICES),
    new DeprecationDelta("dfs.federation.nameservice.id",
      DFSConfigKeys.DFS_NAMESERVICE_ID),
    new DeprecationDelta("dfs.client.file-block-storage-locations.timeout",
      DFSConfigKeys.DFS_CLIENT_FILE_BLOCK_STORAGE_LOCATIONS_TIMEOUT_MS),
  });
}

這段代碼很簡單,只有一句話。調(diào)用了 Configuration的靜態(tài)方法addDeprecations,并向其中傳入了一個參數(shù),參數(shù)類型為DeprecationDelta類的數(shù)組,并為數(shù)組中的數(shù)據(jù)進行賦值。

以上就是關(guān)于Hadoop源碼分析啟動文件namenode原理詳解的詳細內(nèi)容,更多關(guān)于Hadoop源碼分析的資料請持續(xù)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/qq_39210987/article/details/113922325

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 亚洲九草 | 欧美aⅴ视频| 成人在线视频在线观看 | 日本特级a一片免费观看 | 精品久久中文网址 | 一级毛片a级 | 国产精品免费视频观看 | 欧美三级短视频 | 99国产精成人午夜视频一区二区 | 久久欧美亚洲另类专区91大神 | 天天操天天碰 | 久久久久国产成人免费精品免费 | 国产免费一区二区三区 | 国产视频在线免费观看 | 亚洲一区二区中文字幕在线观看 | 欧美日韩在线播放 | 久久草草影视免费网 | 日韩黄a| 欧美日韩在线视频一区 | 欧美激情区 | asiass极品裸体女pics | 羞羞视频免费观看入口 | 久久久av亚洲男天堂 | 精品久久久久久久 | 国产日本欧美在线观看 | 欧美视频在线一区二区三区 | 黄网免费看 | 国产精品免费成人 | 国产美女视频一区二区三区 | 护士hd老师fre0性xxx | 4p一女两男做爰在线观看 | 激情亚洲一区二区三区 | 日产精品久久久一区二区福利 | 成人免费观看在线视频 | 久久影院午夜 | 欧美三级美国一级 | 刘亦菲一区二区三区免费看 | 免费国产wwwwwww网站 | 黄色毛片a级 | 国产精品久久久久久久久久妇女 | 性爱视频在线免费 |