Trino 와 Spark 를 활용하여 HDFS 상에 Iceberg 를 사용하고 있다. (Hive metastore 활용)
이 때 drop table 을 비슷한 이름의 테이블을 선택하여 데이터를 삭제하는 문제가 발생했다.
trino 에서 해당 쿼리를 날렸고, 복구할 방법을 확인해본다.
문제의 원인은 딱히 없다. 필자 잘못이다.
복구할 방법이 있는지를 확인해본다.
snapshot 을 복구한다.
테이블의 삭제 바로 이전 snapshot으로 rollback 한다.
새로운 테이블을 해당 경로로 만든다.
hdfs 경로에 삭제되지 않은 metadata 를 활용하여 해당 테이블을 새로 만든다.
먼저 drop 테이블을 했기 때문에 snapshot 이나 history 정보들은 아예 조회할 수가 없었다. 그렇기 때문에 snapshot을 rollback 하는 것은 불가능하다.
그러면 어떻게 복구할 수 있을까?
먼저 아래 링크를 확인하면 테이블을 파일에서 불러와 regist 할 수 있는 프로시저를 iceberg 에서는 제공한다.
그러면 해당 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 는 동작 중이다.
다행이도 iceberg 는 다양한 sql 엔진을 지원하기 때문에 spark 으로 해당 register table 을 진행하면 된다.
이 때 hdfs 경로로 들어가서 가장 최근 metadata.json 파일을 선택해 준다.
spark.sql("CALL icerberg.system.register_table(table => 'db.table', metadata_file => 'hdfs://hadoopcluster:9000/hive/db/table-asdfasgeagaseg/metadata/{가장 최근 metadata.json}')")
동작 결과 정상적으로 동작했다.