유지보수
유지보수 (Maintenance)
아이스버그 테이블은 시간이 지나며 스냅샷, 메타데이터 파일, 고아 파일이 쌓여요. 이 문서에서는 테이블을 건강하게 유지하기 위한 권장 유지보수 작업인 스냅샷 만료, 오래된 메타데이터 파일 제거, 고아 파일 삭제를 알려드릴게요. 선택적 유지보수로는 데이터 파일 컴팩션과 매니페스트 재작성이 있어요.
출처: 문서
본문
정보 (Info)
유지보수 연산은 Table 인스턴스가 필요해요. 기존 테이블을 로드하는 방법은 Java API quickstart 페이지를 참고해주세요.
권장 유지보수 (Recommended Maintenance)
스냅샷 만료 (Expire Snapshots)
아이스버그 테이블에 대한 각 쓰기는 테이블의 새 스냅샷(또는 버전)을 만들어요. 스냅샷은 타임 트래블 쿼리에 사용할 수 있고, 테이블은 유효한 스냅샷으로 롤백할 수도 있어요.
스냅샷은 expireSnapshots 연산으로 만료될 때까지 누적돼요. 더 이상 필요 없는 데이터 파일을 삭제하고 테이블 메타데이터 크기를 작게 유지하려면 정기적으로 스냅샷을 만료하는 것이 권장돼요.
이 예시는 1일보다 오래된 스냅샷을 만료해요:
Table table = ...
long tsToExpire = System.currentTimeMillis() - (1000 * 60 * 60 * 24); // 1 day
table.expireSnapshots()
.expireOlderThan(tsToExpire)
.commit();
더 많은 구성 옵션은 ExpireSnapshots Javadoc을 참고해주세요.
큰 테이블의 스냅샷 만료를 병렬로 실행할 수 있는 스파크 액션도 있어요:
Table table = ...
SparkActions
.get()
.expireSnapshots(table)
.expireOlderThan(tsToExpire)
.execute();
오래된 스냅샷을 만료시키면 메타데이터에서 제거되어 더 이상 타임 트래블 쿼리에 사용할 수 없어요.
정보 (Info)
데이터 파일은 타임 트래블이나 롤백에 사용될 수 있는 스냅샷이 더 이상 참조하지 않을 때까지 삭제되지 않아요. 스냅샷을 정기적으로 만료시키면 사용하지 않는 데이터 파일이 삭제돼요.
오래된 메타데이터 파일 제거 (Remove old metadata files)
아이스버그는 JSON 파일을 사용해 테이블 메타데이터를 추적해요. 테이블의 각 변경은 원자성을 제공하기 위해 새 메타데이터 파일을 생성해요.
오래된 메타데이터 파일은 기본적으로 이력을 위해 보관돼요. 스트리밍 작업이 쓰는 테이블처럼 커밋이 잦은 테이블은 메타데이터 파일을 정기적으로 정리해야 할 수 있어요.
각 메타데이터 파일은 metadata-log 필드에서 더 오래된 메타데이터 파일들을 추적해요. 추적되는 메타데이터 파일의 수는 write.metadata.previous-versions-max로 정의돼요.
오래된 메타데이터 파일을 자동으로 삭제하려면 테이블 속성에서 write.metadata.delete-after-commit.enabled=true를 설정해요. 이렇게 하면 추적되는 메타데이터 파일 일부(write.metadata.previous-versions-max까지)가 유지되고, 새 파일이 만들어질 때마다 가장 오래된 메타데이터 파일이 삭제돼요. 이 설정은 메타데이터 로그에서 추적되는 메타데이터 파일만 삭제하고 고아 메타데이터 파일은 삭제하지 않는다는 점에 유의해주세요.
추적되지 않는 메타데이터 파일도 고아 파일 삭제의 일부로 삭제돼요.
| 속성 | 기본값 | 설명 |
|---|---|---|
| write.metadata.delete-after-commit.enabled | false | 각 테이블 커밋 후 가장 오래된 추적 버전 메타데이터 파일을 삭제할지 제어해요 |
| write.metadata.previous-versions-max | 100 | 추적할 이전 버전 메타데이터 파일의 최대 수 |
예시:
- write.metadata.delete-after-commit.enabled=false이고 write.metadata.previous-versions-max=10이면, 100회 커밋 후에는 추적되는 메타데이터 파일 10개와 고아 메타데이터 파일 90개가 생겨요. 이 90개의 고아 메타데이터 파일은 이미 추적되지 않기 때문에 write.metadata.delete-after-commit.enabled=true로 설정해도 삭제할 수 없어요. 고아 파일 삭제 프로시저로만 정리할 수 있어요.
- write.metadata.delete-after-commit.enabled=true이고 write.metadata.previous-versions-max=20이면, 21회 커밋 후에는 추적되는 메타데이터 파일 20개가 있고, 커밋 후 작성자가 가장 오래된 메타데이터 파일을 삭제해요. 커밋이 추가될 때마다 가장 오래된 메타데이터 파일이 삭제돼요.
자세한 내용은 테이블 쓰기 속성(table write properties) 문서를 참고해주세요.
고아 파일 삭제 (Delete orphan files)
스파크와 다른 분산 처리 엔진에서는 작업(task)이나 작업(job) 실패로 테이블 메타데이터가 참조하지 않는 파일이 남을 수 있고, 어떤 경우에는 일반적인 스냅샷 만료가 파일이 더 이상 필요 없다는 것을 판별해 삭제하지 못할 수 있어요.
테이블 위치 아래의 이런 "고아(orphan)" 파일을 정리하려면 deleteOrphanFiles 액션을 사용해요.
Table table = ...
SparkActions
.get()
.deleteOrphanFiles(table)
.execute();
더 많은 구성 옵션은 DeleteOrphanFiles Javadoc을 참고해주세요.
이 액션은 data와 metadata 디렉터리에 파일이 많으면 완료하는 데 오래 걸릴 수 있어요. 주기적으로 실행하는 것을 권장하지만, 자주 실행할 필요는 없어요.
정보 (Info)
진행 중인 쓰기가 완료될 것으로 예상되는 시간보다 짧은 보관 간격으로 고아 파일을 제거하는 것은 위험해요. 진행 중인 파일이 고아로 간주되어 삭제되면 테이블이 손상될 수 있기 때문이에요. 기본 간격은 3일이에요.
정보 (Info)
아이스버그는 어떤 파일을 제거해야 하는지 결정할 때 경로의 문자열 표현을 사용해요. 일부 파일 시스템에서는 경로가 시간이 지나며 바뀔 수 있지만 여전히 같은 파일을 나타내요. 예를 들어 HDFS 클러스터의 authority를 바꾸면 생성 중 사용된 이전 경로 URL 중 어느 것도 현재 목록에 나타나는 것과 일치하지 않을 수 있어요. 그러면 RemoveOrphanFiles 실행 시 데이터 손실로 이어질 수 있어요. MetadataTables의 항목이 Hadoop FileSystem API가 나열하는 것과 일치하는지 확인해서 의도하지 않은 삭제를 피해주세요.
선택적 유지보수 (Optional Maintenance)
일부 테이블은 추가 유지보수가 필요해요. 예를 들어 스트리밍 쿼리는 더 큰 파일로 컴팩션해야 하는 작은 데이터 파일을 만들 수 있어요. 그리고 어떤 테이블은 매니페스트 파일을 재작성해서 쿼리 데이터 탐색을 훨씬 빠르게 만들면 좋을 수 있어요.
데이터 파일 컴팩션 (Compact data files)
아이스버그는 테이블의 각 데이터 파일을 추적해요. 데이터 파일이 많을수록 매니페스트 파일에 저장되는 메타데이터가 많아지고, 작은 데이터 파일은 불필요한 메타데이터를 만들고 파일을 여는 비용 때문에 쿼리가 덜 효율적이게 해요.
아이스버그는 rewriteDataFiles 액션으로 스파크를 사용해 데이터 파일을 병렬로 컴팩션할 수 있어요. 작은 파일을 더 큰 파일로 결합해서 메타데이터 오버헤드와 런타임 파일 오픈 비용을 줄여요.
Table table = ...
SparkActions
.get()
.rewriteDataFiles(table)
.filter(Expressions.equal("date", "2020-08-18"))
.option("target-file-size-bytes", Long.toString(500 * 1024 * 1024)) // 500 MB
.execute();
파일 메타데이터 테이블(files metadata table)은 데이터 파일 크기를 검사하고 언제 파티션을 컴팩션할지 결정하는 데 유용해요.
더 많은 구성 옵션은 RewriteDataFiles Javadoc을 참고해주세요.
매니페스트 재작성 (Rewrite manifests)
아이스버그는 매니페스트 리스트와 매니페스트 파일의 메타데이터를 사용해서 쿼리 계획을 빠르게 하고 불필요한 데이터 파일을 프루닝해요. 메타데이터 트리는 테이블 데이터에 대한 인덱스 역할을 해요.
메타데이터 트리의 매니페스트는 추가된 순서대로 자동으로 컴팩션돼요. 쓰기 패턴이 읽기 필터와 정렬되면 쿼리가 더 빨라져요. 예를 들어 시간별 파티션 데이터가 도착할 때 쓰는 것은 시간 범위 쿼리 필터와 정렬돼요.
테이블의 쓰기 패턴이 쿼리 패턴과 정렬되지 않을 때는 rewriteManifests 또는 (스파크를 사용한 병렬 재작성을 위한) rewriteManifests 액션으로 메타데이터를 재작성해서 데이터 파일을 매니페스트로 다시 그룹화할 수 있어요.
이 예시는 작은 매니페스트를 재작성하고 첫 번째 파티션 필드별로 데이터 파일을 그룹화해요.
Table table = ...
SparkActions
.get()
.rewriteManifests(table)
.rewriteIf(file -> file.length() < 10 * 1024 * 1024) // 10 MB
.execute();
더 많은 구성 옵션은 RewriteManifests Javadoc을 참고해주세요.