티스토리 뷰
- Apache iceberg는 방대한 분석 데이터 세트를 위한 오픈 테이블 포맷
- SQL 테이블처럼 작동하는 고성능 테이블 포맷 사용
- Spark, Trino, PrestoDB, Flink, Impala를 포함한 컴퓨팅 엔진에 테이블을 추가
주요 특징
- 스키마 진화(Schema Evolution)
- 추가, 삭제, 업데이트 또는 이름 바꾸기를 지원 → 테이블의 스키마를 유연하게 변경
- Hive와의 차이
- Hive에서 스키마 변경은 제한적
- Hive는 새로운 컬럼 추가는 가능 기존 컬럼의 삭제나 데이터 타입 변경은 어려움
- 숨겨진 파티셔닝(Hidden Partitioning)
- 파티션 관리 방식을 단순화하여 실수로 인한 잘못된 결과나 성능 저하를 방지 → 복잡한 쿼리에서도 잘못된 파티셔닝 회피
- Hive와의 차이
- Hive에서도는 파티셔닝을 사용자가 명시적으로 관리 → 잘못된 파티션키 지정시 비효율적인 쿼리나 잘못된 결과 발생 가능
- 파티션 레이아웃 진화(Partition Layout Evolution)
- 데이터의 양이나 쿼리 패턴이 변화함에 따라 파티션 레이아웃을 업데이트 할 수 있음→ 쿼리 성능을 최적화하고 데이터 저장 효율성 향상
- Hive와의 차이
- Hive는 파티션 레이아웃을 변경하여면 테이블 새로 만들거나 기존 테이블을 수정
- Hive는 파티션을 추가할 수 있지만, 기존 파티션 구조를 변경하거나 재구성하는 것은 어려움
- 시간 여행(Time Travel)
- 데이터 변경 이력을 쉽게 탐색할 수 있으며, 특정 시점의 데이터 상태를 확인 가능
- Hive와의 차이
- Hive는 기본적으로 시간여행 기능을 제공하지 않음
- 버전 롤백 (Version Rollback)
- 테이블을 이전의 안정적인 상태로 신속하게 되돌릴 수 있는 기능
- Hive와의 차이
- Hive는 기본적으로 버전 롤백 기능이 없음
Iceberg의 구조
- Catalog Layer
- catalog는 특정 데이터 소스에 접근을 가능하게 만들어주는 설정
- 현시점의 테이블 metadata를 찾을 수 있게 도와줌
- 쿼리 실행시 해당 쿼리가 찾는 metadata file을 찾기 위해 사용
- Metadata Layer
- metadata file
- 스키마, 파티션, 스냇샷에 대한 정보를 저장
- 테이블 형상은 metadata file로 관리
- 테이블 내용에 변경이 생기면 새로운 metadata file이 생성되어 기존 것을 대체
- 스냅샷 기능을 통해 특정 시점의 테이블 형상을 파일로 기록
- manifest list
- 스냅샷은 하나의 manifest list를 참조, manifest list는 하나 이상의 manifest file에 대한 메타 정보 저장
- manifest list를 통해 스냅샷과 연관된 manifest file 위치를 찾아내는 것
- manifest file
- 스냅샷은 하나 이상의 manifest file로 이루어짐
- manifest file은 data file에 대한 모든 정보( data file의 위치, 파티션 정보)와 통계 정보(null, nan 개수)를 저장
- metadata file
- Data Layer
- 실제 데이터를 저장하는 곳
- manifest file의 메타 정보를 이용하여 필요한 데이터 파일에 접근
- Iceberg의 데이터 접근 방식
- metadata → manifest list → manifest file → data file
- 특정 파티션 값의 데이터 조회시
- manifest list의 파티션 정보로 필터링 → 필터링된 manifest file을 거쳐 데이터 파일 로드
- 이러한 점을 통해 더 빠르게 데이터 조회 가능
Iceberg 데이터 쓰기 과정
- Data Files
- 먼저 새로운 데이터 파일이 생성
- Parquet, ORC, Avro 같은 포맷으로 저장
- Manifest Files
- 데이터 파일 생성 이후 Iceberg는 메타데이터를 담는 매니페스트 파일 생성
- 데이터 파일의 위치, 크기, 파티션 정보, 파일의 스키마 등 다양한 정보 저장
- Manifest List
- 모든 매니페스트 파일이 생성된 후, 매니페스트 리스트 파일을 업데이트
- 현재 테이블에서 사용 중인 모든 매니페스트 파일의 목록
- Metadata File
- 모든 쓰기 작업 완료 후 메타데이터 파일 업데이트
- 메타데이터 파일의 업데이트가 완료되면 새로운 스냅샷을 생성하여 현재의 테이블 상태를 기록 → 시간 여행 및 버전 관리 가능
Iceberg 데이터 삭제 과정
- 실제 데이터를 물리적으로 삭제하지 않고 논리적으로 삭제하는 방식으로 처리
- Data Files
- 데이터 삭제가 요청되면, 삭제할 데이터가 포함된 데이터 파일 식별
- 삭제할 조건(예: 특정 파티션 또는 조건) 기준
- Manifest Files
- 삭제할 데이터 파일에 대한 정보를 포함하는 매니페스트 파일 업데이트
- 기존 매니페스트 파일에서 삭제할 데이터에 대한 참조를 제거
- 삭제된 데이터를 나타내는 새로운 매니페스트 파일을 생성
- Manifest List
- 삭제가 발생한 후, 매니페스트 리스트 파일이 업데이트
- 매니페스트 파일과 새로운 삭제 마커 매니페스트 파일이 포함되도록 조정
- Metadata File
- 메타데이터 파일을 업데이트하여 삭제 작업의 결과를 반영
- 메타데이터 업데이트가 완료되면 새로운 스냅샷을 생성되어 현재 테이블 상태를 기록 → 시간 여행 및 버전 관리 가능
정리
많은 빅데이터를 운영하는 회사들이 hive를 통한 빅데이터 테이블에서 iceberg 테이블로 마이그레이션하여 사용하고 있다.
공부하기 전에는 메타데이터를 RDBMS로 관리하는 hive가 파일 형태로 관리하는 iceberg보다 더욱 빨라야할 것 같다고 나는 생각했다.
그러나, 데이터의 양이 계속해서 방대해짐에 따라서, hive 환경에서는 많은 문제에 직면하게 된다는 것을 알 수 있었다.
hive는 스키마 변경, 이전 데이터 롤백이 매우 제한적이며, 많은 데이터로 인하여 hive metastore는 많은 메모리 문제를 유발과 잘못된 파티셔닝으로 인한 부하로 프로세스 중단이 쉽게 발생할 수 있다.
그렇기에 iceberg는 메타데이터 파일로 메타데이터를 관리하지만, 페타바이트 이상의 규모에서는 파일 접근 I/O 비용이 발생하더라도 metadata, mainfest 파일들을 사용하여 최적화된 데이터 조회가 가능하게 만들었고 주기적으로 최적화하여 데이터양이 방대해지더라도 성능을 최대한 유지할 수 있게됨을 알 수 있었다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Item Prototypes
- Nifi Service
- 빅데이터
- openjdk1.8
- Federation
- OOM
- MAT
- bigdata #data_mesh
- Nifi Architecture
- hadoop
- java8
- prometheus
- namenode
- error
- flow.xml.gz
- zabbix
- hdfs
- 실시간처리
- flink
- Apache Nifi
- nifi
- nifi.flowcontroller.autoResumeState
- Dataflow
- Bigdata
- spark driver
- exporter
- 설정에러
- Apache
- Discovery Rule
- lld
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함