LanguageManual - 아카이빙
LanguageManual - 아카이빙 (Archiving)
파일 수를 줄이기 위한 Hive 아카이빙 기능을 설명해요. HDFS 네임노드의 메모리 부담을 줄이기 위해 파티션의 파일들을 Hadoop Archive(HAR)로 묶는 방법과 주의사항을 다룹니다.
출처: 문서
본문
파일 수 줄이기를 위한 아카이빙 (Archiving for File Count Reduction)
개요 (Overview)
HDFS의 설계상 파일 시스템의 파일 수는 네임노드의 메모리 소비에 직접 영향을 줍니다. 작은 클러스터에선 보통 문제가 되지 않지만, 파일이 50~100백만 개를 넘어가면 단일 머신의 접근 가능 메모리 한계에 도달할 수 있습니다. 그런 상황에서는 파일을 최대한 적게 유지하는 것이 유리합니다.
Hadoop Archives를 사용하는 것은 파티션의 파일 수를 줄이는 한 가지 방법입니다. Hive는 기존 파티션의 파일을 Hadoop Archive(HAR)로 변환하는 기능을 내장해, 한때 100개가 넘는 파일로 구성되던 파티션을 ~3개 파일(설정에 따라 다름)로 줄일 수 있습니다. 대신 HAR에서 읽을 때 추가 오버헤드가 생겨 쿼리가 더 느려질 수 있다는 트레이드오프가 있습니다.
참고: 아카이빙은 파일을 압축하지 않습니다 – HAR는 Unix tar 명령과 유사합니다. 참고: 여러 주의 사항이 따르므로 아카이빙은 고급 명령으로 간주해야 합니다.
설정 (Settings)
아카이빙을 사용하기 전에 3가지 설정을 구성해야 합니다. (예시 값이 표시되어 있습니다.)
hive> set hive.archive.enabled=true;
hive> set hive.archive.har.parentdir.settable=true;
hive> set har.partfile.size=1099511627776;
hive.archive.enabled는 아카이빙 작업이 활성화되는지 제어합니다.
hive.archive.har.parentdir.settable은 아카이브 생성 시 부모 디렉터리를 설정할 수 있는지 Hive에 알려줍니다. 최근 Hadoop 버전에서 -p 옵션은 아카이브의 루트 디렉터리를 지정할 수 있습니다. 예를 들어 /dir1/dir2/file을 /dir1을 부모 디렉터리로 아카이브하면, 결과 아카이브 파일에는 dir2/file 디렉터리 구조가 포함됩니다. 2011년 이전의 오래된 Hadoop 버전에서는 이 옵션을 사용할 수 없었기 때문에 Hive를 이 제한에 맞게 구성해야 합니다.
har.partfile.size는 아카이브를 구성하는 파일의 크기를 제어합니다. 아카이브는 *size_of_partition*/har.partfile.size개의 파일(올림)을 포함합니다. 값이 높을수록 파일이 적어지지만 매퍼 수가 줄어 아카이빙 시간이 길어집니다.
사용법 (Usage)
아카이브 (Archive)
구성 값을 설정한 뒤에는 다음 명령으로 파티션을 아카이브할 수 있습니다:
ALTER TABLE table_name ARCHIVE PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
예를 들어:
ALTER TABLE srcpart ARCHIVE PARTITION(ds='2008-04-08', hr='12')
명령을 내리면 mapreduce 작업이 아카이빙을 수행합니다. Hive 쿼리와 달리 CLI에 진행 상황을 나타내는 출력이 없습니다.
아카이브 해제 (Unarchive)
unarchive 명령으로 파티션을 원래 파일로 되돌릴 수 있습니다:
ALTER TABLE srcpart UNARCHIVE PARTITION(ds='2008-04-08', hr='12')
주의사항과 제한 (Cautions and Limitations)
- 일부 오래된 Hadoop 버전에서 HAR는 데이터 손실이나 다른 오류를 유발할 수 있는 몇 가지 버그가 있었습니다. 다음 패치가 당신의 Hadoop 버전에 반영되어 있는지 확인하세요:
https://issues.apache.org/jira/browse/HADOOP-6591 (Hadoop 0.21.0에서 수정) https://issues.apache.org/jira/browse/MAPREDUCE-1548 (Hadoop 0.22.0에서 수정) https://issues.apache.org/jira/browse/MAPREDUCE-2143 (Hadoop 0.22.0에서 수정) https://issues.apache.org/jira/browse/MAPREDUCE-1752 (Hadoop 0.23.0에서 수정)
- HarFileSystem 클래스에는 아직 고쳐지지 않은 버그가 있습니다:
https://issues.apache.org/jira/browse/MAPREDUCE-1877 (2014년에 https://issues.apache.org/jira/browse/HADOOP-10906로 이동)
Hive는 이러한 문제의 일부를 해결하는 HiveHarFileSystem 클래스를 제공하며, 기본적으로 fs.har.impl의 값입니다. 자체 버전의 HarFileSystem을 만들고 있다면 이 점을 유의하세요:
- 기본 HiveHarFileSystem.getFileBlockLocations()는 지역성(locality)이 없습니다. 즉 더 높은 네트워크 부하나 성능 저하를 유발할 수 있습니다.
- 아카이브된 파티션은 INSERT OVERWRITE로 덮어쓸 수 없습니다. 파티션을 먼저 아카이브 해제해야 합니다.
- 두 프로세스가 동시에 같은 파티션을 아카이브하려 하면 문제가 발생할 수 있습니다. (동시성 지원이 구현되어야 합니다.)
내부 동작 (Under the Hood)
내부적으로 파티션이 아카이브되면, 파티션의 원래 위치(예: /warehouse/table/ds=1)의 파일로 HAR이 생성됩니다. 파티션의 부모 디렉터리는 원래 위치와 같게 지정되고 결과 아카이브 이름은 'data.har'입니다. 아카이브는 원래 디렉터리 아래로 이동되고(예: /warehouse/table/ds=1/data.har), 파티션의 위치는 아카이브를 가리키도록 변경됩니다.
더 알아보기 (Learn more)
파티션 파일 수가 많아 네임노드 메모리가 부담될 때 HAR 아카이빙이 유용해요. ALTER TABLE ... ARCHIVE PARTITION으로 파일을 묶고 UNARCHIVE로 되돌릴 수 있습니다. 다만 HAR 특성상 읽기 오버헤드·비압축·동시성 제한 같은 단점을 꼭 염두에 두세요.