Снапшоты

Снапшот HDFS – это снимок файловой системы на момент времени, доступен только для чтения. Снапшоты могут быть сделаны в поддереве файловой системы или во всей файловой системе. Распространенные случаи использования моментальных снимков – резервное копирование данных, защита от ошибок пользователя и аварийное восстановление.

Реализация снапшотов HDFS очень рациональна:

  • Создание снапшота происходит мгновенно: стоимость O(1) без учета времени поиска inode;
  • Дополнительная память используется только при внесении изменений относительно снапшота: использование памяти равно O(M), где M – количество измененных файлов/каталогов;
  • Блоки в datanodes не копируются: файлы снапшота записывают список блоков и размер файла. Копирование данных не производится.

Снапшоты могут быть сделаны в любом каталоге, как только этот каталог установлен как snapshottable. Каталог snapshottable способен вместить 65 536 одновременных снимков, при этом количество директорий snapshottable не ограничено. Администраторы могут задать для любого каталога значение snapshottable. Данный каталог нельзя ни удалить, ни переименовать, пока в нем находятся снапшоты.

Вложенные каталоги в snapshottable в настоящее время не допускаются. Другими словами, директория не может быть установлена как snapshottable, если хотя бы один ее каталог-родитель или каталог-потомок является snapshottable.

Для доступа к снапшотам каталога snapshottable используется компонент пути .snapshot. Например, /foo – каталог snapshottable, тогда /foo/bar является файлом/директорией в нем, где /foo имеет снапшот s0. В результате путь /foo/.snapshot/s0/bar ссылается на копию снимка /foo/bar. Обычный API и CLI могут работать с путями .snapshot. Далее приведены некоторые примеры.

  • Перечисление всех снапшотов в директории snapshottable:
hdfs dfs -ls /foo/.snapshot
  • Перечисление файлов в снапшоте s0:
hdfs dfs -ls /foo/.snapshot/s0
  • Копирование файла из снапшота s0:
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp

Important

В примере используется опция preserve для сохранения меток времени, владельца, прав доступа, списков ACL и XAttrs

Обновление до версии HDFS со снапшотами

Функция снапшота в HDFS вводит новое зарезервированное имя пути, используемое для взаимодействия со снимками: .snapshot. При обновлении с более старой версии HDFS, которая не поддерживает снапшоты, существующие пути с именем .snapshot необходимо сначала переименовать или удалить, чтобы избежать конфликта с зарезервированным путем в актуальной верии системы.

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

Операции администратора

Описанные далее операции возможны только при наличии привилегий суперпользователя.

Allow – разрешение создания снапшотов. При успешном завершении операции каталог становится snapshottable.

Команда:

hdfs dfsadmin -allowSnapshot <path>

Аргумент:

  • path – путь к директории snapshottable.

Disallow – запрещение на создание снапшотов в каталоге. Все снапшоты директории должны быть удалены перед введением запрета.

Команда:

hdfs dfsadmin -disallowSnapshot <path>

Аргумент:

  • path – путь к директории snapshottable.

Операции пользователя

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

Create – создание снапшота в каталоге snapshottable. Операция требует привилегии владельца директории.

Команда:

hdfs dfs -createSnapshot <path> [<snapshotName>]

Аргумент:

  • path – путь к директории snapshottable;
  • snapshotName – имя снапшота, необязательный аргумент. Если значение не задано, имя по умолчанию генерируется с использованием метки времени в формате ‘s’yyyyMMdd-HHmmss.SSS, например, s20130412-151029.033.

Delete – удаление снапшота из каталога snapshottable. Операция требует привилегии владельца директории.

Команда:

hdfs dfs -deleteSnapshot <path> <snapshotName>

Аргумент:

  • path – путь к директории snapshottable;
  • snapshotName – имя снапшота.

Rename – переименование снапшота. Операция требует привилегии владельца каталога snapshottable.

Команда:

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

Аргумент:

  • path – путь к директории snapshottable;
  • oldName – старое имя снапшота;
  • newName – новое имя снапшота.

Get Snapshottable Directory Listing – получение списка всех каталогов snapshottable, где у текущего пользователя есть разрешение на создание снапшотов.

Команда:

hdfs lsSnapshottableDir

Get Snapshots Difference Report – получение различия между двумя снапшотами. Операция требует прав доступа на чтение для всех файлов/каталогов в обоих снапшотах.

Команда:

hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>

Аргумент:

  • path – путь к директории snapshottable;
  • fromSnapshot – имя начального снапшота;
  • toSnapshot – имя конечного снапшота.

Возможные результаты проведенных операций:

  • + – файл/каталог создан;
  • - – файл/каталог удален;
  • M – файл/каталог изменен;
  • R – файл/каталог переименован.

Запись RENAME указывает, что файл/каталог переименован, но все еще находится в той же директории snapshottable. Файл/каталог считается удаленным, если он переименован за пределами директории snapshottable. Файл/каталог, переименованный из внешней директории snapshottable, считается вновь созданным.

Отчет о различиях снапшотов не гарантирует одинаковую последовательность вывода результатов операций. Например, если переименовать каталог /foo в /foo2, а затем добавить новые данные в файл /foo2/bar, то отчет о различиях следующий:

R. /foo -> /foo2
M. /foo/bar

То есть об изменениях файлов/каталогов в переименованном каталоге сообщается с использованием исходного пути.