Снепшоты в HDFS

Обзор

Снепшот — это доступный только для чтения образ состояния метаданных файловой системы на определенный момент времени. При создании снепшота копируются только метаданные файла: список блоков и его размер. Несмотря на то, что сами данные не сохраняются, снепшоты используются для резервного копирования и экстренного восстановления данных.

В HDFS можно создать снепшот определенной директории или всей системы. Это требует незначительного количества ресурсов кластера и выполняется мгновенно.

Разрешение на создание снепшотов

Прежде чем сделать снепшот, администратор должен разрешить создание снепшотов для директории, поставив для нее статус snapshottable. Это можно сделать с помощью команды allowSnapshot.

Только одна директория в пути может иметь статус snapshottable. Вложенные snapshottable-директории не допускаются. Это значит, что для директории нельзя разрешить снепшоты, если они разрешены для ее родительской или дочерней директории.

При создании снепшота система создает каталог .snapshot, в котором будут храниться снепшоты. Каждая директория, для которой разрешены снепшоты, может одновременно содержать до 65536 снепшотов. Директорию, у которой есть снепшоты, нельзя удалить или переименовать пока не будут удалены все ее снепшоты.

ПРИМЕЧАНИЕ

Создание снепшотов не поддерживается в версиях Hadoop, выпущенных до версии 3.1.2. При обновлении со старой версии убедитесь, что в системе нет директорий с именем .snapshot, чтобы избежать конфликтов с зарезервированным путем.

Список директорий, для которых разрешено создание снепшотов, и доступных для них снепшотов, можно найти в пользовательском интерфейсе NameNode на странице Snapshots.

Страница доступна по адресу:

http://<HOST>:9870/dfshealth.html#tab-snapshot/

Здесь <HOST> это IP-адрес или FQDN хоста NameNode.

NameNode UI: страница Snapshots
NameNode UI: страница Snapshots
NameNode UI: страница Snapshots
NameNode UI: страница Snapshots

Путь к снепшотам

Чтобы обращаться к файлам в снепшоте с помощью вызовов CLI и API, укажите путь следующим образом:

/<PATH>/.snapshot/<NAME>/<FILE>

Здесь:

  • <PATH> — путь к директории, для которой сделан снепшот;

  • <NAME> — имя нужного снепшота;

  • <FILE> — относительный путь к нужному файлу в директории.

Команды CLI

Разрешение снепшотов

Разрешает создание снепшотов для указанной директории. Для выполнения команды требуются права суперпользователя HDFS.

$ hdfs dfsadmin -allowSnapshot <path>

Здесь <path> — это путь к директории, для которой нужно разрешить создание снепшотов.

Запрет снепшотов

Снимает разрешение на создание снепшотов для указанной директории. Перед снятием разрешения необходимо удалить все снепшоты каталога. Для выполнения команды требуются права суперпользователя HDFS.

$ hdfs dfsadmin -disallowSnapshot <path>

Здесь <path> — это путь к директории, для которой нужно снять разрешение на создание снепшотов.

Список snapshottable-директорий

Возвращает список директорий, принадлежащих текущему пользователю, для которых разрешены снепшоты. При запуске от имени суперпользователя возвращает список всех директорий системы, для которых разрешены снепшоты.

$ hdfs lsSnapshottableDir

Список снепшотов

Возвращает список всех снепшотов директории.

$ hdfs dfs -ls /<DIR>/.snapshot

Здесь <DIR> — имя директории, для которой разрешены снепшоты.

Список файлов в снепшоте

Возвращает список каталогов и файлов в снепшоте.

$ hdfs dfs -ls /<DIR>/.snapshot/<NAME>/

Здесь:

  • <DIR> — имя директории, для которой разрешены снепшоты;

  • <NAME> — имя снепшота.

Восстановление из снепшота

Чтобы восстановить файл или каталог из снепшота, используйте команду копирования, например cp или distcp, передав путь к снимку в качестве источника копирования.

Пример команды для восстановления удаленного файла text.txt путем копирования его из снимка image-1:

$ hdfs dfs -cp -ptopax hdfs://127.0.0.1:8020/tmp/test/.snapshot/image-1/text.txt hdfs://127.0.0.1:8020/tmp/test/text.txt

Опция -ptopax используется для сохранения времени создания файла, информации о владельце, разрешений, списков ACL и XAttr.

Создание снепшота

Создает снепшот указанной директории. Для директории должны быть разрешены снепшоты.

$ hdfs dfs -createSnapshot <path> <snapshotName>

Здесь:

  • <path> — путь к директории, для которой разрешены снепшоты.

  • <snapshotName> — имя снепшота. Это необязательный аргумент. Если имя не указано, система сгенерирует имя, используя метку времени.

Удаление снепшота

Удаляет указанный снепшот.

$ hdfs dfs -deleteSnapshot <path> <snapshotName>

Здесь:

  • <path> — путь к директории, для которой разрешены снепшоты;

  • <snapshotName> — имя снепшота.

Переименование снепшота

Переименовывает указанный снепшот.

$ hdfs dfs -renameSnapshot <path> <oldName> <newName>

Здесь:

  • <path> — путь к директории, для которой разрешены снепшоты;

  • <oldName> — текущее имя снепшота;

  • <newName> — новое имя снепшота.

Сравнение снепшотов

Выводит отчет о разнице между двумя снимками или между снимком и текущим состоянием директории.

$ hdfs snapshotDiff <path> <start> <end>

Здесь:

  • <path> — путь к директории, для которой разрешены снепшоты;

  • <start> — имя исходного снепшота или ., если необходимо сравнить с текущим состоянием директории;

  • <end> — имя последующего снепшота или ., если необходимо сравнить с текущим состоянием директории.

Интерпретация результатов:

  • + — файл или каталог был создан;

  • - — файл или каталог был удален;

  • M — файл или каталог был изменен;

  • R — файл или каталог был переименован.

Пример отчета:

Difference between snapshot image-1 and current directory under directory /tmp/test:
M       .
+       ./text-2.txt
+       ./text.txt
-       ./text.txt
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней