[Trouble Shooting] - Iceberg drop and rollback

Chan hae OH·2024년 5월 2일
0

iceberg

목록 보기
2/4

1. 문제 발단


Trino 와 Spark 를 활용하여 HDFS 상에 Iceberg 를 사용하고 있다. (Hive metastore 활용)

이 때 drop table 을 비슷한 이름의 테이블을 선택하여 데이터를 삭제하는 문제가 발생했다.

trino 에서 해당 쿼리를 날렸고, 복구할 방법을 확인해본다.



2. 문제 원인 분석


문제의 원인은 딱히 없다. 필자 잘못이다.

복구할 방법이 있는지를 확인해본다.

  1. snapshot 을 복구한다.

    테이블의 삭제 바로 이전 snapshot으로 rollback 한다.

  2. 새로운 테이블을 해당 경로로 만든다.

    hdfs 경로에 삭제되지 않은 metadata 를 활용하여 해당 테이블을 새로 만든다.



3. 문제 심층 분석


먼저 drop 테이블을 했기 때문에 snapshot 이나 history 정보들은 아예 조회할 수가 없었다. 그렇기 때문에 snapshot을 rollback 하는 것은 불가능하다.

그러면 어떻게 복구할 수 있을까?

먼저 아래 링크를 확인하면 테이블을 파일에서 불러와 regist 할 수 있는 프로시저를 iceberg 에서는 제공한다.

참고 : trino 410 doc - register table

그러면 해당 doc 을 확인하여 아래와 같이 sql 을 작성해준다.

call iceberg.system.register_table(schema_name => 'db', table_name => 'table', table_location = 'hdfs://hadoopcluster:9000/hive/db/table-asdfasgeagaseg/')

그러나 해당 sql 의 경우 에러가 발생한다.

register_table procedure is disabled

그러면 하기와 같이 iceberg.register-table-procedure.enabled 옵션을 true 로 설정해줘야 한다.

참고 : trino 410 doc - general-configuration

그러나 trino 는 동작 중이다.

다행이도 iceberg 는 다양한 sql 엔진을 지원하기 때문에 spark 으로 해당 register table 을 진행하면 된다.

이 때 hdfs 경로로 들어가서 가장 최근 metadata.json 파일을 선택해 준다.

참고 : iceberg 1.4.3 doc - spark - register table

spark.sql("CALL icerberg.system.register_table(table => 'db.table', metadata_file => 'hdfs://hadoopcluster:9000/hive/db/table-asdfasgeagaseg/metadata/{가장 최근 metadata.json}')")

동작 결과 정상적으로 동작했다.



profile
Data Engineer

0개의 댓글