Lakehouse/Delta Lake
Delta Lake 테이블의 history를 이용한 Time Travel, Restore Table
홍띠
2024. 12. 11. 08:03
Delta Lake 테이블에 수정을 발생시키는 각 operation 마다 새로운 테이블 version을 생성한다. 트랜잭션 로그에 기록된 Timestamp와 테이블 Version으로 특정 시점의 이전 테이블을 조회하거나 복원할 수 있다.
(History output의 스키마, 지원 timestamp 형식 등 자세한 내용은 링크 참고)
대표적으로 아래와 같은 작업들을 수행 할 수 있다.
- 작업 감사(Audit)
테이블 변경 이력을 확인하여 누가, 언제, 어떤 작업을 수행했는지 추적 - 테이블 롤백(Rollback)
잘못된 데이터 수정이 발생한 경우, 특정 시점의 테이블 버전으로 되돌림 - 특정 시점 데이터 조회
시간 여행(Time Travel) 기능을 사용하여 특정 시점의 데이터 상태를 쿼리
복원/시간여행이 가능한 테이블 버전은 트랜잭션 로그 파일의 보존 기간과 VACUUM 작업의 실행 빈도 및 지정된 보존 기간에 따라 결정됨
- 트랜잭션 로그 파일 보존 기간 설정은 spark.databricks.delta.logRetentionDuration 값으로 setting (default: 30 days)
- Vacuum 작업의 Retention 기간(default: 7days)에 따라, (Vacuum 실행 시점 - Retention 기간) 까지의 데이터를 조회가능
예를들어 기본 설정으로 매일 Vacuum을 실행하는 경우, 최대 7일 전의 데이터에 대해 시간 여행이 가능합니다. VACUUM 명령은 오래된 데이터를 제거하기 때문에, 이 작업을 수행하면 해당 데이터의 시간 여행 가능성도 사라집니다. Databricks는 Delta Lake 테이블 히스토리를 장기적인 데이터 아카이빙(보관) 솔루션의 용도로 사용하는 것은 권장하지 않습니다.
History 조회
DESCRIBE HISTORY table_name -- history 전체 조회
DESCRIBE HISTORY table_name LIMIT 1 -- 가장 마지막 operation 조회
DESCRIBE HISTORY 결과 예시
+---------+-----------------------+--------+------------+-----------+------------------------------------------------------------+
| version | timestamp | userId | userName | operation | operationParameters |
+---------+-----------------------+--------+------------+-----------+------------------------------------------------------------+
| 3 | 2024-11-21 12:15:00 | 1003 | bwhite | MERGE | {"source": "new_data", "condition": "target.id = source.id"} |
| 2 | 2024-11-21 11:00:00 | 1002 | asmith | DELETE | {"predicate": "status = 'inactive'"} |
| 1 | 2024-11-21 10:30:00 | 1001 | jdoe | UPDATE | {"updated_columns": ["name", "age"], "condition": "age > 30"}|
+---------+-----------------------+--------+------------+-----------+------------------------------------------------------------+
Table Restore
테이블을 특정 시점으로 rollback
RESTORE TABLE target_table TO VERSION AS OF <version>; -- table version으로 복원
RESTORE TABLE target_table TO TIMESTAMP AS OF <timestamp>; -- timestamp로 복원
결과 예시
RESTORE TABLE test.test.delta_test TO VERSION AS OF 1;
DESCRIBE HISTORY test.test.delta_test;
+---------+-----------------------+--------+------------+-----------+------------------------------------------------------------+
| version | timestamp | userId | userName | operation | operationParameters |
+---------+-----------------------+--------+------------+-----------+------------------------------------------------------------+
| 4 | 2024-11-21 13:00:00 | 1004 | cgreen | RESTORE | {"version": "1", "timestamp": null} |
| 3 | 2024-11-21 12:15:00 | 1003 | bwhite | MERGE | {"source": "new_data", "condition": "target.id = source.id"} |
| 2 | 2024-11-21 11:00:00 | 1002 | asmith | DELETE | {"predicate": "status = 'inactive'"} |
| 1 | 2024-11-21 10:30:00 | 1001 | jdoe | UPDATE | {"updated_columns": ["name", "age"], "condition": "age > 30"}|
+---------+-----------------------+--------+------------+-----------+------------------------------------------------------------+
Time Travel
Time Travel 기능은 테이블을 특정 시점으로 rollback하는 Restore과 달리, 현재 테이블을 수정하지 않고 이전 테이블 버전을 조회(쿼리)할 수 있도록 한다.
SELECT * FROM target_table TIMESTAMP AS OF <timestamp>; -- timestamp로 특정 시점의 테이블 조회
SELECT * FROM target_table@yyyyMMddHHmmssSSS; -- @사용시에는 yyyyMMddHHmmssSSS 포맷 지켜야함
SELECT * FROM target_table VERSION AS OF <version>; -- table version으로 특정 시점의 테이블 조회
SELECT * FROM target_table@v123; -- @사용시에는 version 앞에 v 붙임
time travel을 이용해서 특정 시점의 데이터로 신규 테이블을 만들 수도 있다.
CREATE TABLE test.test.timetravel_test AS
(
SELECT *
FROM test.test.delta_test@v1
)
Drop Table 후 데이터 복원
- Drop Table의 경우 테이블이 논리적으로 삭제 되었으므로, time travel이나 restore가 불가능 합니다.
- Vacuum 작업으로 물리적인 데이터가 S3에서 삭제되지 않은 경우라면, 해당 경로의 데이터로 복원 할 수 있습니다.
- history 또한 S3에 저장된 데이터를 읽어오는 것으로, drop table 이전으로 함께 복원됩니다.