아카이브 저장소, SSD 및 메모리
아카이브 저장소, SSD 및 메모리 (Archival Storage, SSD & Memory)
Archival Storage(아카이브 저장)는 늘어나는 저장 용량을 컴퓨트 용량으로부터 분리하는 솔루션입니다. 밀도가 더 높고 덜 비싼 저장 매체를 갖추면서 컴퓨트 파워가 낮은 노드들이 등장하고 있으며, 이를 클러스터의 콜드 스토리지(cold storage)로 사용할 수 있습니다. 정책에 따라 핫(hot) 데이터를 콜드로 이동할 수 있습니다. 콜드 스토리지에 노드를 더 추가하면 클러스터의 컴퓨트 용량과 무관하게 저장 공간을 늘릴 수 있습니다.
Heterogeneous Storage와 Archival Storage가 제공하는 프레임워크는 HDFS 아키텍처를 일반화해 SSD와 메모리를 포함한 다른 종류의 저장 매체를 포함시킵니다. 사용자는 더 나은 성능을 위해 SSD나 메모리에 데이터를 저장하기로 선택할 수 있습니다.
저장 유형과 저장 정책
저장 유형: ARCHIVE, DISK, SSD, RAM_DISK 및 NVDIMM
Heterogeneous Storage의 첫 단계(HDFS-2832)는 데이터노드 저장 모델을, 여러 물리 저장 매체에 대응할 수 있는 단일 저장소에서, 각 저장소가 하나의 물리 저장 매체에 대응하는 저장소의 집합으로 바꾸었습니다. 또한 DISK와 SSD라는 저장 유형 개념을 추가했습니다. 여기서 DISK가 기본 저장 유형입니다.
높은 저장 밀도(페타바이트 단위의 저장)를 가지지만 컴퓨트 파워가 적은 새 저장 유형 ARCHIVE가 아카이브 저장을 지원하기 위해 추가되었습니다.
단일 복제본 파일을 메모리에 쓰는 것을 지원하기 위해 또 다른 새 저장 유형 RAM_DISK가 추가되었습니다.
Hadoop 3.4부터 전원이 꺼져도 저장된 데이터를 유지할 수 있는 비휘발성 메모리에 복제본 파일을 쓰는 것을 지원하기 위해 새 저장 유형 NVDIMM이 추가되었습니다.
저장 정책: Hot, Warm, Cold, All_SSD, One_SSD, Lazy_Persist, Provided 및 All_NVDIMM
파일이 저장 정책에 따라 서로 다른 저장 유형에 저장될 수 있도록 **저장 정책(storage policy)**이라는 새 개념이 도입되었습니다.
다음과 같은 저장 정책이 있습니다.
- Hot - 저장과 컴퓨트 모두를 위한 것. 인기 있고 여전히 처리를 위해 사용되는 데이터가 이 정책에 머무릅니다. 블록이 hot이면 모든 복제본이 DISK에 저장됩니다.
- Cold - 컴퓨트가 제한된 저장 전용. 더 이상 사용되지 않거나 아카이브할 필요가 있는 데이터가 핫 스토리지에서 콜드 스토리지로 이동됩니다. 블록이 cold이면 모든 복제본이 ARCHIVE에 저장됩니다.
- Warm - 부분적으로 hot, 부분적으로 cold. 블록이 warm이면 일부 복제본은 DISK에, 나머지 복제본은 ARCHIVE에 저장됩니다.
- All_SSD - 모든 복제본을 SSD에 저장.
- One_SSD - 복제본 중 하나를 SSD에 저장. 나머지 복제본은 DISK에 저장.
- Lazy_Persist - 단일 복제본의 블록을 메모리에 쓰기 위한 것. 복제본은 먼저 RAM_DISK에 쓰인 다음 DISK에 지연(lazily) 영속화됩니다.
- Provided - HDFS 밖에 데이터를 저장. HDFS Provided Storage도 참고하세요.
- All_NVDIMM - 모든 복제본을 NVDIMM에 저장.
더 형식적으로, 저장 정책은 다음 필드로 구성됩니다.
- 정책 ID(Policy ID)
- 정책 이름(Policy name)
- 블록 배치를 위한 저장 유형 목록
- 파일 생성을 위한 폴백 저장 유형 목록
- 복제를 위한 폴백 저장 유형 목록
공간이 충분할 때 블록 복제본은 #3에 지정된 저장 유형 목록에 따라 저장됩니다. 목록 #3의 일부 저장 유형의 공간이 부족하면 #4와 #5에 지정된 폴백 저장 유형 목록이 각각 파일 생성과 복제를 위해 공간이 부족한 저장 유형을 대체하는 데 사용됩니다.
다음은 전형적인 저장 정책 표입니다.
| 정책 ID | 정책 이름 | 블록 배치 (n 복제본) | 생성용 폴백 저장소 | 복제용 폴백 저장소 |
|---|---|---|---|---|
| 15 | Lazy_Persist | RAM_DISK: 1, DISK: n-1 | DISK | DISK |
| 14 | All_NVDIMM | NVDIMM: n | DISK | DISK |
| 12 | All_SSD | SSD: n | DISK | DISK |
| 10 | One_SSD | SSD: 1, DISK: n-1 | SSD, DISK | SSD, DISK |
| 7 | Hot (default) | DISK: n | ARCHIVE | |
| 5 | Warm | DISK: 1, ARCHIVE: n-1 | ARCHIVE, DISK | ARCHIVE, DISK |
| 2 | Cold | ARCHIVE: n | ||
| 1 | Provided | PROVIDED: 1, DISK: n-1 | PROVIDED, DISK | PROVIDED, DISK |
참고 1: Lazy_Persist 정책은 단일 복제본 블록에만 유용합니다. 복제본이 둘 이상인 블록의 경우 모든 복제본이 DISK에 쓰입니다. 복제본 중 하나만 RAM_DISK에 쓰는 것은 전반적인 성능을 향상시키지 않기 때문입니다.
참고 2: 스트라이핑 레이아웃의 이레이저 코딩 파일에 적합한 저장 정책은 All_SSD, Hot, Cold 및 All_NVDIMM입니다. 따라서 사용자가 언급된 정책 외의 정책을 스트라이프 EC 파일에 설정하면, 블록 생성이나 이동 시 그 정책을 따르지 않습니다.
저장 정책 해석 (Storage Policy Resolution)
파일이나 디렉터리가 생성될 때 그 저장 정책은 지정되지 않았습니다. 저장 정책은 storagepolicies -setStoragePolicy 명령으로 지정할 수 있습니다. 파일이나 디렉터리의 **유효 저장 정책(effective storage policy)**은 다음 규칙으로 해석됩니다.
파일이나 디렉터리에 저장 정책이 지정되어 있으면 그것을 반환합니다.
지정되지 않은 파일이나 디렉터리에 대해, 루트 디렉터리이면 기본 저장 정책을 반환합니다. 그렇지 않으면 부모의 유효 저장 정책을 반환합니다.
유효 저장 정책은 storagepolicies -getStoragePolicy 명령으로 얻을 수 있습니다.
설정 (Configuration)
dfs.storage.policy.enabled- 저장 정책 기능을 활성화/비활성화. 기본값은 true.dfs.storage.default.policy- 정책 이름으로 기본 저장 정책을 설정. 기본값은 HOT. 가능한 모든 정책은 enum StoragePolicy에 정의되어 있으며 LAZY_PERSIST, ALL_SSD, ONE_SSD, HOT, WARM, COLD, PROVIDED 및 ALL_NVDIMM을 포함합니다.dfs.datanode.data.dir- 각 데이터 노드에서 쉼표로 구분된 저장 위치는 저장 유형으로 태그 지정해야 합니다. 이렇게 하면 저장 정책이 정책에 따라 블록을 서로 다른 저장 유형에 배치할 수 있습니다. 예를 들어:- DISK의 데이터노드 저장 위치
/grid/dn/disk0는[DISK]file:///grid/dn/disk0로 구성해야 합니다. - SSD의 데이터노드 저장 위치
/grid/dn/ssd0는[SSD]file:///grid/dn/ssd0로 구성해야 합니다. - ARCHIVE의 데이터노드 저장 위치
/grid/dn/archive0는[ARCHIVE]file:///grid/dn/archive0로 구성해야 합니다. - RAM_DISK의 데이터노드 저장 위치
/grid/dn/ram0는[RAM_DISK]file:///grid/dn/ram0로 구성해야 합니다. - NVDIMM의 데이터노드 저장 위치
/grid/dn/nvdimm0는[NVDIMM]file:///grid/dn/nvdimm0로 구성해야 합니다.
- DISK의 데이터노드 저장 위치
데이터노드 저장 위치에 저장 유형이 명시적으로 태그되지 않으면 기본 저장 유형은 DISK입니다.
때로 사용자는 서로 다른 저장 유형의 여러 볼륨을 가리키도록 DataNode 데이터 디렉터리를 구성할 수 있습니다. 저장 위치를 초기화하기 전에 볼륨이 올바르게 마운트되었는지 확인하는 것이 중요합니다. 사용자는 다음 키로 저장소 키에 대한 파일시스템을 강제할 수 있습니다: dfs.datanode.storagetype.*.filesystem - 여기서 '*'를 아무 저장 유형으로 바꾸세요. 예: dfs.datanode.storagetype.ARCHIVE.filesystem=fuse_filesystem.
저장 정책 기반 데이터 이동
기존 파일/디렉터리에 새 저장 정책을 설정하면 네임스페이스의 정책이 바뀌지만, 블록이 물리적으로 저장 매체를 가로질러 이동하지는 않습니다. 다음 2가지 옵션을 통해 사용자는 설정된 새 정책에 따라 블록을 이동할 수 있습니다. 파일/디렉터리에 새 정책을 변경/설정한 후에는 원하는 데이터 이동을 달성하기 위해 다음 옵션 중 하나도 수행해야 합니다. 두 옵션은 동시에 실행할 수 없습니다.
Storage Policy Satisfier (SPS)
사용자가 파일/디렉터리의 저장 정책을 변경하면 HdfsAdmin API satisfyStoragePolicy()를 호출해 설정된 새 정책에 따라 블록을 이동할 수 있습니다. namenode 외부에서 실행되는 SPS 도구는 새 정책 집합과 배치된 물리 블록 사이의 저장 불일치를 주기적으로 스캔합니다. 이는 사용자가 satisfyStoragePolicy를 호출한 파일/디렉터리만 추적합니다. SPS가 파일에 대해 이동해야 할 일부 블록을 식별하면 데이터노드에 블록 이동 태스크를 스케줄링합니다. 이동에 실패가 있으면 SPS는 새 블록 이동 태스크를 보내 다시 시도합니다.
SPS는 namenode 외부의 외부 서비스로 활성화하거나, namenode를 재시작하지 않고 동적으로 비활성화할 수 있습니다.
상세 설계 문서는 Storage Policy Satisfier(SPS) (HDFS-10285)에서 찾을 수 있습니다.
참고: 사용자가 디렉터리에서 satisfyStoragePolicy() API를 호출하면 SPS가 모든 하위 디렉터리를 스캔하고 정책을 만족시키기 위해 모든 파일을 고려합니다.
HdfsAdmin API: public void satisfyStoragePolicy(final Path path) throws IOException
인자:
| 인자 | 설명 |
|---|---|
path |
블록 저장 이동이 필요한 경로. |
설정 (Configurations)
dfs.storage.policy.satisfier.mode- NN 외부의 외부 서비스를 활성화하거나 SPS를 비활성화하는 데 사용. 다음 문자열 값을 지원합니다 -external,none. external 값을 구성하면 SPS가 활성화된 것이고 none은 비활성화입니다. 기본값은 none입니다.dfs.storage.policy.satisfier.recheck.timeout.millis- Datanode에서 처리된 블록 저장 이동 명령 결과를 다시 확인하는 타임아웃.dfs.storage.policy.satisfier.self.retry.timeout.millis- 이 구성된 타임아웃 동안 Datanode에서 블록 이동 결과가 보고되지 않으면 재시도하는 타임아웃.
Mover - 새 데이터 마이그레이션 도구
데이터 아카이브를 위한 새 데이터 마이그레이션 도구가 추가되었습니다. 이 도구는 Balancer와 유사합니다. HDFS의 파일을 주기적으로 스캔해 블록 배치가 저장 정책을 만족하는지 확인합니다. 저장 정책을 위반하는 블록에 대해 복제본을 다른 저장 유형으로 이동해 저장 정책 요구 사항을 충족시킵니다. 가능할 때마다 항상 같은 노드 안에서 블록 복제본을 이동하려고 시도합니다. 그것이 불가능하면(예: 노드에 대상 저장 유형이 없을 때) 네트워크를 통해 블록 복제본을 다른 노드로 복사합니다.
명령:
hdfs mover [-p <files/dirs> | -f <local file name>]
인자:
| 인자 | 설명 |
|---|---|
-p <files/dirs> |
마이그레이션할 HDFS 파일/디렉터리의 공백 구분 목록을 지정합니다. |
-f <local file> |
마이그레이션할 HDFS 파일/디렉터리 목록이 담긴 로컬 파일을 지정합니다. |
-p와 -f 옵션이 모두 생략되면 기본 경로는 루트 디렉터리입니다.
관리자 참고 사항
StoragePolicySatisfier와 Mover 도구는 동시에 실행할 수 없습니다. Mover 인스턴스가 이미 트리거되어 실행 중이면 시작하는 동안 SPS가 비활성화됩니다. 그 경우 관리자는 Mover 실행이 끝났는지 확인한 다음 외부 SPS 서비스를 다시 활성화해야 합니다. 마찬가지로 SPS가 이미 활성화되어 있으면 Mover를 실행할 수 없습니다. 관리자가 Mover 도구를 명시적으로 실행하려면 먼저 SPS를 비활성화한 다음 Mover를 실행해야 합니다. NN 외부의 외부 서비스를 활성화하거나 SPS를 동적으로 비활성화하는 방법은 명령 절을 참고하세요.
저장 정책 명령 (Storage Policy Commands)
저장 정책 나열 (List Storage Policies)
모든 저장 정책을 나열합니다.
명령:
hdfs storagepolicies -listPolicies
인자: 없음.
저장 정책 설정 (Set Storage Policy)
파일이나 디렉터리에 저장 정책을 설정합니다.
명령:
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
인자:
| 인자 | 설명 |
|---|---|
-path <path> |
디렉터리나 파일을 가리키는 경로. |
-policy <policy> |
저장 정책의 이름. |
저장 정책 해제 (Unset Storage Policy)
파일이나 디렉터리에서 저장 정책을 해제합니다. unset 명령 후 가장 가까운 조상의 저장 정책이 적용되며, 어떤 조상에도 정책이 없으면 기본 저장 정책이 적용됩니다.
명령:
hdfs storagepolicies -unsetStoragePolicy -path <path>
인자:
| 인자 | 설명 |
|---|---|
-path <path> |
디렉터리나 파일을 가리키는 경로. |
저장 정책 가져오기 (Get Storage Policy)
파일이나 디렉터리의 저장 정책을 가져옵니다.
명령:
hdfs storagepolicies -getStoragePolicy -path <path>
인자:
| 인자 | 설명 |
|---|---|
-path <path> |
디렉터리나 파일을 가리키는 경로. |
저장 정책 충족 (Satisfy Storage Policy)
파일/디렉터리의 현재 저장 정책에 따라 이동할 블록을 스케줄링합니다.
명령:
hdfs storagepolicies -satisfyStoragePolicy -path <path>
인자:
| 인자 | 설명 |
|---|---|
-path <path> |
디렉터리나 파일을 가리키는 경로. |
Namenode를 재시작하지 않고 NN 외부의 외부 서비스 활성화 또는 SPS 비활성화
관리자가 Namenode가 실행되는 동안 SPS 기능의 모드를 전환하려면 먼저 설정 파일(hdfs-site.xml)에서 구성 항목 dfs.storage.policy.satisfier.mode의 원하는 값(external 또는 none)을 업데이트한 다음 다음 Namenode 재구성 명령을 실행해야 합니다.
- 명령:
hdfs dfsadmin -reconfig namenode host:ipc_port start
외부 SPS 서비스 시작
관리자가 외부 sps를 시작하려면 먼저 설정 파일(hdfs-site.xml)에서 속성 dfs.storage.policy.satisfier.mode를 external 값으로 구성한 다음 Namenode 재구성 명령을 실행해야 합니다. 설정 파일의 네트워크 토폴로지 구성이 namenode와 동일한지 확인하세요. 이 클러스터는 대상 노드를 일치시키는 데 사용됩니다. 그런 다음 다음 명령으로 외부 sps 서비스를 시작합니다.
- 명령:
hdfs -daemon start sps