предисловие
Напоминаем, что для RPC необходима основа.Если вы мало что знаете о RPC, вы можете перейти к двум статьям RPC, написанным в прошлом.
Теоретические аспекты:High Concurrency from Scratch (7) --- Введение в RPC, протокол и инфраструктуру
(пропустить) код:Высокий параллелизм с нуля (8) --- Простая реализация инфраструктуры RPC
Конечно, вам не нужно слишком углубляться, просто немного познакомьтесь с мехом. Потому что в Hadoop есть удаленный вызов процедур Hadoop, который требует некоторых базовых знаний.
Пока запомните следующие условия выполнения RPC (неполные):
1. Вызовы методов между разными процессами
2. RPC делится на серверный и клиентский, клиент вызывает метод сервера, а выполнение метода происходит на сервере.
3. Протокол — это, грубо говоря, интерфейс, но этот интерфейс должен иметь идентификатор версии.
4. Будут абстрактные методы в протоколе, и эти абстрактные методы будут реализованы сервером
хорошо, давайте начнем
1. Анализ процесса запуска NameNode
Наша первая задача — проверитьЯвляется ли NameNode сервером RPC?
1.1 Шаг 1: Найдите основной метод NameNode
Теперь мы подходим к исходному коду Hadoop2.7.0, сначала открываем код NameNode.java и находим его основной метод.
Для вашего удобства добавлю несколько замечаний
1.2 Шаг 2: Нажмите на метод CreateNamenode для создания namenode
Этот метод createNameNode разделен на две части, чтобы увидеть
Первая часть: часть передачи параметров
Когда мы работаем с кластером HDFS, мы будем передавать следующие команды
hdfs namenode -format
hadoop=daemon.sh start namanode
Часть 2: часть переключателя
Код слишком длинный, чтобы делать скриншоты, просто скопируйте его.
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);
}
Например, первый сегмент — это hdfs namenode -format, который является форматом
Эта ветвь является естественным путем.
Но теперь, например, я ввожу start, который является вторым сегментом hadoop=daemon.sh start namanode, поскольку остальные не удовлетворяются, поэтому я беру последнюю ветвь.
Затем щелкните этот новый NameNode (conf)
1.3 Инициализация NameNode
Нажмите на этот метод, который на самом деле тот, что ниже
Предыдущий раздел смотреть не надо.Это не что иное, как передача каких-то параметров.Посмотрите на этот попробуйте,там есть инициализация,китайское этого слова инициализация,потом дальше будем нажимать на него.
Конкретный шаг инициализации 1.4
1.4.1 HttpServer
Фронт состоит в том, чтобы судить о каких-то странных условиях и игнорировать их до поры до времени, а непосредственно видеть, где мы более чувствительны.
На этом этапе мы видим код для создания HttpServer.Если мы создаем наш кластер больших данных в первый раз, получим ли мы доступ к веб-странице 50070, такой как
Хоть это и не важный процесс, но кстати объясните откуда 50070 взялся
Второе предложение начинается с начала, поэтому первое предложение параметров должно быть там Давайте посмотрим на getHttpServerBindAddress(conf) сзади.Затем мы видим эти два параметра, DFS_NAMENODE_HTTP_ADDRESS_KEY и DFS_NAMENODE_HTTP_ADDRESS_DEFAULT.
DFS_NAMENODE_HTTP_ADDRESS_KEY — это адрес, настроенный нами вручную, но обычно мы не настраиваем его вручную, поэтому hadoop будет использовать адрес по умолчанию DFS_NAMENODE_HTTP_ADDRESS_DEFAULT.
Видя это, мы знаем, почему сайт, который мы посетили в то время, было местный IP Plus A 50070.
1.4.2 Усовершенствованный сервлет для HttpServer2
В этот момент мы возвращаемся к первой картинке, то есть второе предложение - это метод запуска startHttpServer, нажмите на метод запуска, чтобы увидеть
Давайте посмотрим вниз, как Java-разработчик, наше внимание, естественно, сосредоточено на сервлете, с которым мы знакомы.
setupServlets(httpServer, conf);
Здесь куча связанных сервлетов. Чем больше связанных функций, тем сильнее функция. Давайте нажмем.
Вы можете видеть, что добавление нескольких различных сервлетов - это сумасшествие. Давайте пока не будем рассматривать это. На самом деле, все должны быть хорошо знакомы с сервлетами. Даже не думайте о переходе к методу doGet(), прежде чем щелкнуть его. Вы можете видеть, что все они выполняются отдельно.
Давайте посмотрим, пока мы можем сначала нарисовать нашу блок-схему.
1.5 Первый шаг блок-схемы
Во-первых, теперь у нас есть HttpServer2 (HttpServer, инкапсулированный самим Hadoop), который связан со многими сервлетами, предоставляющими различные функции.
Он предоставляет внешнему миру порт 50070. После того, как браузер отправит запрос http://ip address:50070/listPaths для запроса сервлета, он вернет веб-страницу.
1.6 Hadoop RPC
Вернитесь к расположению HttpServer в 1.4.1. После запуска HttpServer метаданные будут загружены, но сценарий, который мы моделируем сейчас, заключается в том, что кластер запускается в первый раз, а метаданных при первом запуске нет, поэтому мы пропустим этот шаг и перейдем к Hadoop RPC.
Откуда я знаю, что в этом Hadoop RPC есть два таких сервиса?Конечно, это не моя догадка, и не то, что я нашел какую-то информацию или кликнул по ней, а сообщил нам в исходном коде NameNode.
Мы поставили этот параграф в перевод Baidu.
Здесь показано, что NameNode является не только классом, но и сервером.Он предоставляет внешнему миру IPC-сервер и Http-сервер.Кроме того, этот IPC-сервер предназначен для разработчиков для выполнения командных операций. Этот Http-сервер открыл интерфейс 50070, чтобы разработчики могли понять ситуацию с HDFS. Класс FSNamessystem управляет метаданными HDFS.
Теперь мы знаем, что одна из этих двух служб предоставляется внутреннему DataNode для вызова, а другая — серверу для вызова.
1.6.1 Убедитесь, что протокол реализован и в протоколе существует идентификатор версии.
Имя метода здесь очень простое, createRpcServer() хахаха, давайте нажмем
Комментарий здесь заключается в создании реализации сервера RPC. Он возвращает NameNodeRpcServer. Это тот сервер NameNode, который мы ищем?
Помните, мы начали говорить об основах оценки RPC?3. Протокол — это, грубо говоря, интерфейс, но этот интерфейс должен иметь идентификатор версии., ОК, давайте запомним это предложение, а затем нажмите NameNodeRpcServer
Поверьте, это то, что мы хотим видеть, он действительно реализует NamenodeProtocols, такое ощущение, что мы вот-вот увидим правду, правильно, а затем щелкните
Я собираюсь, унаследовал так много протоколов, неудивительно, что наш NameNode такой мощный, сколько там методов, давайте просто щелкнем по интерфейсу, чтобы увидеть
1.6.2 Проверка наличия процесса настройки параметров
Satisfaction - это интерфейс, и у него тоже есть versionID. Сейчас мы думаем, что это сервер, но мы не видели коды тех установленных серверных адресов, портов и т. д., поэтому мы все еще не можем быть уверены, поэтому мы Теперь вернитесь к классу NameNodeRpcServer и вытащите его на строку 296.
Затем потяните до строки 343 и найдите еще один подобный абзац.
Я до сих пор помню, что мы сказали, что два служба являются DataNode, чтобы быть предоставленным внутренним datanode, а другой - предоставить серверу позвонить, так что это два,Первый serviceRpcServer предназначен для вызова между NameNode и DataNode, а второй clientRpcServer — для взаимодействия клиента с NameNode и DataNode.
И после того, как они будут созданы, будет добавлено много протоколов.У этих протоколов тоже много методов.Чем больше протоколов добавлено, тем мощнее функции этих двух сервисов.
Так что это та же процедура, что и HttpServer, ониУлучшайте себя, добавляя протоколы, а HttpServer — просто добавляя сервлеты..
1,7 второй шаг в блок-схеме
Структура NameNodeRpcServer представляет собой изображение, которому подчиняются serviceRpcServer и clientRpcServer, тогда они оба предлагают различные методы обслуживания.
Клиентские операции над NameNode (например, создание каталога mkdirs) будут использовать службы, предоставляемые clientRpcServer, а взаимные вызовы между каждым DataNode и NameNode реализуются через serviceRpcServer.
Namenode на рисунке можно рассматривать как standBy NameNode, а об активном и резервном узлах, упомянутых в высокой доступности HA, можно забыть.обзор
1.8 Проверка перед официальным запуском
безопасный режиммы вHDFS First Post.Он упомянул в механизме сердцебиения в, который скопирован непосредственно здесь.
При первом запуске кластера hadoop он переходит в безопасный режим (99,99%), и используется механизм сердцебиения.Фактически, при первом запуске кластера каждый DataNode отправляет blockReport в NameNode, и NameNode будет считать общее количество блоков, о которых они сообщают, кроме На основе общего числа, известного в начале, когда блок/всего
Нажмите на startCommonServices
1.8.1 Проверка ресурса NameNode 1 --- Получить каталог, который необходимо проверить
Буквальный перевод NameNodeResourceChecker — это средство проверки ресурсов NameNode, мы нажимаем, чтобы увидеть
duReserved
Вот значение duReserved, которое позволяет нам установить его самостоятельно, если оно не установлено, использовать значение по умолчанию, которое оно нам дает. Мы также можем посмотреть на этоЗначение по умолчанию для DFS_NAMENODE_DU_RESERVED_DEFAULT — 100 М., определенный в DFSConfigKeys.java
Я также могу добавить сюда, что каталог, в котором нам нужно судить об аварийном сигнале, находится в getNamespaceEditsDirs(conf) ниже, и если вы нажмете на него, вы увидите три каталога, которые мы только что упомянули, которые необходимо проверить (каталог, в котором fsimage хранится в каталоге NameNode и каталоге редактирования), каталоге log и каталоге JournalNode, все эти параметры определены в DFSConfigKeys.java)
localEditDirs - это не каталог в HDFS, а каталог на Linux-диске, затем перейдите к этому localEditDirs и добавьте его в том
Слово тома можно увидеть во многих местах HDFS. Тома на самом деле представляют собой набор каталогов, в которых хранятся каталоги, которые необходимо проверить. Первое предложение в комментарии «Добавить том переданного каталога в список томов для check" ." означает добавить том входящего каталога в список томов для проверки, в данном случае volumes.
Итак, теперь мы возвращаемся к startCommonServices, теперь, когда мы знаем
// 作用就是获取到所有需要检查的目录
nnResourceChecker = new NameNodeResourceChecker(conf);
1.8.2 Ресурсы NameNode --- Проверка 2 Проверьте, достаточно ли места на диске для хранения метаданных
checkavailableResources () Нажмите, чтобы посмотреть
Именование методов в hadoop всегда такое прямое: дословный перевод hasAvailableDiskSpace означает, есть ли свободное место, а затем нажмите на него.
Я вижу здесь тома, потому что, как я только что объяснил, тома — это каталоги, которые нужно проверить (то есть три каталога), естественно, тома передаются как параметры, а три брата — все в одном горшке. Затем нажмите на метод areResourcesAvailable, Поскольку эти тома являются коллекцией, мы держим пари, что логика в нем должна иметь цикл for для обхода значений в томах для проверки.
Конечно же, появился цикл for. На данный момент isResourceAvailable является основой для суждения
Здесь мы видим, что он сначала получает размер текущего каталога (jdk), а затем сравнивает его с duReserved (по умолчанию 100M), о котором мы упоминали ранее. В это время мы собираем предыдущие очки знаний.
Если места недостаточно, он напечатает абзац. Этот абзац вряд ли можно увидеть в нашей повседневной среде корпоративного кластера, но если мы создадим собственный кластер для обучения, мы его увидим. На этот раз это наше виртуальное пространство на компьютер неисправен.Хотя служба кластера запускается нормально, кластер не может нормально работать.
1.8.3 Проверка ресурса NameNode 3 --- Проверка безопасного режима
Вопросы собеседования: действительно ли мы знаем, почему кластер Hadoop входит в безопасный режим?
Вернитесь в FSNameSystem и щелкните метод setBlockTotal().
Нажмите, чтобы увидеть, как он получает нормальное количество блоков
Что значит получить строящийся блок, а потом продолжить нажимать в
В HDFS есть два состояния блока: одно завершено, которое уже является завершенным блоком, который можно использовать, а другое — UnderConstruct, который находится в стадии разработки и не может использоваться в обычном режиме, что соответствует приведенному ниже коду.
Итак, возвращаемся назад, получаемCompleteBlocksTotal, используем общее количество блоков в blockTotal — numUCBlocks, чтобы получить количество блоков, готовых к завершению
Вернуться к setBlockTotal в safeMode.setBlockTotal ((int) getCompleteBlocksTotal ()), указать на setBlockTotal
Вот код для установки, когда для выхода из безопасного режима. Значение порога по умолчанию составляет 0,999. Например, наше общее количество блоков составляет 1000. Если есть 999 блоков Iscomplete, кластер считается в здоровом состоянии и безопасно Режим может быть выведен.
Нажмите на checkMode(), и мы обнаружим, что needEnter() является условием входа в безопасный режим (выход только что объяснен).
Любое из следующих 3 условий будет введено в безопасный режим
первое условие
порог != 0 ни о чем не говорит, саму эту штуку нельзя поставить 0, blockSafe
Когда наш кластер запускается, DataNode также запускается после запуска NameNode.Когда DataNode запускается, он будет сообщать информацию о состоянии своего блока в NameNode.Каждый раз, когда сообщается об одном, blockSafe будет увеличиваться на единицу. blockThreshold Количество блоков, необходимое для удовлетворения порогового условия режима безопасности.Когда сообщаемая сумма меньше, чем сумма, требуемая режимом безопасности, режим безопасности активируется.
Второе условие
datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold
DataNode и NameNode будут иметь механизм сердцебиения.Это условие, вероятно, заключается в том, что если количество выживших DataNode в кластере меньше, чем datanodeThreshold, кластер будет находиться в безопасном режиме.
Очень забавно, что по умолчанию значение этого datanodeThreshold равно 0, и вам нужно настроить его самостоятельно, поэтому это условие в принципе неэффективно, если вы его не настроите самостоятельно. ххх
Третий
!nameNodeHasResourcesAvailable() напрямую переводит, достаточно ли места на диске, да, ссылка — это упомянутое выше hasAvailableDiskSpace, а дословный перевод — есть ли свободное место.
1.9 Запуск службы
Впечатлен, после стольких лет он наконец-то запускается нормально
Конечно, некоторые сервисы будут запущены вместе здесь, которые будут расширены позже.
1.10 Третий шаг блок-схемы
По сути, это дополнить FSNameNode, а затем собрать воедино все предыдущие рисунки.
finally
Эта статья представляет собой общий процесс запуска NameNode. Конечно, есть много деталей, в которые мы не вникли или не упомянули. Некоторые из этих деталей не важны, а некоторые будут добавлены позже. Скриншоты действительно очень хлопотны. и мне будет выгодно.