Знакомство с Hadoop: Комплексный Обзор для Системных Администраторов и Разработчиков
Четыре года назад мне представилась возможность глубоко познакомиться со стеком технологий, о котором ранее я не имел представления. Это был мир Hadoop, и мне пришлось погрузиться в него сначала со стороны администрирования, а затем и в разрешение проблем на уровне разработки.
Что такое Hadoop?
Hadoop — это мощный фреймворк для распределенной обработки и хранения больших данных, разработанный под эгидой Apache. Он тесно связан с экосистемой Java и представляет собой набор продуктов, ключевая идея которых заключается в обработке и хранении огромных объемов информации на кластере серверов. Хотя существуют коммерческие дистрибутивы, Hadoop можно поднять и настроить вручную, что требует глубокого понимания его архитектуры и компонентов.
Далее я расскажу о компонентах стека Hadoop, с которыми мне довелось работать.
HDFS (Hadoop Distributed File System)
HDFS — это распределенная файловая система, разработанная специально для хранения больших объемов данных с высокой пропускной способностью. Ее ключевые особенности — репликация данных для обеспечения отказоустойчивости и оптимизация для последовательного доступа к крупным файлам.
- NameNode: Мастер-узел, который хранит метаданные файловой системы (например, структуру каталогов, права доступа и расположение блоков файлов на DataNode).
- DataNode: Агентские узлы, которые фактически хранят блоки данных и выполняют операции чтения/записи по запросам NameNode.
Фундаментальная модель HDFS — Write Once Read Many (WORM). Это означает, что после записи файл нельзя изменить (за исключением операций добавления данных в конец файла — append, или усечения — truncate). Такой подход значительно упрощает модель согласованности данных: читатель всегда гарантированно получает ту версию данных, которая была записана, без риска конфликтов. HDFS идеально подходит для больших последовательных чтений файлов, в то время как работа с множеством мелких файлов менее эффективна из-за накладных расходов.
YARN (Yet Another Resource Negotiator)
YARN — это оркестратор ресурсов кластера, который управляет распределением вычислительных ресурсов (CPU, RAM) для задач обработки данных. Его можно сравнить с Kubernetes, но с фокусом на специфичные для больших данных задачи, такие как MapReduce, Spark или Hive.
- ResourceManager: Мастер-компонент, отвечающий за управление всеми ресурсами в кластере и глобальное планирование выполнения приложений.
- NodeManager: Агент, работающий на каждой ноде кластера, отвечающий за запуск и мониторинг контейнеров YARN (не путать с контейнерами Docker).
- ApplicationMaster: Компонент, запускаемый для каждого приложения. Он взаимодействует с ResourceManager для согласования ресурсов и управляет жизненным циклом конкретного задания в пределах выделенных ресурсов.
На кластере, управляемом YARN, можно запускать различные задачи обработки данных в изолированных YARN-контейнерах, используя выделенные ресурсы.
HBase
HBase — это распределенная NoSQL-база данных с широкими столбцами (column-family store), построенная поверх HDFS. По своей сути она представляет собой огромную разреженную таблицу-словарь, где данные организованы по принципу row_key → набор_семейств_столбцов → значения. В отличие от реляционных баз данных, где схема строго определяет фиксированный набор колонок для всех строк, в HBase «схема» обычно определяет только семейства столбцов (column families) — условные «группы» полей.
Внутри каждого такого семейства у конкретной строки может быть любой набор столбцов, который может отличаться от строки к строке. Это делает HBase чрезвычайно удобной для хранения разреженных данных и атрибутов, которые меняются со временем, без необходимости сложных миграций схемы. Например:
0001: profile:name, profile:city, profile:role, contacts:telegram
0002: profile:name, profile:role, contacts:vk, contacts:instagram
0003: profile:name (и всё)
0004: profile:name, profile:city, skills:java, skills:kafka, skills:spark
Здесь profile, contacts, skills — это разрешенные семейства столбцов, а конкретные поля внутри них (например, name, city, telegram) могут варьироваться для каждой строки.
Таблица HBase распределяется по кластеру через регионы (regions) — это диапазоны строк, определяемые по row_key. Каждый RegionServer обслуживает свой набор регионов.
- HMaster: Отвечает за распределение данных по нодам, а также за операции DDL (создание, изменение, удаление таблиц).
- RegionServer: Воркеры, работающие на нодах. Они отвечают за чтение, запись и кеширование данных. Физически сами данные хранятся в HDFS. Клиент взаимодействует с ZooKeeper или использует метаинформацию для определения того, на каком RegionServer находится нужный кусок данных, и затем обращается к нему напрямую.
ZooKeeper
Во всех упомянутых сервисах Hadoop ZooKeeper играет роль централизованного хранилища информации о состоянии кластера. Подобно etcd в Kubernetes, он используется для координации (кто является мастером, какие узлы активны, где хранятся метаданные) и обеспечения консистентности конфигурации.
MapReduce
MapReduce — это программная модель и фреймворк для обработки больших объемов данных с использованием распараллеленных вычислений на кластере. Процесс обработки делится на два основных шага:
- Map (Отображение): На этом этапе исходные данные разбиваются на небольшие порции, которые обрабатываются параллельно. YARN запускает контейнеры-мапперы, каждый из которых преобразует свою порцию данных в набор пар «ключ → значение».
- Reduce (Сокращение): Результаты, полученные на этапе Map, группируются по ключу. Затем Reducer-функции агрегируют эти сгруппированные данные для получения конечного результата.
Рассмотрим простой пример подсчета количества пользователей в каждом городе:
- Map: Проходит по записям пользователей и для каждого пользователя выдает пару: «Город → 1». Например: «Белград → 1», «Москва → 1», «Белград → 1».
- Reduce: Группирует результаты по ключу (городу) и суммирует значения: «Белград → 2», «Москва → 1».