HDFS 스냅샷

HDFS 스냅샷 (Snapshots)

파일 시스템의 읽기 전용 시점(point-in-time) 복사본인 HDFS 스냅샷을 설명하는 문서예요. 스냅샷 생성·삭제·이름 변경, 스냅샷 가능 디렉터리, 관리자/사용자 연산과 명령을 다룹니다. 데이터 백업, 사용자 실수 방지, 재해 복구에 사용됩니다.

출처: 문서

본문

개요 (Overview)

HDFS 스냅샷은 파일 시스템의 읽기 전용 시점 복사본입니다. 파일 시스템의 하위 트리나 전체 파일 시스템에 대해 스냅샷을 찍을 수 있어요. 스냅샷의 일반적인 사용 사례는 데이터 백업, 사용자 오류로부터의 보호, 재해 복구입니다.

HDFS 스냅샷 구현은 효율적입니다.

  • 스냅샷 생성은 즉각적입니다. 비용은 inode 조회 시간을 제외하면 _O(1)_입니다.
  • 추가 메모리는 스냅샷을 기준으로 수정이 있을 때만 사용합니다. 메모리 사용량은 _O(M)_이며, _M_은 수정된 파일/디렉터리 수입니다.
  • 데이터노드의 블록은 복사되지 않습니다. 스냅샷 파일은 블록 목록과 파일 크기를 기록할 뿐이고 데이터 복사는 없어요.
  • 스냅샷은 일반 HDFS 연산에 악영향을 주지 않습니다. 수정 사항을 역시간순으로 기록해서 현재 데이터에 직접 접근할 수 있고, 스냅샷 데이터는 현재 데이터에서 수정 사항을 빼서 계산합니다.

스냅샷 가능 디렉터리 (Snapshottable Directories)

디렉터리가 snapshottable(스냅샷 가능)로 설정되면 그 디렉터리에 스냅샷을 찍을 수 있어요. 스냅샷 가능 디렉터리는 최대 65,536개의 동시 스냅샷을 담을 수 있습니다. 스냅샷 가능 디렉터리 수에는 제한이 없어요. 관리자는 어떤 디렉터리든 스냅샷 가능으로 설정할 수 있습니다. 스냅샷 가능 디렉터리에 스냅샷이 있으면, 모든 스냅샷이 삭제되기 전에는 그 디렉터리를 삭제하거나 이름을 바꿀 수 없어요.

중첩된 스냅샷 가능 디렉터리는 현재 허용되지 않습니다. 즉, 조상이나 자손이 스냅샷 가능 디렉터리이면 그 디렉터리를 스냅샷 가능으로 설정할 수 없어요.

스냅샷 경로 (Snapshot Paths)

스냅샷 가능 디렉터리의 경로 구성 요소 _".snapshot"_은 그 스냅샷에 접근하는 데 사용됩니다. /foo가 스냅샷 가능 디렉터리이고, /foo/bar가 /foo 안의 파일/디렉터리이며, /foo가 스냅샷 s0를 가진다고 합시다. 그러면 경로 /foo/.snapshot/s0/bar는 /foo/bar의 스냅샷 복사본을 가리킵니다. 일반 API와 CLI는 ".snapshot" 경로와 함께 동작할 수 있어요. 다음은 몇 가지 예시입니다.

  • 스냅샷 가능 디렉터리의 모든 스냅샷 나열:
hdfs dfs -ls /foo/.snapshot
  • 스냅샷 s0의 파일 나열:
hdfs dfs -ls /foo/.snapshot/s0
  • 스냅샷 s0에서 파일 복사:
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp

참고: 이 예시는 preserve 옵션을 사용해 타임스탬프, 소유권, 권한, ACL, XAttr을 보존합니다.

스냅샷이 있는 HDFS 버전으로 업그레이드 (Upgrade)

HDFS 스냅샷 기능은 스냅샷과 상호작용하는 데 사용되는 새 예약 경로 이름 .snapshot을 도입합니다. 스냅샷을 지원하지 않는 옛 HDFS 버전에서 업그레이드할 때는, 예약 경로와 충돌하지 않도록 기존의 .snapshot 이름을 가진 경로를 먼저 이름을 바꾸거나 삭제해야 해요. 자세한 내용은 HDFS 사용자 가이드의 업그레이드 절을 참고하세요.

스냅샷 연산 (Snapshot Operations)

관리자 연산

이 절에서 설명하는 연산은 슈퍼유저 권한이 필요합니다.

스냅샷 허용 (Allow Snapshots)

디렉터리의 스냅샷 생성을 허용합니다. 연산이 성공하면 그 디렉터리가 스냅샷 가능이 됩니다.

  • 명령:
hdfs dfsadmin -allowSnapshot <path>
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.

HdfsAdmin의 대응 Java API void allowSnapshot(Path path)도 참고하세요.

스냅샷 금지 (Disallow Snapshots)

디렉터리의 스냅샷 생성을 금지합니다. 스냅샷을 금지하기 전에 디렉터리의 모든 스냅샷을 삭제해야 해요.

  • 명령:
hdfs dfsadmin -disallowSnapshot <path>
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.

HdfsAdmin의 대응 Java API void disallowSnapshot(Path path)도 참고하세요.

SnapshotTrash 제공 (Provision SnapshotTrash)

하나 또는 모든 스냅샷 가능 디렉터리에 휴지통 루트(trash root)를 제공합니다.

  • 명령:
hdfs dfsadmin -provisionSnapshotTrash <path> [-all]
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.
-all 선택 인자. 설정하면 모든 스냅샷 가능 디렉터리에 휴지통 루트를 제공.

HdfsAdmin의 대응 Java API void provisionSnapshotTrash(Path path)도 참고하세요.

사용자 연산

이 절은 사용자 연산을 설명합니다. HDFS 슈퍼유저는 개별 연산의 권한 요구사항을 충족하지 않아도 모든 연산을 수행할 수 있어요.

스냅샷 생성 (Create Snapshots)

스냅샷 가능 디렉터리의 스냅샷을 생성합니다. 이 연산은 스냅샷 가능 디렉터리의 소유자 권한이 필요해요.

  • 명령:
hdfs dfs -createSnapshot <path> [<snapshotName>]
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.
snapshotName 선택 인자인 스냅샷 이름. 생략하면 "s"yyyyMMdd-HHmmss.SSS 형식의 타임스탬프로 기본 이름이 생성. 예: "s20130412-151029.033".

FileSystem의 대응 Java API Path createSnapshot(Path path)와 Path createSnapshot(Path path, String snapshotName)도 참고하세요. 이 메서드에서 스냅샷 경로가 반환됩니다.

스냅샷 삭제 (Delete Snapshots)

스냅샷 가능 디렉터리에서 스냅샷을 삭제합니다. 이 연산은 스냅샷 가능 디렉터리의 소유자 권한이 필요해요.

  • 명령:
hdfs dfs -deleteSnapshot <path> <snapshotName>
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.
snapshotName 스냅샷 이름.

FileSystem의 대응 Java API void deleteSnapshot(Path path, String snapshotName)도 참고하세요.

스냅샷 이름 변경 (Rename Snapshots)

스냅샷 이름을 변경합니다. 이 연산은 스냅샷 가능 디렉터리의 소유자 권한이 필요해요.

  • 명령:
hdfs dfs -renameSnapshot <path> <oldName> <newName>
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.
oldName 옛 스냅샷 이름.
newName 새 스냅샷 이름.

FileSystem의 대응 Java API void renameSnapshot(Path path, String oldName, String newName)도 참고하세요.

스냅샷 가능 디렉터리 목록 얻기

현재 사용자가 스냅샷을 찍을 권한이 있는 모든 스냅샷 가능 디렉터리를 가져옵니다.

  • 명령:
hdfs lsSnapshottableDir
  • 인자: 없음

DistributedFileSystem의 대응 Java API SnapshottableDirectoryStatus[] getSnapshottableDirectoryListing()도 참고하세요.

스냅샷 목록 얻기

스냅샷 가능 디렉터리의 모든 스냅샷을 가져옵니다.

  • 명령:
hdfs lsSnapshot <snapshotRoot>
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.

DistributedFileSystem의 대응 Java API SnapshotStatus[] getSnapshotListing()도 참고하세요.

스냅샷 차이 보고서 얻기

두 스냅샷 사이의 차이를 가져옵니다. 이 연산은 두 스냅샷의 모든 파일/디렉터리에 대한 읽기 접근 권한이 필요해요.

  • 명령:
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
  • 인자:
인자 설명
path 스냅샷 가능 디렉터리의 경로.
fromSnapshot 시작 스냅샷 이름.
toSnapshot 끝 스냅샷 이름.

snapshotDiff는 두 스냅샷 사이 또는 스냅샷과 디렉터리의 현재 상태 사이의 차이 보고서를 얻는 데 사용할 수 있어요. 사용자는 "."으로 현재 상태를 나타낼 수 있습니다.

  • 결과:
기호 설명
+ 파일/디렉터리가 생성됨.
- 파일/디렉터리가 삭제됨.
M 파일/디렉터리가 수정됨.
R 파일/디렉터리가 이름이 바뀜.

RENAME 항목은 파일/디렉터리가 이름이 바뀌었지만 여전히 같은 스냅샷 가능 디렉터리 안에 있음을 나타냅니다. 스냅샷 가능 디렉터리 밖으로 이름이 바뀐 파일/디렉터리는 삭제된 것으로 보고되고, 스냅샷 가능 디렉터리 밖에서 이름이 바뀌어 들어온 파일/디렉터리는 새로 생성된 것으로 보고됩니다.

스냅샷 차이 보고서는 같은 연산 순서를 보장하지 않아요. 예를 들어 디렉터리 _"/foo"_를 _"/foo2"_로 이름을 바꾼 다음 파일 _"/foo2/bar"_에 새 데이터를 append하면 차이 보고서는 다음과 같습니다.

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

즉 이름이 바뀐 디렉터리 아래의 파일/디렉터리 변경은 이름 바꾸기 전의 원래 경로(위 예시의 "/foo/bar")로 보고됩니다.

DistributedFileSystem의 대응 Java API SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot)도 참고하세요.

더 알아보기 (Learn more)