Lakehouse/Delta Lake

Delta Lake 테이블의 history를 이용한 Time Travel, Restore Table

홍띠 2024. 12. 11. 08:03

Delta Lake 테이블에 수정을 발생시키는 각 operation 마다 새로운 테이블 version을 생성한다.  트랜잭션 로그에 기록된 Timestamp와 테이블 Version으로 특정 시점의 이전 테이블을 조회하거나 복원할 수 있다. 

(History output의 스키마, 지원 timestamp 형식 등 자세한 내용은 링크 참고)

 

대표적으로 아래와 같은 작업들을 수행 할 수 있다.

  1. 작업 감사(Audit)
    테이블 변경 이력을 확인하여 누가, 언제, 어떤 작업을 수행했는지 추적
  2. 테이블 롤백(Rollback)
    잘못된 데이터 수정이 발생한 경우, 특정 시점의 테이블 버전으로 되돌림
  3. 특정 시점 데이터 조회
    시간 여행(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 이전으로 함께 복원됩니다.