TL;DR
- ์ธ ํฌ๋งท ๋ชจ๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ Parquet ํ์ผ ๋ฌถ์์ ACIDยทtime travelยท์คํค๋ง ์งํ๋ฅผ ์ ๊ณตํ๋ ๋ฉํ๋ฐ์ดํฐ ๋ ์ด์ด
- ๊ฐ๋ฆฌ๋ ์ง์ ์ ์ปค๋ฐ ์์์ฑ์ ์์น(Iceberg๋ ์นดํ๋ก๊ทธ, Delta๋ ๋ก๊ทธ ํ์ผ, Hudi๋ ํ์๋ผ์ธ+๋ฝ)์ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ ๋ฐฉ์
- ์ ํ ๊ธฐ์ค์ ๋ฒค์น๋งํฌ๊ฐ ์๋๋ผ ์์ง ๊ตฌ์ฑ๊ณผ ์ํฌ๋ก๋ ์ฑ๊ฒฉ, ์นดํ๋ก๊ทธ ์ ๋ต
AI-assisted
1. ์ ํ ์ด๋ธ ํฌ๋งท์ด ํ์ํ๋
๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ Parquet ํ์ผ์ ์์๋๋ฉด ์ ์ฅ์ ์ธ์ง๋ง ํ์ผ ๋ฌถ์๋ง์ผ๋ก๋ ํ์ฌ ํ ์ด๋ธ ์ํ๋ฅผ ๊ธฐ๋กํ์ง ๋ชปํ๋ค. Hive ์์ ์ ํ ์ด๋ธ ์ ์๊ฐ โ์ด ๋๋ ํฐ๋ฆฌ ์๋ ์๋ ํ์ผ ์ ๋ถโ์๋ ํ์ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ๋ผ์๋ค.
- ์์์ฑ ์์: ์ฐ๊ธฐ ๋์ค์ ์ฝ์ผ๋ฉด ์ ๋ฐ๋ง ๋ฐ์๋ ์ํ๊ฐ ๋ณด์ธ๋ค
- ํ์ผ ๋ชฉ๋ก ์ค์บ ๋น์ฉ: ํํฐ์
์ด ์๋ง ๊ฐ๋ฉด
LISTํธ์ถ๋ง์ผ๋ก query planning์ด ์ ๋ถ ๊ฑธ๋ฆฐ๋ค - ์คํค๋ง ๋ณ๊ฒฝ ๋ถ๊ฐ: ์ปฌ๋ผ ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๋ฉด ์ ์ฒด๋ฅผ ๋ค์ ์ด๋ค
- ํํฐ์ ๊ฒฐํฉ๋: ํํฐ์ ์ปฌ๋ผ์ ์ฟผ๋ฆฌ์ ๋ช ์ํ์ง ์์ผ๋ฉด ์ ์ฒด ์ค์บ์ด ๋๋ค
- ๋กค๋ฐฑ ๋ถ๊ฐ: ์๋ชป ์ด ๋ฐฐ์น๋ฅผ ๋๋๋ฆด ๋ฐฉ๋ฒ์ด ์๋ค
LIST ํธ์ถ: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ๋ชฉ๋ก ์กฐํ API
- S3์
ListObjectsV2, GCS์objects.list์ฒ๋ผ ์ ๋์ฌ์ ํด๋นํ๋ ํค๋ฅผ ๋์ดํ๋ ์์ฒญ- ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ค์ฌํ์ง ์๊ณ
dt=2024-01-01/part-0.parquet๊ฐ์ ํค๊ฐ ํ๋ฉด์ผ๋ก ๋์ด์ ์์ ๋ฟ์ด๋ผ ํ์ผ ๋ชฉ๋ก์ ์๋ ค๋ฉด ๋งค๋ฒ ์์ฒญ์ด ํ์- ํ ๋ฒ์ 1,000๊ฐ๊น์ง๋ง ๋ฐํํ๋ฏ๋ก ํ์ผ 10๋ง ๊ฐ๋ฉด ์๋ณต 100ํ. ํธ์ถ๋น ์์ญ~์๋ฐฑ ms๊ฐ ๋ถ๊ณ ๋จ๊ฐ๋ GET๋ณด๋ค ๋๋ค
- Hive๋ ์ฟผ๋ฆฌ๋ฅผ ๊ณํํ ๋๋ง๋ค ๋์ ํํฐ์ ๊ฒฝ๋ก๋ฅผ ์ ๋ถ LISTํ๋ค. ํํฐ์ ์ด ๋๋ฉด ์ฟผ๋ฆฌ๊ฐ ์์๋๊ธฐ๋ ์ ์ ๋๊ธฐ ์๊ฐ์ด ๊ฐ์ด ๋์ด๋๋ค
์ธ ํฌ๋งท ๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ์ ๊ทธ๋๋ก ๋๊ณ ์ด๋ ์์ ์ ์ด๋ค ํ์ผ์ด ํ ์ด๋ธ์ ์ํ๋์ง๋ฅผ ๋ฉํ๋ฐ์ดํฐ๋ก ๋ฐ๋ก ๊ธฐ๋กํ๋ค.
์ฟผ๋ฆฌ ์์ง (Spark / Flink / Trino / Snowflake)
โ
ํ
์ด๋ธ ํฌ๋งท ๋ฉํ๋ฐ์ดํฐ โ Iceberg / Delta Lake / Hudi
โ
ํ์ผ ํฌ๋งท (Parquet / ORC / Avro)
โ
์คํ ๋ฆฌ์ง (S3 / GCS / ADLS / HDFS)ํ ์ด๋ธ ํฌ๋งท: ํ์ผ ํฌ๋งท๊ณผ ๋ค๋ฅธ ๊ณ์ธต
- ํ์ผ ํฌ๋งท: ๋ฐ์ดํธ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์นํ ์ง. Parquet, ORC, Avro
- ํ ์ด๋ธ ํฌ๋งท: ๊ทธ ํ์ผ์ ๋ฌถ์ด ํ ์ด๋ธ๋ก ๋ง๋๋ ๊ท์ฝ. Iceberg, Delta, Hudi
- ํ ์ด๋ธ ํฌ๋งท์ ์ ํ์ผ ํ์์ ๋ง๋ค์ง ์๋๋ค. ๋๋ถ๋ถ Parquet์ ๊ทธ๋๋ก ์ด๋ค
2. ์ธ ํฌ๋งท์ ์ถ์ ๊ณผ ์ค๊ณ ๋๊ธฐ
๊ฐ์ ๋ฌธ์ ๋ฅผ ํ์์ง๋ง ์ถ๋ฐ์ ์ด ๋ฌ๋๊ณ ๊ทธ ์ฐจ์ด๊ฐ ์ง๊ธ๊น์ง ์ค๊ณ์ ๋จ์ ์๋ค.
| ๊ตฌ๋ถ | Apache Iceberg | Delta Lake | Apache Hudi |
|---|---|---|---|
| ์ถ์ | Netflix, 2017 | Databricks, 2019 | Uber, 2016 |
| ์ฌ๋จ | Apache | Linux Foundation | Apache |
| ์ต์ด ๋๊ธฐ | ํํ๋ฐ์ดํธ ํ ์ด๋ธ์ query planning ์ง์ฐ | Spark ํ์ดํ๋ผ์ธ์ ์ ๋ขฐ์ฑ | CDC ๋ฐ์ดํฐ์ ๋ ์ฝ๋ ๋จ์ ๊ฐฑ์ |
| ์ค๊ณ ์ค์ฌ | ์ค์บ ํจ์จ๊ณผ ์์ง ์ค๋ฆฝ์ฑ | ๋จ์ํจ๊ณผ Spark ํตํฉ | ingestion ์ง์ฐ๊ณผ upsert ์ฒ๋ฆฌ๋ |
- Iceberg: Hive ํ
์ด๋ธ์ด ์์ญ๋ง ํํฐ์
์ ๋๋ฌํ๋ฉด์ ๋ฉํ์คํ ์ด๊ฐ ๋ณ๋ชฉ์ด ๋์ ํ์ผ ๋ชฉ๋ก๊ณผ ํต๊ณ๋ฅผ ๋ฉํ๋ฐ์ดํฐ ํ์ผ์ ๋ฏธ๋ฆฌ ์ ์ฅํด
LISTํธ์ถ ์์ฒด๋ฅผ ์์ด๋ค - Delta: Spark job์ด ์ค๊ฐ์ ์คํจํ๋ฉด ๋ถ๋ถ ์ถ๋ ฅ์ด ๋จ๋ ๋ฌธ์ ์์ ์ถ๋ฐํ๋ค. ๋ก๊ทธ๋ ๋จ์ํ๊ฒ ์ ์งํ๊ณ Spark์์ ๊ฒฐํฉ์ ์ฐ์ ํ๋ค
- Hudi: Uber์ ํธ๋ฆฝ ๋ฐ์ดํฐ๊ฐ ๊ณ์ ๊ฐฑ์ ๋๋ ์ํฉ์ด ๋ฐฐ๊ฒฝ์ด๋ผ ๋ ์ฝ๋ ํค๋ก ํ์ผ์ ์ฐพ๋ ์ธ๋ฑ์ค๋ฅผ ์ฒ์๋ถํฐ ๋ฃ์๋ค
๋น์ : ์ธ ํฌ๋งท์ ์๋ก ๋ค๋ฅธ ๋์๊ด ๊ด๋ฆฌ๋ฒ์ด๋ค
- Iceberg: ์ฌ์๊ฐ ๋ชฉ๋ก ์นด๋๋ฅผ ๊ณ์ธต์ผ๋ก ๊ด๋ฆฌํ๋ค. ์ด๋ ์ฑ ์ด ์ด๋ ์๊ฐ์ ์๊ณ ํ์ด์ง ๋ฒ์๊ฐ ์ผ๋ง์ธ์ง๊น์ง ์นด๋์ ์ ํ ์์ด ์๊ฐ๋ฅผ ๋ ํ์๊ฐ ์๋ค
- Delta: ์ ์ถ๊ณ ์ฅ๋ถ๋ฅผ ์๊ฐ์์ผ๋ก ์ ๋๋ค. ํ์ฌ ์ฌ๊ณ ๋ฅผ ์๋ ค๋ฉด ์ฅ๋ถ๋ฅผ ์ฒ์๋ถํฐ ์ฝ์ด ๋ด๋ ค๊ฐ๋ค. ๋์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ๊ณ ์ค๋ ์ท์ ๋จ๊ธด๋ค
- Hudi: ์ฑ ๋ง๋ค ๊ณ ์ ๋ฒํธ๋ฅผ ๋ถ์ด๊ณ ์์ธ์ ์ ์งํ๋ค. ๊ฐ์ ๋ฒํธ์ ๊ฐ์ ํ์ด ๋ค์ด์ค๋ฉด ์์ธ์ผ๋ก ์๋ณธ์ ์ฐพ์ ๋ฐ๋ก ๊ต์ฒดํ๋ค
3. ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ
์ธ ํฌ๋งท์ ํ ์ด๋ธ์ ํ์ฌ ์ํ๋ฅผ ์๋ก ๋ค๋ฅธ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๊ธฐ๋กํ๋ค.
- Iceberg: manifest ํธ๋ฆฌ
- Delta Lake: ํธ๋์ญ์ ๋ก๊ทธ
- Hudi: ํ์๋ผ์ธ๊ณผ ํ์ผ ๊ทธ๋ฃน
๋ฉํ๋ฐ์ดํฐ๋ฅผ ์คํ ๋ฆฌ์ง์ ํ์ผ๋ก ์๋๋ค๋ ์ ์ ์ ์ด ๊ฐ๋ค. ์ต์ ์ํ๋ฅผ ํ์ธํ๋ ์์น๋ ํฌ๋งท๋ง๋ค ๋ค๋ฅด๋ค.
3.1 Iceberg: manifest ํธ๋ฆฌ
์นดํ๋ก๊ทธ (Hive Metastore / Glue / REST ...)
โโ analytics.orders โโ s3://lake/db/orders/metadata/00002-def.metadata.json
ํ์ฌ ์ค๋
์ท ํฌ์ธํฐ. ์ปค๋ฐ๋ง๋ค ์ด ๊ฐ์ด ๋ฐ๋๋ค
s3://lake/db/orders/
โโ metadata/
โ โโ 00001-abc.metadata.json ์ด์ ๋ฒ์
โ โโ 00002-def.metadata.json โ ์นดํ๋ก๊ทธ๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ฌ ๋ฒ์
โ โ ์คํค๋ง, ํํฐ์
์คํ, ์ ๋ ฌ ์์, ์ค๋
์ท ๋ชฉ๋ก
โ โโ snap-8901-1-xyz.avro manifest list: manifest file ๋ชฉ๋ก + ํํฐ์
๋ฒ์
โ โโ xyz-m0.avro manifest file: ๋ฐ์ดํฐ ํ์ผ ๋ชฉ๋ก + ์ปฌ๋ผ ํต๊ณ
โโ data/
โโ dt=2026-08-05/
โโ 00000-0-abc.parquet- 3๋จ ํธ๋ฆฌ:
metadata.jsonโ manifest list โ manifest file ์์ผ๋ก ๋ด๋ ค๊ฐ๋ค. ์์ ๋ ธ๋์ ํ์ ๋ฒ์ ์์ฝ์ด ๋ค์ด ์์ด ์์์๋ถํฐ ๊ฐ์ง์น๊ธฐ๊ฐ ๋๋ค - ํ์ผ๋ณ ํต๊ณ: ์ปฌ๋ผ๋ง๋ค min/max, null ๊ฐ์, ๊ฐ ๊ฐ์๋ฅผ manifest์ ์ ์ฅํ๋ค.
WHERE amount > 1000์์ ํ์ผ์ max๊ฐ 1000 ์ดํ์ด๋ฉด ํต๊ณ๋ง ๋ณด๊ณ ๊ทธ ํ์ผ์ ๊ฑด๋๋ด๋ค - ๋ถ๋ณ: ์ปค๋ฐํ ๋๋ง๋ค ์
metadata.json์ ์ด๋ค. ๊ธฐ์กด ํ์ผ์ ์์ ํ์ง ์๋๋ค - ์นดํ๋ก๊ทธ๊ฐ ํ์:
metadata/์ ์ฌ๋ฌ ๋ฒ์ ์ด ์์ฌ ์์ด๋ ํ์ผ ๋ชฉ๋ก๋ง์ผ๋ก๋ ์ด๋ ๊ฒ์ด ํ์ฌ์ธ์ง ์ ์ ์๋ค. ์ปค๋ฐ์ ์คํจํด ๋ฒ๋ ค์ง ํ์ผ๋ ์์ฌ ์๋ค
3.2 Delta Lake: ํธ๋์ญ์ ๋ก๊ทธ
s3://lake/orders/
โโ _delta_log/
โ โโ 00000000000000000000.json Action ๋ชฉ๋ก
โ โโ 00000000000000000001.json
โ โโ ...
โ โโ 00000000000000000010.checkpoint.parquet 10์ปค๋ฐ๋ง๋ค ์ ์ฒด ์ํ
โ โโ _last_checkpoint ์ต์ ์ฒดํฌํฌ์ธํธ ์์น
โโ part-00000-....snappy.parquet๊ฐ JSON์ ์ํ ์ ์ฒด๊ฐ ์๋๋ผ ๋ณ๊ฒฝ๋ถ์ ๋ด๋๋ค.
{"add":{"path":"part-00003-....parquet","partitionValues":{},"size":1048576,"modificationTime":1754000000000,"dataChange":true,"stats":"{\"numRecords\":5000,\"minValues\":{\"id\":1}}"}}
{"remove":{"path":"part-00001-....parquet","deletionTimestamp":1754000000000,"dataChange":true}}- ํ์ฌ ์ํ = ์ฒดํฌํฌ์ธํธ + ์ดํ JSON ์ฌ์: ๋ก๊ทธ๋ฅผ ์์๋๋ก ์ ์ฉํด ํ์ผ ๋ชฉ๋ก์ ๋ง๋ ๋ค
- ๊ฒฝ๋ก๋ก ์ต์ ์ํ ํ์ธ:
_delta_log/๋ฅผ ๋์ดํด ๋ฒํธ๊ฐ ๊ฐ์ฅ ํฐ JSON์ ์ฐพ์ผ๋ฉด ์ต์ ์ปค๋ฐ์ด๋ค. ์นดํ๋ก๊ทธ ์์ด ๊ฒฝ๋ก๋ง์ผ๋ก ์ฝํ๋ค - ๊ตฌ์กฐ๊ฐ ์๋ค: ํธ๋ฆฌ๋ฅผ ํ์ง ์๋๋ค. ์ปค๋ฐ์ด ๋ง์ด ์์ด๋ฉด ๋ก๊ทธ ์ฌ์ ๋น์ฉ์ด ์๊ธด๋ค
3.3 Hudi: ํ์๋ผ์ธ๊ณผ ํ์ผ ๊ทธ๋ฃน
s3://lake/orders/
โโ .hoodie/
โ โโ hoodie.properties
โ โโ 20260805120000.commit ํ์๋ผ์ธ instant
โ โโ 20260805121500.deltacommit
โ โโ 20260805130000.compaction.requested
โ โโ metadata/ ๋ฉํ๋ฐ์ดํฐ ํ
์ด๋ธ (๊ทธ ์์ฒด๊ฐ Hudi ํ
์ด๋ธ)
โโ 2026/08/05/
โโ fileId-1_20260805120000.parquet base file
โโ .fileId-1_20260805121500.log.1 log file (MOR)- ํ์๋ผ์ธ: ๋ชจ๋ ๋์์ด instant๋ก ๊ธฐ๋ก๋๋ค. ์ํ๋
requestedโinflightโcompleted๋ก ์งํํ๋ค. ํ์์คํฌํ๊ฐ ๊ฐ์ฅ ํฐ ์๋ฃ instant๊ฐ ํ์ฌ ์ํ๋ผ ์นดํ๋ก๊ทธ ์์ด ์ฝํ๋ค - ํ์ผ ๊ทธ๋ฃน: ๋ ์ฝ๋ ํค๊ฐ ํน์ ํ์ผ ๊ทธ๋ฃน์ ๊ณ ์ ๋งคํ๋๋ค. ๊ฐ์ ํค์ ๊ฐฑ์ ์ ํญ์ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๊ฐ๋ค
- ๋ฉํ๋ฐ์ดํฐ ํ ์ด๋ธ: ํ์ผ ๋ชฉ๋ก, ์ปฌ๋ผ ํต๊ณ, ๋ ์ฝ๋ ์ธ๋ฑ์ค๋ฅผ ๋ณ๋ ๋ด๋ถ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํ๋ค
File Group๊ณผ File Slice: Hudi ๊ณ ์ ๊ฐ๋
- File Group: ๊ฐ์
fileId๋ฅผ ๊ณต์ ํ๋ ํ์ผ ๋ฌถ์. ๋ ์ฝ๋ ํค์ ์์ ๋จ์- File Slice: ํ๋์ base file + ๊ทธ์ ๋ธ๋ฆฐ log file. ์ปค๋ฐ ์์ ๋ง๋ค ์ file slice๊ฐ ์๊ธด๋ค
- ์ด ๊ตฌ์กฐ์์ โ์ด ํค๋ฅผ ๊ฐฑ์ ํ๋ ค๋ฉด ์ด๋ ํ์ผ์ ๊ฑด๋๋ ค์ผ ํ๋์งโ๊ฐ ์ ํด์ง๋ค
์นดํ๋ก๊ทธ: ํฌ๋งท๋ณ ์ญํ
- Iceberg: ํ์ฌ ์ค๋ ์ท ํฌ์ธํฐ๋ฅผ ์นดํ๋ก๊ทธ๊ฐ ๋ค๊ณ ์๋ค. ์นดํ๋ก๊ทธ ์ ์ ์ ๋ณด ์์ด๋ ํ ์ด๋ธ์ ์ด ์ ์๋ค
- DeltaยทHudi: ํ์ฌ ์ํ ์ ๋ณด๊ฐ ์คํ ๋ฆฌ์ง์ ์๋ค. ์นดํ๋ก๊ทธ๋ ์ด๋ฆ๊ณผ ๊ถํ์ ๋ถ์ด๋ ์ฉ๋๋ผ ์ง์๋ ๊ฒฝ๋ก๋ก ๋ค์ ์ฝํ๋ค
- DeltaยทHudi๋ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ๊ณ ํ ์ด๋ธ ๋จ์๋ก ๊ถํ์ ๊ฑธ๊ณ AthenaยทTrino๊ฐ ํ ์ด๋ธ์ ์ฐพ๊ฒ ํ๋ ค๋ฉด ์นดํ๋ก๊ทธ์ ๋ฑ๋กํด์ผ ํ๋ค
4. ์ปค๋ฐ๊ณผ ๋์์ฑ (์์์ฑ์ ๋๊ฐ ๋ณด์ฅํ๋๊ฐ)
4.1 ๊ฐ์ ์ํฉ์ ์ ์ ๋๊ณ ๋ณธ๋ค
๋ฐฐ์น ๋ ๊ฐ๊ฐ ๊ฐ์ ํ ์ด๋ธ์ ๋์์ ์ฐ๋ ์ํฉ์ ๊ฐ์ ํ๋ค.
- 09:00 ๋ฐฐ์น A: ์ด์ ์ฃผ๋ฌธ 1๋ง ๊ฑด์ orders ํ ์ด๋ธ์ ์ถ๊ฐ
- 09:00 ๋ฐฐ์น B: ๋๋ฝ๋ถ ์ฌ์ฒ๋ฆฌ. ๊ฐ์ ํ ์ด๋ธ์ 5์ฒ ๊ฑด ์ถ๊ฐ
- ๊ณตํต ์์์ : ๋ ๋ค 09:00 ์์ ์ ํ ์ด๋ธ ์ํ๋ฅผ ์ฝ๊ณ ๊ฐ์ ์ผ์ ์์ํ๋ค
์ธ ํฌ๋งท์ ๋ค์ ์ ์ฐจ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค.
- ํ์ฌ ํ ์ด๋ธ ์ํ๋ฅผ ์ฝ๋๋ค
- ๊ฐ์ Parquet ๋ฐ์ดํฐ ํ์ผ์ ์คํ ๋ฆฌ์ง์ ์ด๋ค. ์ด ๋จ๊ณ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค
- ๋ง์ง๋ง์ ์ ๋ฐ์ดํฐ ํ์ผ์ ํ ์ด๋ธ ๋ฉํ๋ฐ์ดํฐ์ ๊ธฐ๋กํ๋ค
์ฐจ์ด๋ 3๋ฒ์์ ์๊ธด๋ค. ์ธ ํฌ๋งท์ ์ปค๋ฐ์ ์๋ก ๋ค๋ฅธ ์์น์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
multi-writer: ํ ํ ์ด๋ธ์ ๋ ์ด์์ด ๋์์ ์ฐ๋ ์ํฉ
- ์คํธ๋ฆฌ๋ฐ ingestion์ด ๊ณ์ ์ฐ๋ ์ค์ ๋ฐฐ์น backfill์ด ๊ฐ์ ํ ์ด๋ธ์ ๋ค์ด์ฌ ๋
- compaction์ด๋ cleanup job์ด ingestion๊ณผ ์๊ฐ๋๊ฐ ๊ฒน์น ๋
- ํ์ด ์ฌ๋ฟ์ด๋ผ ์๋ก ๋ค๋ฅธ ํด๋ฌ์คํฐ์์ ๊ฐ์ ํ ์ด๋ธ์ ๊ฐฑ์ ํ ๋
- writer๊ฐ ํ๋๋ฟ์ด๋ฉด ์๋์ ์ปค๋ฐ ๊ฒฝ์์ ์ผ์ด๋์ง ์๋๋ค. ๋ค๋ง compaction ๊ฐ์ table service๋ ๋ณ๋ ํ์์๋ผ ๊ทธ์ชฝ ์ถฉ๋์ ๋จ๋๋ค
์ ๋ค ๋๊ด์ ๋์์ฑ ์ ์ด๋ฅผ ์ด๋ค
- ๊ฐ writer๊ฐ ์์ ํ ๋ค ์ปค๋ฐ ์ง์ ์ ๋ค๋ฅธ ์ปค๋ฐ๊ณผ ์ถฉ๋ํ๋์ง ๊ฒ์ฌํ๋ค
- ๋ฐฐ์น job ์ฌ์ด์ ์ถฉ๋์ด ๋๋ฌผ๋ฉด ์ถฉ๋๋ก ๋ค์ ์ฒ๋ฆฌํ ์์ ๋ ์ ๋ค
- Iceberg๋ ์นดํ๋ก๊ทธ์ ํฌ์ธํฐ ๊ต์ฒด, Delta๋ ๋ก๊ทธ ํ์ผ์ ์กฐ๊ฑด๋ถ ์์ฑ, Hudi์ OCC ๋ชจ๋๋ ์ปค๋ฐ ๋ฝ์ผ๋ก ๋ง์ง๋ง ๊ธฐ๋ก์ ์กฐ์ ํ๋ค
์ฝ๊ธฐ ์ถฉ๋์ ์ด๋ฏธ ํ๋ ค ์๋ค
- ์ธ ํฌ๋งท ๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ์ ๋ฎ์ด์ฐ์ง ์๊ณ ์๋ก ์๋๋ค. ์ฝ๋ ์ชฝ์ ์๊ธฐ๊ฐ ์ก์ ์ค๋ ์ท์ ๊ณ์ ๋ณธ๋ค
- reader๋ ํน์ ๋ฒ์ ์ ๊ณ์ ์ฝ๋๋ค. ์ดํ ์ค๋ช ์ writer โ writer์ ์ง์คํ๋ค
ํฌ๋งท reader โ writer writer โ writer Iceberg ์ค๋ ์ท ์นดํ๋ก๊ทธ CAS Delta ๋ฒ์ ๋ณ ๋ก๊ทธ ๋ก๊ทธ ํ์ผ ์ด๋ฆ ์ ์ Hudi ํ์๋ผ์ธ instant OCC + ์ธ๋ถ lock provider
4.2 Iceberg: ์นดํ๋ก๊ทธ์ ํฌ์ธํฐ๋ฅผ ๋ฐ๊พผ๋ค
์นดํ๋ก๊ทธ๋ ํ์ฌ metadata.json์ ์์น๋ฅผ ํฌ์ธํฐ๋ก ์ ์ฅํ๋ค. ์ปค๋ฐ์ ๊ทธ ํฌ์ธํฐ๋ฅผ ๋ฐ๊พธ๋ ์ผ์ด๋ค.
sequenceDiagram participant A as ๋ฐฐ์น A participant C as ์นดํ๋ก๊ทธ participant B as ๋ฐฐ์น B A->>C: ํ์ฌ ํฌ์ธํฐ ์กฐํ C-->>A: v3 B->>C: ํ์ฌ ํฌ์ธํฐ ์กฐํ C-->>B: v3 Note over A,B: ๊ฐ์ parquet๊ณผ manifest, v4.json ์์ฑ A->>C: ์์ง v3๋ฉด v4๋ก ๋ฐ๊ฟ๋ผ C-->>A: ์ฑ๊ณต. ํฌ์ธํฐ๋ v4 B->>C: ์์ง v3๋ฉด v4๋ก ๋ฐ๊ฟ๋ผ C-->>B: ์คํจ. ํ์ฌ๊ฐ์ v4 Note over B: ๋ฐ์ดํฐ ํ์ผ์ ๊ทธ๋๋ก ๋๊ณ <br/>v4 ๊ธฐ์ค์ผ๋ก manifest๋ง ๋ค์ ์์ฑ B->>C: ์์ง v4๋ฉด v5๋ก ๋ฐ๊ฟ๋ผ C-->>B: ์ฑ๊ณต. ํฌ์ธํฐ๋ v5
- B์ Parquet ํ์ผ์ ๋ฒ๋ฆฌ์ง ์๋๋ค: ์ด๋ฏธ ์คํ ๋ฆฌ์ง์ ์ด ๋ฐ์ดํฐ๋ ๊ทธ๋๋ก ๋๊ณ manifest๋ง ์ ๊ธฐ์ค์ผ๋ก ๋ค์ ๋ง๋ ๋ค. ๊ทธ๋์ ์ฌ์๋ ๋น์ฉ์ด ๋ฎ๋ค
- ์ปค๋ฐ ์์์ฑ์ ์นดํ๋ก๊ทธ๊ฐ ์กฐ์ ํ๋ค: ์นดํ๋ก๊ทธ๊ฐ ํ์ฌ
metadata.jsonํฌ์ธํฐ์ ๊ต์ฒด๋ฅผ ์กฐ์ ํ๋ค - ๋์ ์นดํ๋ก๊ทธ๊ฐ ์์ผ๋ฉด ํ ์ด๋ธ์ด ์ฑ๋ฆฝํ์ง ์๋๋ค
์ปค๋ฐ ๊ฒ์ฆ: ํฌ์ธํฐ ๋น๊ต์ ์ถฉ๋ ํ์
- CAS๋ ํฌ์ธํฐ ๊ฐ๋ง ๋น๊ตํ๋ค. ํฌ์ธํฐ๋ ํ ์ด๋ธ์ ํ๋๋ฟ์ด๋ผ ๋ค๋ฅธ ํํฐ์ ์ appendํ ์ปค๋ฐ์๋ ์คํจํ๋ค
- ๊ทธ๋์ ์ฌ์๋ํ ๋ ์ base๋ฅผ ์ฝ๊ณ ๊ทธ ์ปค๋ฐ์ด ์๊ธฐ์ ์ค์ ๋ก ์ถฉ๋ํ๋์ง ํ ๋ฒ ๋ ํ์ ํ๋ค. ๋ ๋ค append๋ฉด ์ถฉ๋์ด ์๋๋ผ manifest๋ง ๋ค์ ๋ง๋ค๊ณ ๋์ด๊ฐ๋ค
- ์ด ํ์ ๊ธฐ์ค์ ์ค์ ์ผ๋ก ์ ํ๋ค
์์ฑ ๊ธฐ๋ณธ๊ฐ ํ์ฉ ๊ฐ/์๋ฏธ write.delete.isolation-levelserializableserializable๋๋snapshotwrite.update.isolation-levelserializableใ write.merge.isolation-levelserializableใ commit.retry.num-retries4์ฌ์๋ ํ์
serializable์ ๋ด ํํฐ์ ๋ง๋ ํ์ผ์ด ๊ทธ์ฌ์ด ์ถ๊ฐ๋์ผ๋ฉด ์คํจ์ํค๊ณsnapshot์ ๊ฐ์ ํ์ผ์ด ์ง์์ก์ ๋๋ง ์คํจ์ํจ๋ค
์นดํ๋ก๊ทธ CAS: metadata ํฌ์ธํฐ์ ์กฐ๊ฑด๋ถ ๊ต์ฒด
- Iceberg๋ CAS๋ก ํ์ฌ metadata ํฌ์ธํฐ๊ฐ writer๊ฐ ์ฝ์๋ ๊ฐ๊ณผ ๊ฐ์ ๋๋ง ์ metadata ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ก ๊ต์ฒดํ๋ค
4.3 Delta: ๋ก๊ทธ ํ์ผ ์ด๋ฆ์ ์ ์ ํ๋ค
_delta_log/ ์๋ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง JSON์ ์๋ ๊ตฌ์กฐ๋ผ ์ปค๋ฐ์ ๋ค์ ๋ฒํธ์ ๋ก๊ทธ ํ์ผ์ ์์ฑํ๋ ์ผ์ด๋ค.
sequenceDiagram participant A as ๋ฐฐ์น A participant L as _delta_log/ participant B as ๋ฐฐ์น B A->>L: ์ต์ ๋ก๊ทธ ๋ฒํธ ์กฐํ L-->>A: 002 B->>L: ์ต์ ๋ก๊ทธ ๋ฒํธ ์กฐํ L-->>B: 002 Note over A,B: ๊ฐ์ parquet ์์ฑ A->>L: 003.json ์์ผ๋ฉด ์ฐ๊ธฐ L-->>A: ์ฑ๊ณต B->>L: 003.json ์์ผ๋ฉด ์ฐ๊ธฐ L-->>B: ์คํจ. ์ด๋ฏธ ์์ B->>L: 003.json ์ฝ๊ธฐ L-->>B: A์ ๋ณ๊ฒฝ๋ถ Note over B: ๋ ๋ค ์ถ๊ฐ๋ผ ์ถฉ๋ ์๋<br/>๋ฒํธ๋ง ๋ฐ์ด ์ฌ์๋ B->>L: 004.json ์์ผ๋ฉด ์ฐ๊ธฐ L-->>B: ์ฑ๊ณต
- ์ถฉ๋ ๊ฒ์ฌ๊ฐ ํ ๋จ๊ณ ๋ ์๋ค: B๋ ์๊ธฐ๊ฐ ์ฝ์ ๋ค ๋ค์ด์จ 003.json์ ์ด์ด๋ณธ๋ค. ๋ ๋ค append๋ฉด ๋ฒํธ๋ง ๋ฐ์ด ์ฌ์๋ํ๋ค. A๊ฐ ์ง์ด ํ์ผ์ B๋ ์ง์ฐ๋ ค ํ๋ค๋ฉด ์ค์ ์ถฉ๋์ด๋ผ ์คํจํ๋ค
- ์นดํ๋ก๊ทธ๊ฐ ํ์ ์๋ค: ์ต์ ์ปค๋ฐ์ ์๋ ค๋ฉด
_delta_log/๋ฅผ ๋์ดํด ๊ฐ์ฅ ํฐ ๋ฒํธ๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค
PUT-if-absent: ์์ ๋๋ง ์จ๋ผ
- โ์ด ์ด๋ฆ์ ํ์ผ์ด ์์ง ์์ผ๋ฉด ๋ง๋ ๋ค. ์ด๋ฏธ ์์ผ๋ฉด ์คํจํ๋คโ๋ฅผ ์ชผ๊ฐค ์ ์๋ ํ ๋์์ผ๋ก ์ฒ๋ฆฌํ๋ค
- Unix์
open(O_CREAT|O_EXCL)๊ณผ HTTP์If-None-Match: *๋ ๋์์ด ์์ ๋๋ง ์์ฑํ๋ ์กฐ๊ฑด์ ์ง์ ํ๋ ์๋ค- CAS์ ๋ฐ์์ ๊ฐ๊ณ ๋น๊ต ๋์๋ง ๋ค๋ฅด๋ค. CAS๋ ๊ฐ์ ๋ณด๊ณ ์ด์ชฝ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ณธ๋ค
์ฃผ์: S3 multi-writer Delta ํ ์ด๋ธ
- ์ด ๋ฐฉ์์ ์คํ ๋ฆฌ์ง๊ฐ โ์์ ๋๋ง ์ฐ๊ธฐโ๋ฅผ ์์์ ์ผ๋ก ๋ณด์ฅํด์ผ ์ฑ๋ฆฝํ๋ค
- HDFS์ ADLS๋ ํ์ผ ์์คํ ์์ค์ ์์์ ๋์์ ์ ๊ณตํด ๋ฌธ์ ๊ฐ ์๋ค. S3์๋ ์ค๋๋๋ก ์ด ๊ธฐ๋ฅ์ด ์์ด์ ๋ ํด๋ฌ์คํฐ๊ฐ ๊ฐ์
003.json์ ์ฐ๋ฉด ์ด์ ์ปค๋ฐ ๋ก๊ทธ๊ฐ ๋ฎ์ด์จ์ง ์ ์์๋ค- ๊ทธ๋์
S3DynamoDBLogStore๋ก DynamoDB์ ๋ฝ ํ ์ด๋ธ์ ๋๋ ๊ตฌ์ฑ์ด ํ์ํ๋ค- S3๊ฐ
If-None-Match์กฐ๊ฑด๋ถ ์ฐ๊ธฐ๋ฅผ ์ง์ํ๋ฉด์ ์ ์ฝ์ด ํ๋ ธ์ง๋ง ์ด์ ์ค์ธ Delta ๋ฒ์ ์ด ์ด๋ฅผ ์ฐ๋์ง ํ์ธ์ด ํ์ํ๋ค- ๋จ์ผ Spark ํด๋ฌ์คํฐ๋ง ์ฐ๋ ๊ฒฝ์ฐ์๋ ํด๋นํ์ง ์๋๋ค
ADLS: Azure Data Lake Storage
- Azure์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์์ ๊ณ์ธต์ ๋ค์์คํ์ด์ค๋ฅผ ์น์ ๊ฒ์ด๋ผ ๋๋ ํฐ๋ฆฌ์ rename์ด ์ค์ฌํ๋ค
- ADLS์ ์์์ rename: ๊ณ์ธต์ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ADLS์์๋ ๊ฐ์ ํ์ผ ์์คํ ์์ rename์ ์์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ์์ ๊ฒฝ๋ก์ ํ์ผ์ ๋ค ์ด ๋ค ์ต์ข ๊ฒฝ๋ก๋ก renameํด ๊ณต๊ฐํ๋ค
- S3์๋ rename์ด ์๋ค. ๋ณต์ฌ ํ ์ญ์ ๋ผ ํ์ผ ์๋งํผ ๋น์ฉ์ด ๋ถ๊ณ ์ค๊ฐ์ ์คํจํ๋ฉด ๋ถ๋ถ ์๋ฃ ์ํ๊ฐ ๋จ๋๋ค
- HDFS๋ ์์์ rename์ ์ ๊ณตํ๋ค
4.4 Hudi: ๋ฐ์ดํฐ ํ์ผ์ ๋ฝ ๋ฐ์์ ์ฐ๊ณ ์ปค๋ฐ๋ง ๋ฝ ์์์ ์ฒ๋ฆฌํ๋ค
๊ธฐ๋ณธ ๊ฐ์ ์ด ๋จ์ผ writer๋ค. ๋ค๋ง ๋จ์ผ writer ๋ชจ๋์์๋ ๋์์ฑ ์ ์ด๋ ์ด๋ฏธ ๋๊ณ ์๋ค. ingestion writer์ ๋ณ๋๋ก compactionยทclusteringยทcleaning ๊ฐ์ table service๊ฐ ๊ฐ์ ํ ์ด๋ธ์ ๊ฑด๋๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
reader๋ ์ฝ๊ธฐ ์์ ์์ ์ ํ์ผ ๋ฒ์ ์ ์ฐธ์กฐํ๊ณ writer๋ ์ ๋ฒ์ ์ ์ด๋ค. ๊ฐ์ ํ๋ก์ธ์ค์ writer์ async table service๋ฅผ ๋ฝ์ผ๋ก ์กฐ์ ํ ๋๋ InProcessLockProvider๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
| ๋ถ๋ชํ๋ ์กฐํฉ | ํด๊ฒฐ ์๋จ | ๋ฝ |
|---|---|---|
| writer โ reader | ๋ฒ์ | ๋ถํ์ |
| writer โ ๊ฐ์ ํ๋ก์ธ์ค์ async table service | ๋ฒ์ + ํ๋ก์ธ์ค ๋ด๋ถ ์กฐ์ | ํ์ ์ InProcessLockProvider |
| writer โ writer (OCC ๋ชจ๋) | OCC | ๊ณต์ ๋ฝ ํ์ |
์ฌ๋ฌ writer๋ฅผ OCC ๋ชจ๋๋ก ์คํํ ๋๋ writer ์ฌ์ด์์ ๊ณต์ ํ ๋ฝ์ ์ง์ ํ๋ค.
sequenceDiagram participant A as ๋ฐฐ์น A participant K as ๋ฝ ์๋น์ค participant B as ๋ฐฐ์น B Note over A,B: ๊ฐ์ parquet ์์ฑ. ์ฌ๊ธฐ๊น์ง๋ ๋ฝ ๋ฐ์ด๋ค A->>K: ๋ฝ ์์ฒญ K-->>A: ํ๋ B->>K: ๋ฝ ์์ฒญ Note over B: ๋๊ธฐ Note over A: ์ถฉ๋ ๊ฒ์ฌ ํ commit ๊ธฐ๋ก A->>K: ๋ฝ ๋ฐ๋ฉ K-->>B: ํ๋ Note over B: ์ถฉ๋ ๊ฒ์ฌ<br/>A์ ๊ฒน์น๋ฉด job ์คํจ
# ๊ธฐ๋ณธ๊ฐ. writer๊ฐ ํ๋๋ฉด ์ด๋๋ก ๋๋ค
hoodie.write.concurrency.mode=SINGLE_WRITER
# writer๊ฐ ๋ ์ด์์ด๋ฉด OCC๋ก ๋ฐ๊พธ๊ณ ๋ฝ์ ์ง์ ํ๋ค
hoodie.write.concurrency.mode=optimistic_concurrency_control
hoodie.write.lock.provider=org.apache.hudi.aws.transaction.lock.DynamoDBBasedLockProvider
hoodie.cleaner.policy.failed.writes=LAZY๋ง์ง๋ง ์ค์ด ํจ๊ป ํ์ํ๋ค. ๊ธฐ๋ณธ๊ฐ EAGER๋ ๋ค๋ฅธ writer๊ฐ ์์ง ์ฐ๋ ์ค์ธ ํ์ผ์ ์คํจํ ๊ฒ์ผ๋ก ๋ณด๊ณ ์ง์ด๋ค.
- ๋ฝ ๊ตฌ๊ฐ์ด ์งง๋ค: ๋ฐ์ดํฐ ํ์ผ ์ฐ๊ธฐ๋ ๋ฝ ๋ฐ์์ ํ๋ค. ์ปค๋ฐ ์ง์ ์ถฉ๋ ๊ฒ์ฌ์ ๊ธฐ๋ก๋ง ๋ฝ ์์ด๋ค
- ์๋ ์ฌ์๋๋ฅผ ํ์ง ์๋๋ค: Iceberg์ Delta๋ ์คํจํ ์ปค๋ฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋ค์ ์๋ํ์ง๋ง Hudi๋ ๊ธฐ๋ณธ์ ์ผ๋ก job์ ์คํจ์ํจ๋ค. ์ฌ์คํ์ ํ์ดํ๋ผ์ธ์์ ์ฒ๋ฆฌํด์ผ ํ๋ค
- ๋น์ฐจ๋จ ๋์์ฑ ์ ์ด: Hudi 1.x๋ ๋ก๊ทธ ํ์ผ ๊ธฐ๋ฐ์ ๋น์ฐจ๋จ ๋์์ฑ ์ ์ด๋ฅผ ์ถ๊ฐํด ์คํธ๋ฆฌ๋ฐ ingestion๊ณผ compaction์ด ์๋ก๋ฅผ ๋ง์ง ์๊ฒ ํ๋ค
lock provider: ๋ฝ ๊ตฌํ ์ง์
- ์ปค๋ฐ ๋ฝ์ ์ฌ์ฉํ ๊ตฌํ์ ์ง์ ํ๋ ์ค์ ์ด๋ค. ๊ฐ์ ํ๋ก์ธ์ค ์์ ๋ฝ์
InProcessLockProvider๋ก ์กฐ์ ํ ์ ์๊ณ ์ฌ๋ฌ writer ์ฌ์ด์์๋ DynamoDB๋ ZooKeeper ๊ฐ์ ๊ณต์ ๋ฝ ๊ตฌํ์ ์ด๋ค- DynamoDB, ZooKeeper, Hive Metastore, ํ์ผ ์์คํ ๊ธฐ๋ฐ ์ค์ ๊ณ ๋ฅธ๋ค
- ๋ฝ ์๋น์ค๊ฐ ์ค๋จ๋๋ฉด ์ปค๋ฐ์ด ๋งํ๊ณ ๋ฝ์ ํด์ ํ์ง ๋ชปํ ์ฑ job์ด ๋น์ ์ ์ข ๋ฃํ๋ฉด ๋ง๋ฃ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ค
๋จ์ผ writer์๋ lock provider๊ฐ ๋์ค๋ ๊ฒฝ์ฐ
- ํ ํ๋ก์ธ์ค๊ฐ ์ฐ๋ฉด์ async table service๋ฅผ ํจ๊ป ์คํํ๋ ๊ตฌ์ฑ์์๋
InProcessLockProvider๋ฅผ ์ฌ์ฉํ ์ ์๋ค- ๊ฐ์ JVM ์์์๋ง ๋๋ ๋ฝ์ด๋ผ DynamoDB๋ ZooKeeper๊ฐ ํ์ ์๋ค
4.5 ์ ๋ฆฌ
| ํฌ๋งท | ์์์ฑ์ ๊ทผ๊ฑฐ | ์คํจํ ์ชฝ์ ์ฒ๋ฆฌ | ํ์ ์ธ๋ถ ๊ตฌ์ฑ ์์ |
|---|---|---|---|
| Iceberg | ์นดํ๋ก๊ทธ์ CAS | manifest๋ง ๋ค์ ๋ง๋ค์ด ์ฌ์๋ | ์นดํ๋ก๊ทธ (ํ์) |
| Delta | ๋ก๊ทธ ํ์ผ PUT-if-absent | ๋ก๊ทธ ๋ฒํธ๋ฅผ ๋ฐ์ด ์ฌ์๋ | ์์. S3 multi-writer๋ ์กฐ๊ฑด๋ถ ์ฐ๊ธฐ ๋๋ ๋ฝ |
| Hudi | ํ์๋ผ์ธ + ์ธ๋ถ ๋ฝ | ๊ธฐ๋ณธ์ job ์คํจ | multi-writer์ผ ๋ lock provider |
์์ append ์์์์ Iceberg์ Delta๋ ์ถฉ๋ ๊ฒ์ฆ์ ํต๊ณผํ๋ฉด ์ด๋ฏธ ์ด ๋ฐ์ดํฐ ํ์ผ์ ์ฌ์ฌ์ฉํด ์ปค๋ฐ์ ๋ค์ ์๋ํ๋ค. ์ด ์ฌ์๋๋ ๋ฉํ๋ฐ์ดํฐ ๊ฐฑ์ ์ด ์ค์ฌ์ด๋ค. Hudi์ job ์คํจ ํ ์ฌ์คํ ๋น์ฉ์ ํ์ดํ๋ผ์ธ์ ์ฌ์ฒ๋ฆฌ ๋ฒ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
5. ์นดํ๋ก๊ทธ ์ ๋ต
Iceberg๋ ์นดํ๋ก๊ทธ๋ก ํ ์ด๋ธ์ ์กฐํํ๊ณ ๋ฉํ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ปค๋ฐํ๋ค. ์นดํ๋ก๊ทธ ๊ตฌ์ฑ์ ์ฐ์ด๋ API ๊ท๊ฒฉ, ๊ตฌํ์ฒด, ์ ์ฅ ์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ถํ๋ค.
| ํญ๋ชฉ | ์ข ๋ฅ | ์ค๋ช |
|---|---|---|
| Hive Metastore | ๋ฉํ๋ฐ์ดํฐ ์๋น์ค | ํ ์ด๋ธ๊ณผ ์คํค๋ง ๋ฑ์ ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ |
| AWS Glue Data Catalog | ๊ด๋ฆฌํ ์นดํ๋ก๊ทธ ์๋น์ค | AWS์์ ์ ๊ณตํ๋ ์ค์ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์ |
| Iceberg REST Catalog API | ์ธํฐํ์ด์ค ๊ท๊ฒฉ | ์์ง๊ณผ ์นดํ๋ก๊ทธ ์ฌ์ด์ ๊ณตํต HTTP API |
| Nessie | ์นดํ๋ก๊ทธ ๊ตฌํ | ํ ์ด๋ธ ๋ฉํ๋ฐ์ดํฐ์ ๋ธ๋์น์ ์ปค๋ฐ ๊ด๋ฆฌ |
| Polaris | ์นดํ๋ก๊ทธ ๊ตฌํ | Iceberg REST Catalog API ๊ตฌํ |
| S3 Tables | ๊ด๋ฆฌํ ํ ์ด๋ธ ์คํ ๋ฆฌ์ง | Iceberg ํ ์ด๋ธ ์ ์ฅ๊ณผ ์ ์ง๋ณด์ ์ ๊ณต |
| HadoopCatalog | ํ์ผ ์์คํ ๊ธฐ๋ฐ ์นดํ๋ก๊ทธ ๊ตฌํ | ๋๋ ํฐ๋ฆฌ์ ๋ฉํ๋ฐ์ดํฐ ํ์ผ๋ก ๊ด๋ฆฌ. ์์์ rename ํ์ |
์๋๋ Spark๋ฅผ REST Catalog API๋ก Polaris์ ์ฐ๊ฒฐํ๋ ์ค์ ์ด๋ค.
spark.conf.set("spark.sql.catalog.prod", "org.apache.iceberg.spark.SparkCatalog")
spark.conf.set("spark.sql.catalog.prod.type", "rest")
spark.conf.set("spark.sql.catalog.prod.uri", "https://polaris.example.com/api/catalog")Delta์ Hudi๋ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. ์นดํ๋ก๊ทธ ๋ฑ๋ก์ ์ด๋ฆ ๋ถ์ด๊ธฐ์ ๊ถํ ๊ด๋ฆฌ ์ฉ๋์ด๊ณ ์ปค๋ฐ ์์์ฑ๊ณผ๋ ๋ฌด๊ดํ๋ค.
# ์นดํ๋ก๊ทธ ๋ฑ๋ก ์์ด ์ฝํ๋ค
spark.read.format("delta").load("s3://lake/orders")
spark.read.format("hudi").load("s3://lake/orders")- ํ ์ด๋ธ ์ด๋ฆ๊ณผ ๊ฒฝ๋ก ๋ณ๊ฒฝ: Iceberg์ ํ ์ด๋ธ ์ด๋ฆ์ ์นดํ๋ก๊ทธ์์ ๋ฐ๊พธ๋ฉฐ ๋ฐ์ดํฐ ํ์ผ์ ์ด๋ํ์ง ์๋๋ค. ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋ ํ ์ด๋ธ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฎ๊ธธ ๋๋ ์ฝ๊ธฐ ๊ฒฝ๋ก์ ์นดํ๋ก๊ทธ ๋ฑ๋ก ์ ๋ณด๋ ํจ๊ป ํ์ธํ๋ค
- ํ์ผ ์์น์ ์์ ๋: Iceberg manifest๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋กํด ํ ํ ์ด๋ธ์ ํ์ผ์ด ์ฌ๋ฌ ๋ฒํท์ ํฉ์ด์ ธ๋ ๋๋ค. Delta์ Hudi๋ฅผ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ์ฝ์ ๋๋ ํ ์ด๋ธ์ ๋ฃจํธ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค
- ์ด๊ธฐ ์ง์ ๋น์ฉ: Delta์ Hudi๋ ์นดํ๋ก๊ทธ๋ฅผ ๋ณ๋๋ก ๊ตฌ์ถยท์ด์ํ์ง ์๊ณ ์์ํ๋ค
์ฃผ์: ์นดํ๋ก๊ทธ ๊ต์ฒด ์ ๊ถํ๊ณผ job ์ค์ ๋ณ๊ฒฝ
- ์นดํ๋ก๊ทธ๋ฅผ ๋ฐ๊พธ๋ฉด ํ ์ด๋ธ ์ฌ๋ฑ๋ก, ๊ถํ ์ฌ์ค๊ณ, ๋ชจ๋ job์ ์ปค๋ฅํฐ ์ค์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค
- ์ด๊ธฐ ์ค๊ณ ๋จ๊ณ์์ ์นดํ๋ก๊ทธ์ ๊ถํยท์ปค๋ฅํฐ ๊ตฌ์ฑ์ ํจ๊ป ๊ฒํ ํ๋ค
6. ํํฐ์ , ๋ฐ์ดํฐ ๋ฐฐ์น์ Data Skipping
์ฝ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ด๋ ๊ธฐ๋ฒ์ ์ญํ ์ ๋ฐ๋ผ ๊ตฌ๋ถํ๋ค.
| ์ญํ | ๋์ |
|---|---|
| ํํฐ์ ๋ | ๋ฐ์ดํฐ๋ฅผ ํํฐ์ ์ผ๋ก ๋๋๊ณ ์กฐํ ์กฐ๊ฑด์ ๋ง๋ ํํฐ์ ๋ง ์ ํ |
| ๋ฐ์ดํฐ ๋ฐฐ์น | ์ ๋ ฌยทZ-Orderingยทclustering์ผ๋ก ๊ด๋ จ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ํ์ผ์ ๋ชจ์ |
| ํต๊ณ ๊ธฐ๋ฐ Data Skipping | ์กฐํ ์กฐ๊ฑด๊ณผ ํ์ผ๋ณ min/max ๋ฑ์ ๋น๊ตํด ๋ถํ์ํ ํ์ผ ์ ์ธ |
์ ๋ ฌ ๋ฑ์ผ๋ก ํ์ผ๋ณ ๊ฐ ๋ฒ์๋ฅผ ์ขํ๋ฉด ์กฐํ ์กฐ๊ฑด๊ณผ ๊ฒน์น์ง ์๋ ํ์ผ์ ์ ์ธํ๊ธฐ ์ฌ์์ง๋ค.
์ธ ํฌ๋งท ๋ชจ๋ ํ์ผ๋ณ ์ปฌ๋ผ ํต๊ณ๋ฅผ ํ์ฉํ data skipping์ ์ง์ํ๋ฉฐ ํต๊ณ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅด๋ค.
| ํฌ๋งท | ํ์ผ๋ณ ์ปฌ๋ผ ํต๊ณ์ ๊ด๋ฆฌ ์์น |
|---|---|
| Iceberg | manifest์ ๋ฐ์ดํฐ ํ์ผ ํญ๋ชฉ |
| Delta | ํธ๋์ญ์
๋ก๊ทธ์ ํ์ผ ๋ฉํ๋ฐ์ดํฐ (add.stats) |
| Hudi | ๋ฉํ๋ฐ์ดํฐ ํ
์ด๋ธ์ column_stats |
๊ตฌํ ์: Hidden Partitioning๊ณผ ๋ฐ์ดํฐ ๋ฐฐ์น
- Hidden Partitioning(Iceberg): ์๋ณธ ์ปฌ๋ผ์ ์กฐํ ์กฐ๊ฑด์ ํํฐ์ ์กฐ๊ฑด์ผ๋ก ๋ณํํ๋ค. ์๋ฅผ ๋ค์ด
ts์กฐ๊ฑด์ผ๋กdays(ts)ํํฐ์ ์ ๊ณ ๋ฅธ๋ค- Z-Ordering: ์ฌ๋ฌ ์ปฌ๋ผ์ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ ํ์ผ์ ๋ชจ์ผ๋ ๋ฐฐ์น ๊ธฐ๋ฒ์ด๋ค. Delta์ Iceberg, Hudi์ ์ง์ ์์ง์์ ์ฌ์ฉํ ์ ์๋ค
- Liquid Clustering(Delta): ์ง์ ํ ํค๋ก
OPTIMIZE๊ฐ ํ์ํ ํ์ผ์ ์ ์ง์ ์ผ๋ก ์ฌ๋ฐฐ์นํ๋ค. ํค ๋ณ๊ฒฝ๊ณผ ๊ธฐ์กด ํ์ผ ์ฌ๋ฐฐ์น๋ ๋ณ๋ ์์ ์ด๋ฉฐ ํํฐ์ ๋ยทZ-Ordering๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค
-- Iceberg: Hidden Partitioning (Spark SQL)
CREATE TABLE orders_iceberg (order_id BIGINT, ts TIMESTAMP)
USING iceberg
PARTITIONED BY (days(ts));
-- ์๋ณธ ์ปฌ๋ผ์ ์กฐ๊ฑด์ผ๋ก ํํฐ์
์ ์ ํํ๋ค
SELECT * FROM orders_iceberg
WHERE ts >= TIMESTAMP '2026-08-01 00:00:00';-- Delta: ๊ธฐ์กด ํ
์ด๋ธ์ Z-Ordering ์ ์ฉ
OPTIMIZE orders ZORDER BY (customer_id, ts);-- Delta: Liquid Clustering ํ
์ด๋ธ ์์ฑ
CREATE TABLE orders_clustered (customer_id BIGINT, ts TIMESTAMP)
USING DELTA
CLUSTER BY (customer_id, ts);7. ์ ๋ฐ์ดํธ์ ์ญ์ ์ฒ๋ฆฌ
์ ๋ฐ์ดํธ์ ์ญ์ ๋ ๋ ์ดํฌํ์ฐ์ค์์ ๋น์ฉ์ด ํฐ ์ฐ์ฐ์ด๋ผ ์ธ ํฌ๋งท์ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๊ฐ๋ฆฐ๋ค.
7.1 ๊ธฐ๋ณธ ์ ๋ต
- Copy-on-Write (COW)
- ๊ทธ ํ์ด ๋ ํ์ผ์ ํต์งธ๋ก ๋ค์ ์
- ์ฐ๊ธฐ ๋น์ / ์ฝ๊ธฐ ๋น ๋ฆ
- Merge-on-Read (MOR)
- ๋ณ๊ฒฝ๋ถ๋ง ๋ฐ๋ก ๊ธฐ๋ก, ์ฝ์ ๋ ๋ณํก
- ์ฐ๊ธฐ ๋น ๋ฆ / ์ฝ๊ธฐ ๋น์
7.2 ํฌ๋งท๋ณ ๊ตฌํ
| COW | MOR ๋ฐฉ์ | |
|---|---|---|
| Iceberg | ๊ธฐ๋ณธ | position delete / equality delete ํ์ผ. v3 ์คํ์์ deletion vector ๋์ |
| Delta | ๊ธฐ๋ณธ | Deletion Vector. ์ญ์ ๋ ํ ์์น๋ฅผ ๋นํธ๋งต์ผ๋ก ํ์ |
| Hudi | ํ ์ด๋ธ ํ์ ์ผ๋ก ์ ํ | ํ ์ด๋ธ ํ์ ์ผ๋ก ์ ํ. base file + Avro log file |
- Iceberg: ์ญ์ ๋ฅผ ๋ณ๋ ํ์ผ๋ก ๊ธฐ๋กํ๋ค. ์์น ๊ธฐ๋ฐ๊ณผ ๊ฐ ๊ธฐ๋ฐ ๋ ๊ฐ์ง๊ฐ ์๊ณ ๊ฐ ๊ธฐ๋ฐ์ ์ ์ฐํ์ง๋ง ์ฝ๊ธฐ ๋น์ฉ์ด ํฌ๋ค
- Delta: Deletion Vector๋ก ํ์ผ ์ฌ์์ฑ์ ํผํ๋ค. ํ ํ์ ์ง์ฐ๋ ค๊ณ 1GB ํ์ผ์ ๋ค์ ์ฐ๋ ์ํฉ์ ๋ง๋๋ค
- Hudi: ํ ์ด๋ธ์ ๋ง๋ค ๋ COW/MOR์ ์ ํ๋ค. MOR ํ ์ด๋ธ์ ์ฟผ๋ฆฌ ํ์ ๋ ๋๋๋ค
Hudi MOR์ ์ธ ๊ฐ์ง ์ฟผ๋ฆฌ ํ์
- Snapshot: base + log๋ฅผ ๋ณํฉํด ์ต์ ์ํ๋ฅผ ๋ณธ๋ค. log ๋ณํฉ ๋น์ฉ์ด ๋ถ๋๋ค
- Read Optimized: base file๋ง ์ฝ์ด log ๋ณํฉ ๋น์ฉ์ ์ค์ง๋ง ๋ง์ง๋ง compaction ์์ ๊น์ง์ ๋ฐ์ดํฐ๋ง ๋ณธ๋ค
- Incremental: ํน์ ์ปค๋ฐ ์ดํ ๋ณ๊ฒฝ๋ ๋ ์ฝ๋๋ง ์ฝ๋๋ค
7.3 upsert ์ฑ๋ฅ ์ฐจ์ด
upsert์์๋ ๋์ ํ์ผ์ ์ฐพ๋ ๋ฐฉ์์ด ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋ง๋ ๋ค.
Iceberg / Delta์ MERGE
โ ๋์ ํ์ผ์ ์ฐพ๊ธฐ ์ํด ์์ค์ ํ๊น์ ์กฐ์ธ
โ ํต๊ณ๋ก ์ขํ์ง๋ง ํค๊ฐ ๋๊ฒ ํผ์ ธ ์์ผ๋ฉด ๋ง์ ํ์ผ์ ๊ฑด๋๋ฆผ
Hudi์ upsert
โ ์ธ๋ฑ์ค๋ก ์
๋ ฅ ๋ ์ฝ๋ ํค์ ํด๋นํ๋ ํ์ผ ๊ทธ๋ฃน ํ์
โ ๊ทธ ํ์ผ ๊ทธ๋ฃน์๋ง ์ฐ๊ธฐHudi์ ์ธ๋ฑ์ค๋ upsertํ ๋ ์ฝ๋์ ํค๋ก ๋์ ํ์ผ ๊ทธ๋ฃน์ ์ฐพ๋๋ค.
| ์ธ๋ฑ์ค | ํ์ผ ๊ทธ๋ฃน์ ์ฐพ๋ ๋ฐฉ์ |
|---|---|
| Bloom | ๋ ์ฝ๋ ํค์ Bloom filter๋ก ํ๋ณด ํ์ผ์ ์ขํ |
| Simple | ์ ๋ ฅ ๋ ์ฝ๋ ํค์ ๊ธฐ์กด ๋ฐ์ดํฐ์ ํค๋ฅผ ์กฐ์ธํด ์์น๋ฅผ ์ฐพ์ |
| Bucket | ๋ ์ฝ๋ ํค์ ํด์๋ก ํ์ผ ๊ทธ๋ฃน์ ๊ฒฐ์ |
| Record Level Index | ๋ฉํ๋ฐ์ดํฐ ํ ์ด๋ธ์ ๋ ์ฝ๋ ํคโํ์ผ ๊ทธ๋ฃน ๋งคํ ์ ์ฅ |
8. ์คํค๋ง ์งํ
์ธ ํฌ๋งท ๋ชจ๋ ์คํค๋ง ์งํ๋ฅผ ์ง์ํ์ง๋ง ์ค์ ์์ด ๋๋ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค.
- Iceberg: ์ปฌ๋ผ๋ง๋ค ๊ณ ์ ID๋ฅผ ๋ถ์ฌํ๋ค. ์ด๋ฆ์ด ์๋๋ผ ID๋ก ๋งคํํ๋ฏ๋ก ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์์๋ฅผ ์ฎ๊ฒจ๋ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ์ฝํ๋ค. ์ถ๊ฐยท์ญ์ ยทrenameยท์์ ๋ณ๊ฒฝยทํ์ ์น๊ฒฉ์ด ์ค์ ์์ด ๋๋ค
- Delta: Column Mapping์ ์ผ๋ฉด Iceberg์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ๋๊ณ ์ฐ๋ฉด ์ญ์ ์ rename์ด ๋งํ๋ค
- Hudi:
schema.on.read๋ฅผ ์ผ์ผ ์ญ์ ์ rename์ด ๋๋ค
9. Time Travel๊ณผ ์ฆ๋ถ ์ฝ๊ธฐ
Time travel์ ์ ๋ค ์ง์ํ๋ค. ํฌ๋งท๋ณ ์กฐํ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
-- Iceberg
SELECT * FROM orders FOR SYSTEM_TIME AS OF '2026-08-01 00:00:00';
SELECT * FROM orders FOR SYSTEM_VERSION AS OF 3821550127947089987;
-- Delta
SELECT * FROM orders TIMESTAMP AS OF '2026-08-01';
SELECT * FROM orders VERSION AS OF 12;
-- Hudi
SELECT * FROM orders TIMESTAMP AS OF '20260801000000';Hudi์ ์ฆ๋ถ ์ฝ๊ธฐ๋ ์ง์ ํ ์ปค๋ฐ ์ดํ ๋ณ๊ฒฝ๋ ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ค.
# Hudi: ํน์ instant ์ดํ ๋ณ๊ฒฝ๋ ๋ ์ฝ๋๋ง
spark.read.format("hudi") \
.option("hoodie.datasource.query.type", "incremental") \
.option("hoodie.datasource.read.begin.instanttime", "20260801120000") \
.load("s3://lake/orders")# Delta: Change Data Feed (ํ
์ด๋ธ ์์ฑ์ผ๋ก ์ผ์ผ ํจ)
spark.read.format("delta") \
.option("readChangeFeed", "true") \
.option("startingVersion", 12) \
.table("orders")-- Iceberg: incremental scan / changelog view
SELECT * FROM analytics.orders.changes
WHERE _change_ordinal >= 3;- Hudi: ingestion ํ์ดํ๋ผ์ธ ์ค๊ณ ์์ฒด๊ฐ ์ฆ๋ถ ์๋น๋ฅผ ์ ์ ๋ก ํ๋ค
- Delta: CDF๋ฅผ ๋ช ์์ ์ผ๋ก ์ผ์ผ ํ๊ณ ์ผ ์์ ์ดํ๋ถํฐ ๊ธฐ๋ก๋๋ค
- Iceberg: ์ค๋ ์ท ๊ฐ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ผ ์ญ์ ์ฒ๋ฆฌ์ ์ ์ฝ์ด ์๋ค
10. ํ ์ด๋ธ ์ ์ง๋ณด์
์์ ํ์ผ์ ๋ณํฉํ๊ณ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ์์ ์ด ํ์ํ๋ค.
| ์์ ๋ชฉ์ | Iceberg | Delta | Hudi |
|---|---|---|---|
| ์์ ํ์ผ ๋ณํฉยท๋ฐ์ดํฐ ์ฌ๋ฐฐ์น | rewrite_data_files | OPTIMIZE | clustering |
| MOR์ base file๊ณผ log file ๋ณํฉ | ํด๋น ์์ | ํด๋น ์์ | compaction |
| ์ค๋๋ ๋ฐ์ดํฐ ์ ๋ฆฌ | expire_snapshots: ์ค๋
์ท ๋ง๋ฃ์ ๋ถํ์ํด์ง ํ์ผ ์ญ์ | VACUUM: ๋ณด๊ด ๊ธฐ๊ฐ์ด ์ง๋ ๋ฏธ์ฌ์ฉ ๋ฐ์ดํฐ ํ์ผ ์ญ์ | Cleaner: ๋ณด๊ด ์ ์ฑ ์ ๋ฐ๋ฅธ ๊ณผ๊ฑฐ ํ์ผ ๋ฒ์ ์ญ์ |
์คํ ์ฃผ๊ธฐ์ ์๋ํ ์ฌ๋ถ๋ ์์งยท๊ด๋ฆฌํ ์๋น์คยท์ค์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
-- Iceberg
CALL catalog.system.rewrite_data_files(table => 'analytics.orders');
CALL catalog.system.expire_snapshots(table => 'analytics.orders', older_than => TIMESTAMP '2026-07-01');
-- Delta
OPTIMIZE orders;
VACUUM orders RETAIN 168 HOURS;์ฃผ์: ๋ฐ์ดํฐ ๋ณด๊ด ๊ธฐ๊ฐ
- ์ค๋๋ ํ์ผ์ ์ญ์ ํ๋ฉด ๊ทธ ํ์ผ์ด ํ์ํ time travel์ด๋ ์ฅ๊ธฐ ์ฟผ๋ฆฌ๊ฐ ์คํจํ ์ ์๋ค
- ๋ณด๊ด ๊ธฐ๊ฐ์ ํ์ํ ๋กค๋ฐฑ ๋ฒ์์ ์ฅ๊ธฐ ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ ๊ณ ๋ คํด ์ ํ๋ค
11. ์ํ๊ณ๊ฐ ์๋ ดํ๋ ์ง์
์๋ก ๋ค๋ฅธ ํฌ๋งท์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ณํํด ๊ฐ์ ๋ฐ์ดํฐ ํ์ผ์ ์ฝ๋ ์ํธ์ด์ฉ ๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ค.
- Delta UniForm: ํ๋์ Parquet ๋ฐ์ดํฐ์
_delta_log์ Iceberg ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์์ฑํ๋ค. ์์ง๋ณ๋ก ๊ณจ๋ผ ์ฝ๋๋ค - Apache XTable(๊ตฌ OneTable): ์ธ ํฌ๋งท์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ํธ ๋ณํํ๋ค. ๋ฐ์ดํฐ ํ์ผ์ ๊ทธ๋๋ก ๋๊ณ ๋ฉํ๋ฐ์ดํฐ๋ง ๋ง๋ค์ด๋ธ๋ค
- Unity Catalog์ Iceberg REST ์๋ํฌ์ธํธ: Delta ํ ์ด๋ธ์ ์ธ๋ถ ์์ง์ด Iceberg REST๋ก ์ฝ๊ฒ ์ด์๋ค
๊ถํ๊ณผ lineage, ๊ฑฐ๋ฒ๋์ค๋ฅผ ๊ด๋ฆฌํ ์นดํ๋ก๊ทธ๋ ํจ๊ป ์ ํํ๋ค.
12. ์ ํ ๊ธฐ์ค
Iceberg๋ฅผ ๊ณ ๋ฅธ๋ค
- ์์ง ํผ์ฉ: ์ฌ๋ฌ ์์ง์ ์์ด ์ฐ๊ฑฐ๋ ์์ผ๋ก ๋ฐ๊ฟ ๊ฐ๋ฅ์ฑ์ด ์๋ค
- ์จ์ดํ์ฐ์ค ์ฐ๋: Snowflake, BigQuery, Trino ๋ฑ ์จ์ดํ์ฐ์ค์ ๋ ์ดํฌ๋ฅผ ํจ๊ป ์ด๋ค
- AWS ์คํ: AWS ๋ค์ดํฐ๋ธ ์คํ์ ์ด๋ค. S3 Tables์ Glue๊ฐ Iceberg๋ฅผ ์ฐ์ ํ๋ค
- ํํฐ์ ๊ท๋ชจ: ํํฐ์ ์ด ์๋ง ๊ฐ ์ด์์ด๊ณ query planning์ด ๋ณ๋ชฉ์ด๋ค
- ๋ฒค๋ ์ข ์ ํํผ: ๋ฒค๋ ์ข ์์ ํผํ๋ ๊ฒ์ด ์กฐ์ง ๋ฐฉ์นจ์ด๋ค
Delta Lake๋ฅผ ๊ณ ๋ฅธ๋ค
- Databricks ์ฌ์ฉ: Databricks๋ฅผ ์ฐ๊ณ ์๋ค
- ๋จ์ผ ์์ง: Spark ๋จ์ผ ์์ง์ด๊ณ ํ ๊ท๋ชจ๊ฐ ํฌ์ง ์๋ค
- ์ด๊ธฐ ์ง์ ๋น์ฉ: ์นดํ๋ก๊ทธ ์ธํ๋ผ ์์ด ๋ฐ๋ก ์์ํ๊ณ ์ถ๋ค
- ๊ถํ ๊ด๋ฆฌ: Unity Catalog๋ก ํ ์ด๋ธยท๋ชจ๋ธยท๋ ธํธ๋ถ ๊ถํ์ ํ ๊ณณ์์ ๋ณด๊ณ ์ถ๋ค
Hudi๋ฅผ ๊ณ ๋ฅธ๋ค
- ๊ณ ๋น๋ CDC: ์ด ๋จ์ ๋๋ ๋ถ ๋จ์ CDC๋ฅผ ๋ ์ดํฌ์ ๋ฐ์ํด์ผ ํ๋ค
- upsert ๋ณ๋ชฉ: ๋ ์ฝ๋ ๋จ์ upsert ์ฒ๋ฆฌ๋์ด ์ด๋ฏธ ๋ณ๋ชฉ์ด๋ค
- Flink ์ค์ฌ ํ์ดํ๋ผ์ธ: Flink ์คํธ๋ฆฌ๋ฐ ingestion์ด ํ์ดํ๋ผ์ธ์ ์ค์ฌ์ด๋ค
- ํ๋ ์ฌ๋ ฅ: ํ๋์ ์๊ฐ์ ์ธ ์ ์๋ ๋ฐ์ดํฐ ์์ง๋์ด๊ฐ ์๋ค