Репликация данных в HDFS с использованием SSM

В этой статье описывается, как синхронизируется информация между HDFS и SSM в случаях, когда включена опция Enable SmartFileSystem for Hadoop в ADCM и когда SSM-правила используют действие sync. Объясняется, как SSM собирает метаданные HDFS, отслеживает изменения файлов и планирует действия для поддержания согласованности данных между исходным и целевым кластерами.

Загрузка файлов из HDFS

Чтобы реплицировать файлы HDFS из одного кластера в другой, SSM сначала должен собрать информацию о них. Для этого в SSM предусмотрен отдельный сервис HDFS fetcher, который запускается при старте SSM и асинхронно получает метаданные о файлах и директориях в HDFS. Эти метаданные сохраняются в SSM Metastore в отдельной таблице file.

HDFS fetcher использует комбинированный механизм извлечения метаданных из NameNode, который состоит из двух этапов: создание снимка пространства имен (опциональный) и подписка на события HDFS (обязательный).

Сохранение пространства имен

Если SSM запускает репликацию кластера HDFS впервые или если последний обработанный идентификатор транзакции EditLog больше недоступен (поскольку NameNode периодически архивирует или ротирует старые EditLog), SSM полностью сохраняет пространство имен HDFS.

Для этого SSM очищает существующую таблицу file и формирует новый снимок пространства имен HDFS. Список всех файлов и директорий составляется параллельно, с помощью вызовов клиента HDFS. Метаданные для каждого обнаруженного файла затем сохраняются в таблице file.

Уровень параллелизма для этой операции можно настроить с помощью параметра smart.namespace.fetcher.producers.num. Эта опция определяет количество одновременных подключений, используемых для составления списка файлов.

Подписка на события inotify

Если в SSM Metastore сохранен корректный идентификатор последней обработанной транзакции EditLog или первоначальный снимок, HDFS fetcher переключается в режим прослушивания событий.

HDFS предоставляет API для подписки на события файловой системы (события inotify). Эти уведомления доставляются пакетами и содержат уникальный монотонно возрастающий transaction_id. SSM использует это поле для отслеживания прогресса HDFS fetcher.

HDFS позволяет клиентам получать либо все события, либо только те, которые произошли после указанного идентификатора транзакции. Сохранив transaction_id последнего обработанного пакета в SSM Metastore, SSM фактически подписывается только на новые события HDFS.

События извлекаются с помощью метода DFSClient.getInotifyEventStream(), который возвращает цепочку пакетов событий.

SSM обрабатывает следующие типы inotify-событий:

  • CREATE — генерируется после создания файла;

  • CLOSE — генерируется после полной записи данных и закрытия файла;

  • RENAME — генерируется при переименовании файла;

  • METADATA — генерируется при изменении следующих метаданных файла:

    • время модификации (modification time);

    • время доступа (access time);

    • владелец (owner);

    • группа (group);

    • права доступа (permissions);

    • расширенные атрибуты (extended attributes, xattrs);

  • UNLINK — генерируется при удалении файла.

В зависимости от типа события SSM может создать новую запись в таблице file либо обновить существующую для конкретного файла.

Фильтрация файлов по пути

SSM позволяет исключить определенные файлы или директории из обработки, указав регулярные выражения Java, разделенные запятыми, в параметре smart.ignore.path.templates.

Если необходимо отслеживать только определенные директории, их можно указать в параметре smart.cover.dirs в виде списка путей, разделенных запятыми.

Оба параметра можно использовать одновременно.

Репликация в HDFS

Действие sync

Репликацию HDFS можно запустить вызвав SSM-правило с действием sync. Обратите внимание, что оно может использоваться только в составе правил и не может выполняться как отдельная команда (cmdlet).

Действие sync поддерживает следующие аргументы:

  • dest $address (обязательный) — абсолютный путь к целевой директории HDFS;

  • preserve (необязательный) — список атрибутов файла для передачи, разделенный запятыми:

    • owner (передается по умолчанию);

    • group (передается по умолчанию);

    • permissions (передаются по умолчанию);

    • replication;

    • modification-time.

Плагин правил

Когда запускается правило с действием sync, SSM sync rule plugin создает объект метаданных репликации и сохраняет его в таблице backup_file в SSM Metastore. Этот объект содержит информацию об исходных и целевых директориях репликации (или шаблонах исходных каталогов).

Плагин также создает объект FileDiff для исходного каталога репликации. FileDiff — это структура данных, которая хранит всю информацию, необходимую для репликации событий файлов в целевой кластер. Эта информация впоследствии используется компонентом CopyScheduler при планировании действий sync.

Сохранение различий в файлах при получении событий

Если хотя бы одно включенное правило содержит действие sync (в SSM Metastore существует как минимум один объект метаданных репликации), HDFS fetcher также начинает создавать объекты FileDiff.

Эти объекты создаются для файлов, расположенных в исходных директориях, и сохраняются в таблице file_diff со статусом PENDING.

Планирование действия sync

При запуске правила с действием sync SSM выбирает все файлы, соответствующие заданным пользователем фильтрам и имеющие связанные объекты FileDiff со статусом PENDING.

Для каждого выбранного файла SSM передает путь к файлу в качестве аргумента src действия sync и пытается запланировать его обработку.

Планировщик действий асинхронно генерирует объекты FileDiff всех файлов в директориях для репликации и сохраняет их в SSM Metastore. Затем он периодически извлекает записи FileDiff со статусом PENDING и группирует их в цепочки файлов (file chain).

Цепочка файла — это очередь операций для репликации, относящихся с конкретному файлу (сгруппированные по его пути). Операции внутри цепочки могут объединяться для повышения эффективности.

Планировщик выполняет действие sync только если для запрашиваемого пути src уже существует цепочка файла. Планировщик извлекает самый старый FileDiff из цепочки и преобразует действие sync в одну из операций:

  • copy

  • dircopy

  • delete

  • rename

  • metadata

Конкретная операция зависит от типа изменения, описанного в FileDiff.

После успешного завершения действия соответствующий FileDiff помечается как примененный. Планировщик также выполняет повторные попытки для неудачных операций и применяет ограничение скорости (throttling) для операций копирования, чтобы не перегружать систему.

Для предотвращения одновременных изменений одного и того же файла SSM использует механизм блокировки на основе параллельного набора путей к файлам (fileLocks). Пока путь файла заблокирован, для него не могут быть запланированы другие действия sync до снятия блокировки. Блокировка устанавливается при запуске действия и снимается после его завершения или при возникновении ошибки.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней