предисловие
Только лысая голова может стать сильнее.
Текст был включен в мою избранную статью на GitHub, Welcome Star.:GitHub.com/Zhongf UC очень…
В предыдущей статье уже объяснялось "Начало работы с большими данными«Связанные основные понятия и знания, давайте изучим HDFS в этой статье. Если в статье есть ошибки, пожалуйста, укажите в комментариях~
1. Введение в HDFS
Как упоминалось в предыдущей статье, с увеличением объема данных уже невозможно хранить все данные на одной машине, тогда мы будем распределять эти данные по разным машинам для хранения, но это порождает проблему:Неудобно управлять и обслуживать
Поэтому мы надеемся иметь систему, которая сможет обрабатывать эти данные, распределенные по разным операционным серверам.Единое управление, у которого естьРаспределенная файловая система
- HDFSЭто одна из распределенных файловых систем (наиболее широко используемая в настоящее время).
Это очень просто при использовании HDFS: хотя HDFS хранит файлы на разных машинах, когда я иду использовать эти файлыв видеОн хранится на одной машине и используется (за ним несколько машин):
- Например: я вызываю RPC-интерфейс, я даю ему параметры, а он возвращает мне ответ. Я на самом деле не знаю, что делает интерфейс RPC (возможно, этот интерфейс RPC вызывает другие интерфейсы RPC) -----Скрывает детали реализации и удобен для пользователя
Для ясности: HDFS — этоРаспределенная файловая система, файловая система, для чего мы ее используем?сохранять данные.
Далее давайте взглянем на некоторые знания HDFS, которые могут помочь нам лучше «использовать» HDFS.
Во-вторых, обучение HDFS
Из вышесказанного мы упомянули, что HDFS как распределенная файловая система, затемЕго данные хранятся в нескольких системах. Например, изображение ниже: файл размером 1 ГБ будетСегментацияна несколько небольших файлов, каждый сервер будет хранить часть.
Тогда кто-нибудь обязательно спросит: сколько мелких файлов будет разбито? По умолчанию128MB
размер должен быть разделен, каждый128MB
Файлы в HDFS называютсякусок(block)
Очевидно, что этот размер в 128 МБ можно настроить. Нехорошо, если он установлен слишком маленьким или слишком большим. Если нарезанный файл слишком мал, этот фрагмент данных может быть распределен по нескольким машинам (время поиска медленное). Если разделенный файл слишком велик, время передачи данных увеличивается.
PS: старая версия по умолчанию имеет размер 64 МБ.
Пользователь выдал1GB
Запрос файла к клиенту HDFS, клиент HDFS будет в соответствии с конфигурацией (теперь значение по умолчанию128MB
), разделите этот файл, чтобы клиент HDFS разделился на 8 файлов (также называемыхblock), то каждый сервер будет хранить эти разделенные файлы (блокировать). Теперь мы предполагаемКаждый сервер хранит две копии.
эти хранилищареальные данныесервер, называемый в мире HDFSDataNode
Теперь вопрос, после того, как клиент HDFS разделен по конфигурации, как он узнает, на какой сервер (DataNode) положить данные? В это время нужна другая роль, менеджер (NameNode).
NameNode на самом делеУправление различной информацией о файлах(Мы называем эту информационную профессиональную точкуMetaData«Метаданные»), в том числе: имя пути к файлу, идентификатор и место хранения каждого блока и т. д.
Так что, будь то чтение или запись, клиент HDFS сначала будет искатьNameNode, получить соответствующую информацию через NameNode, а затем перейти к DataNode
- Если это операция записи, то после того, как HDFS разделит файл, она спросит NameNode, в какой DataNode следует записать эти разделенные блоки.
- Если это операция чтения, HDFS получает имя файла, а также спрашивает, из каких узлов данных узел имен должен считывать данные.
2.1 Резервное копирование HDFS
Как распределенная система (разделить большие файлы на несколько маленьких файлов и хранить их на разных машинах), если нет бэкапа, пока одна из машин зависнет, "данные" будут недоступны.статус.
Напиши сюда, если ты читаешь мойKafkaиElasticSearchСтатья может понять. На самом деле идея одинакова.
Kafka выполняет резервное копирование разделов, ElasticSearch — сегментов, а HDFS — блоков.
Резервное копирование данных на разные машины, когда это возможно, даже если машина зависнет, вы сможете извлечь резервные данные для использования.
Студенты, которые не знают о Kafka и ElasticSearch, могут подписаться на меняGitHub, вы можете искать по ключевым словам (я думаю, это относительно легко понять)
**Примечание.** Резервную копию здесь не нужно записывать клиентом HDFS, если узлы данных передают данные друг другу.
2.2 Кое-что о NameNode
Из приведенного выше видно, что NameNode должен обрабатывать клиентские запросы hdfs. (Поскольку именно там хранятся метаданные, все операции чтения и записи должны проходить через них).
Теперь возникает вопрос, как NameNode хранит метаданные?
- Если NameNode просто помещает метаданные в память, то при перезапуске машины NameNode метаданные исчезнут.
- Если NameNode сохраняет данные каждый раз при записи на жесткий диск, то еслитолько дискПоиск и изменение снова будут медленными (потому что эточистый IOоперация)
Говоря об этом, я снова думаю о Кафке. Kafka также записывает разделы на диск, но как люди их записывают?Последовательный ввод-вывод
NameNode также делает то же самое: модифицирует метаданные в памяти, а затем помещает измененную информациюappend(добавлять) к файлу с именемeditlog
в файле.
Поскольку append является последовательным вводом-выводом, эффективность не будет низкой. Теперь добавляем, удаляем, модифицируем и проверяем все пути в память, но при добавлении, удалении, изменении идет в файл на дискеeditlog
Добавьте один внутрь. Таким образом, даже если мы перезапустим NameNode, мы все равно сможем передатьeditlog
Файл будет восстановлен метаданные.
Теперь еще и проблема: если NameNode работает давно, тоeditlog
Файл должен становиться все больше и больше (поскольку сюда необходимо добавить всю информацию о метаданных модификации). Зависит от перезапускаeditlog
файл для восстановления данных, если файл особенно большой, не особенно ли медленно он запускается?
Это действительно так, так как же это делает HDFS? предотвращатьeditlog
Если он слишком большой, восстановление данных при перезапуске займет много времени, поэтому NameNode будет иметьснимок памяти, называетсяfsimage
Говоря о моментальных снимках, вы помните RDB Redis!!
Таким образом, при перезапуске необходимо загрузить только снимок памяти.fsimage
+частичныйeditlog
Вот и все.
Идея отличная, но реальность еще требует решения некоторых моментов: когда мне генерировать снимок памятиfsimage
? как узнать какую часть загрузитьeditlog
?
Задача выглядит сложной, но нам нужен только одинзадача на время.
Если бы я делал это сам, я бы подумал: давайте добавим конфигурацию, установим время и все в порядке.
- если
editlog
В каком объеме и сколько времени мы берем данные файла editlog и снапшота памятиfsiamge
объединить. затем генерируйте новыйfsimage
,Пучокeditlog
очистить, перезаписать старыйfsimage
снимок памяти- Таким образом, каждый раз, когда NameNode перезагружается, он получает последний файл fsimage, а журнал редактирования не объединяется с fsimage. По этим двум файлам можно восстановить последнюю информацию метаданных.
HDFS похожа на описанную выше, но вместо запуска запланированной задачи на NameNode она использует новую роль:SecondNameNode.至于为什么?可能HDFS觉得Объединенные ресурсы потребляют слишком многоТеперь разные серверы выполняют разную работу, что также соответствует концепции распределения.
Теперь проблема все еще идет, структура в это времяNameNode является автономнымиз. Роль SecondNameNode состоит в том, чтобы просто объединить NameNodeeditlog
иfsimage
Файл, если NameNode завис, то клиент не будет запрашивать, но все запросы должны идти NameNode, из-за чего весь кластер HDFS недоступен.
Таким образом, мы должны обеспечить, чтобы Наменять наменять очень доступно. Обычно сейчас мы пройдемZookeeperреализовать. Схема архитектуры выглядит следующим образом:
Главный NameNode и подчиненный NameNode должны поддерживать согласованность информации метаданных (поскольку, если главный NameNode зависает, подчиненный NameNode должен быть сверху, а подчиненный NameNode должен иметь информацию главного NameNode).
Таким образом, Shared Edits введены для достижения синхронизации между главным и подчиненным узлами NameNodes.Shared Edits также называютсяJournalNode. Фактически, если основной NameNode имеет информацию для обновления метаданных, егоeditlog
Он будет записан в JournalNode, а затем информация об изменении будет прочитана из NameNode в JournalNode, а затем синхронизирована. Упомянутая выше функция SecondNameNode также реализована из NameNode (объединить editlog и fsimage)
Подводя итог:
- NameNode должен обрабатывать запросы клиентов, здесь хранятся метаданные.
- Все операции с метаданными NameNode находятся в памяти, а добавления, удаления и изменения будут
editlog
Сохранение на жесткий диск (поскольку это последовательный ввод-вывод, поэтому он не будет слишком медленным) - так как
editlog
Возможно, возникла слишком большая проблема, из-за которой перезапуск узла NameNode будет слишком медленным (поскольку он зависит отeditlog
для восстановления данных), что приводит кfsimage
снимок памяти. Необходимо запустить запланированную задачу для слиянияfsimage
иeditlog
, что приводит кSecondNameNode
- А поскольку NameNode — это отдельная машина, может возникнуть проблема отказа одной машины. Таким образом, мы можем поддерживать главный-подчиненный NameNode через Zookeeper и достигать согласованности метаданных главного-подчиненного NameNode через JournalNode (Share Edits). Наконец осознайте высокую доступность NameNode.
2.3 Узнайте о DataNode
Из вышеизложенного мы знаем, что наши данные хранятся на DataNode (он также будет зарезервирован).
Если DataNode не работает, как HDFS узнает об этом?
Когда DataNode запустится, он перейдет к NameNode для регистрации, и они будут поддерживатьсердцебиение, если пульс DataNode не получен после порогового времени, HDFS считает, что DataNode не работает.
Есть еще одна проблема: если мы храним Блок на DataNode, все равно возможно, что диск этого DataNodeповрежденная часть, и наш DataNode не находится в автономном режиме, но мы не знаем, что он поврежден.
В дополнение к хранению самих данных блок также хранит часть метаданных (включая длину блока данных, контрольную сумму данных блока и метку времени). DataNode по-прежнемуобычныйСообщите все текущие блок информации на NameNode, черезМетаданные могут проверить, находится ли текущий блок в нормальном состоянии..
Наконец
На самом деле, изучая HDFS, вы обнаружите, что многие идеи похожи на то, что вы изучали раньше. Например, упомянуты часто используемые распределенные компоненты, такие как Kafka и Elasticsearch.
Если вы не знаете о Kafka, Elasticsearch, Zookeeper, Redis и т. д., вы можете найти соответствующие статьи на моем GitHub или в публичном аккаунте~ Я думаю, это довольно легко понять.
Еще один день, чтобы интегрировать функции постоянства этих фреймворков и написать еще одну статью (потому что можно обнаружить, что их механизмы постоянства очень похожи).
Если не случайно в следующей статье напишу MapReduce,спасибо, что увидели здесь.
Использованная литература:
- HDFS комиксы
- «Изучайте большие данные с нуля — Ли Чжихуэй»
если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, вы можете подписаться на мой публичный аккаунт "Java3y".
- 🔥Java красивая карта мозга
- 🔥Маршрут обучения Java
- 🔥Разработка общих инструментов
Ответить под публичным аккаунтом"888», чтобы получить его! !
Эта книга была включена в мои избранные статьи на GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…
попросить лайк Пожалуйста, следите за ️ поделитесь пожалуйста 👥 Спросите сообщение 💬верно для меняочень полезно! ! !