Trino에서 connector는 iceberg와 hive가 존재한다.
hive와 iceberg를 모두 사용하는 이유는 데이터를 저장하고 관리하는 방식이 다르기 때문이다.
 
Hive 커넥터의 경우 폴더 단위로 데이터를 관리한다. 예를 들어서 day=20240101 폴더 안에 있는 모든 파일이 해당 파티션의 데이터에 해당한다. 그래서 UPDATE/DELETE가 어렵기에 한번 쌓이면 안 변하는 로그나 백업 테이블을 주로 append한다. hive는 메타스토어에 가서 직접 읽는다. 구조가 단순해서 나중에 다른 솔루션 (예: Spark, Python, 혹은 다른 DB)으로 데이터를 옮길 때 훨씬 호환성이 좋다.
 
iceberg connector의 경우, 스냅샷 단위로 관리하기에 UPDATE/DELETE가 자유롭고 Time Travel 기능처럼 과거 데이터를 조회하는게 가능하다. iceberg는 iceberg 전용 메타데이터 파일을 찾아서 파일에 적힌대로 데이터를 조합해서 읽는다. 따라서 빠르게 조회하거나 데이터를 수정해야하는 경우에 사용하지만 메타데이터가 꼬이면 복구가 복잡하다.
 
Trino는 데이터를 3계층으로 관리한다.
 

  • Catalog (카탈로그): 네 설정 파일 이름 (hive, iceberg)
  • Schema (스키마): 흔히 말하는 데이터베이스(DB) 이름
  • Table (테이블): 실제 데이터가 담긴 표

 
iceberg -> hive (❌)
우선 먼저 iceberg connector로 만들어진 테이블은 hive connector로 접속 불가능하다.
아래처럼 오류 메세지가 나온다. hive connector는 iceberg의 복잡한 스냅샷 구조를 해석할 능력이 없다.

SQL Error [133001]: Query failed (#20260401_074953_00144_wv8fq): Cannot query Iceberg table 'dw.tablename'

 
 
hive -> iceberg (⭕) 
configmap에 아래 설정을 추가해주면 iceberg 커넥터가 내가 모르는 정보가 있으면 hive 카탈로그를 참고한다고 연결하는 상태가 돼서 iceberg 카탈로그 경로로 쿼리를 날려도 실제로는 hive 카탈로그에 정의된 메타데이터를 끌어와서 보여준다. iceberg 커넥터로 조회는 되지만, 단순 select만 가능하다. hive catalog를 iceberg 쪽에 브릿지해둔 경우이다. catalog를 바꾸지않아도 편하게 백업 및 개발 데이터를 볼 수 있도록 하기 위해서 설정해둔 경우가 많다.

iceberg.hive-catalog-name=hive

 
 
왜 Hive connector는 Update나 Delete가 제한적일까??
파일시스템으로써 Hive는 S3 같은 오브젝트 스토리지에 Parquet나 ORC 같은 파일을 차곡차곡 쌓아두는 방식이다. 그래서 수정하거나 삭제하려면 전체 파일을 새로 쓰거나 덮어버려야한다. Hive ACID 테이블은 가능하지만 설정이 까다롭고 성능이 나빠서 거의 사용하지 않는다. Hive connector를 이용해서 만든 테이블의 S3 폴더를 확인하면 Parquet 파일만 확인할 수 있다. Hive도 DDL를 만들때 파티션을 설정할 수 있지만, insert 시 파티션의 폴더값을 사용자가 설정해줘야하는 불편함이 있다.
 
iceberg는 데이터를 수정하면 기존 파일을 건드리지 않고, 어떤 데이터가 수정/삭제되었는지 기록하는 작은 파일(Delete Delta)을 따로 만든다. 그래서 나중에 조회할때 이 파일을 합쳐서 보여주기에 S3 파일을 통째로 다시 쓸 필요없이 Update와 Delete를 할 수 있다. 그래서 iceberg connector를 이용해서 만든 테이블의 S3 폴더를 확인하면 data 폴더(실제 데이터 저장)가 파티션별로 저장되는 것과 metastore 폴더(테이블 상태, 스키마, 파티션 정보, 스냅샷 저장)가 나눠져있는걸 볼 수 있고 metastore 폴더 하위에서 snapshot을 확인 가능하다. 가장 최신의 스냅샷 경로를 HMS에 저장해두기에 iceberg도 HMS는 필요하다.


Hive connector로 테이블을 생성하면 하이브 메타스토어에 Owner(소유자) 정보가 기록되고, Owner가 아니라면 Admin 계정이여도 테이블 삭제가 불가능하다. 그래서 소유권을 강제로 변경해줘야 Drop이 가능하다.

-- 1. 소유권을 admin으로 강제 변경
ALTER TABLE hive.dw.table_name SET AUTHORIZATION admin;

-- 2. 이제 삭제 가능
DROP TABLE hive.dw.table_name;

 

Hive connector로 만들었으면 테이블과 스키마를 삭제했다고 Storage가 삭제되지 않는다. 그러나 iceberg로 만들었다면 Storage 데이터도 자동으로 삭제된다.
 

+ Recent posts