TL;DR
- Parquet๊ณผ ORC๋ ์ด ๋จ์๋ก, Avro๋ ํ ๋จ์๋ก ๋ฐ์ดํธ๋ฅผ ๋ฐฐ์นํ๋ ์ ์ฅ ํฌ๋งท
- ์ด ์ ์ฅ์ด ๋ถ์์์ ๋น ๋ฅธ ์ด์ ๋ ์ ์ฝ๋ ์ปฌ๋ผ์ ๊ฑด๋๋ฐ๊ณ ๊ฐ์ ํ์ ๋ผ๋ฆฌ ๋ชจ์ฌ ์์ถ์ด ์ ๋๋ฉฐ ํต๊ณ๋ก ๋ธ๋ก์ ๊ฑธ๋ฌ๋ด๊ธฐ ๋๋ฌธ
- ์ค์บ์ Parquet, Hive ์คํ์ ORC, ์คํธ๋ฆฌ๋ฐ ์์ง๊ณผ ์คํค๋ง ์งํ๋ Avro
AI-assisted
1. ํ์ผ ํฌ๋งท์ด ์ ํ๋ ๊ฒ
ํ์ผ ํฌ๋งท์ ๊ฐ์ ๋์คํฌ์ ์ด๋ค ์์๋ก ๋์ด๋์์ง, ์ด๋์ ํต๊ณ๋ฅผ ์ ์ด๋์ง, ์ด๋ป๊ฒ ์์ถํ ์ง๋ฅผ ์ ํ๋ค. (ํ์ผ ํฌ๋งท์ ํ ์ด๋ธ ์ ์์ ๊ด์ฌํ์ง ์๋๋ค. ํ ์ด๋ธ ์ ์๋ ํ ์ด๋ธ ํฌ๋งท์ด ๋งก๋๋ค)
ํ
์ด๋ธ ํฌ๋งท ์ด๋ ์์ ์ ์ด๋ค ํ์ผ์ด ํ
์ด๋ธ์ ์ํ๋๊ฐ Iceberg / Delta / Hudi
โ
ํ์ผ ํฌ๋งท ํ ํ์ผ ์์์ ๋ฐ์ดํธ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์นํ๋๊ฐ Parquet / ORC / Avro
โ
๊ฐ์ฒด ์คํ ๋ฆฌ์ง ๋ฐ์ดํธ๋ฅผ ์ด๋์ ๋๋๊ฐ S3 / GCS / HDFS์ ๋ค ๊ท๊ฒฉ์ด ๊ณต๊ฐ๋ผ ์์ด ํน์ ๋ฒค๋ ๋๊ตฌ ์์ด ์ฝ๊ณ ์ธ ์ ์์ง๋ง ์ค๊ณ ๋ชฉํ๋ ๊ฐ๋ฆฐ๋ค.
- Parquet: ๋ถ์ ์ค์บ. ์ด ์ ์ฅ, ํต๊ณ ๊ธฐ๋ฐ ์คํต
- ORC: ๋ถ์ ์ค์บ + Hive ๊ฒฐํฉ. ์ด ์ ์ฅ, ๋ด์ฅ ์ธ๋ฑ์ค
- Avro: ๋ ์ฝ๋ ์ ๋ฌ๊ณผ ์คํค๋ง ์งํ. ํ ์ ์ฅ
Parquet๊ณผ ORC๋ฅผ ๋ฌถ์ด ๋ถ๋ฅผ ๋๋ columnar file format, ์ ์ ํจ๊ป ๊ฐ๋ฆฌํฌ ๋๋ storage format์ด๋ผ๊ณ ์ด๋ค.
์คํค๋ง๋ฅผ ํ์ผ ์์ ๋ฃ์ด์ ์ธ๋ถ ์นดํ๋ก๊ทธ ์์ด ํ์ผ ํ๋๋ง ๊ฑด๋ค๋ ํด์๋๋ค. ์ด๋ฐ ์ฑ์ง์ self-describing์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
| ๋์ | ์คํค๋ง ์ ์ฉ ์์ | ์คํค๋ง ์ ์ฅ ์์น |
|---|---|---|
| RDBMS | ํ ์ด๋ธ ์คํค๋ง๋ฅผ ์ ์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ๊ฒ์ฆ | DB ์นดํ๋ก๊ทธ |
| Parquet, ORC, Avro ํ์ผ | ์คํค๋ง์ ๋ง์ถฐ ์ฐ๊ณ ์ฝ์ ๋ ํ์ผ์ ์คํค๋ง ์ฐธ์กฐ | ํ์ผ ๋ด๋ถ |
| CSV, JSON | ์ฝ๋ ์ชฝ์์ ํ๋ ํ์ ์ ์ง์ ํ๊ฑฐ๋ ์ถ๋ก | ํ์ผ ์์ฒด์ ํ๋ ํ์ ์ ์ ์ํ ์คํค๋ง ์์ |
CSV๋ ์ฝ๋ ์์ ์ ์คํค๋ง๋ฅผ ์ ํ์ง๋ง self-describing์ ์๋๋ค. ํค๋ ์ค์ด ์์ด๋ ํ์ ์ ๋ณด๊ฐ ์์ด ์ฝ๋ ์ชฝ์ด ์ถ์ธกํ๋ค. self-describing์ ๋ค์ ๋์ค๋ Parquet footer์ Avro ํค๋, ๊ทธ๋ฆฌ๊ณ ์คํค๋ง ์งํ์ ์ ์ ๊ฐ ๋๋ค.
self-describing: ๊ณผํ ๋ฐ์ดํฐ์์ ์จ ์ค๊ณ
- 1988๋ HDF, 1989๋ netCDF๊ฐ ์ด ๋ฐฉ์์ ํ๋ฐฉํ๋ค. ์์ฑ ๊ด์ธก์ฒ๋ผ ์์ญ ๋ ๋ณด๊ดํ๋ ๋ฐ์ดํฐ์์ ํ์ผ๊ณผ ์คํค๋ง ๋ฌธ์๊ฐ ๋ถ๋ฆฌ๋๋ฉด ๋์ค์ ํด์ํ ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ํ๋ ค๋ ์ค๊ณ๋ค
- ๋ฐ์ดํฐ ์์ง๋์ด๋ง์๋ 2009๋ Avro๊ฐ ๋ค์ฌ์๊ณ 2013๋ Parquet๊ณผ ORC๊ฐ ์ด ์ ์ฅ์ ๊ฒฐํฉํ๋ค
- Hive๋ ์คํค๋ง๋ฅผ ๋ฉํ์คํ ์ด์ ๋๊ณ HDFS์๋ ๊ตฌ๋ถ์๋ก ๋๋ ํ ์คํธ๋ฅผ ๋๋ค. ์์ง์ด ๋๋ฉด์ ๊ฐ์ ๋ฉํ์คํ ์ด ์ฐ๋์ ๊ตฌํํด์ผ ํ๊ณ ํ์ผ์ ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ก ๋ณต์ฌํ๋ฉด ์คํค๋ง๊ฐ ํจ๊ป ์ด๋ํ์ง ์์๋ค
2. ํ ์ ์ฅ๊ณผ ์ด ์ ์ฅ
์ฃผ๋ฌธ ํ
์ด๋ธ์ id, user, amount, ts ๋ค ์ปฌ๋ผ์ด ์๋ค๊ณ ํ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ผ๋ ๋์คํฌ์ ๋๋ ์์๋ ๋ฌ๋ผ์ง๋ค.
ํ ์ ์ฅ (CSV, JSON, Avro)
[1|kim|1200|10:00][2|lee|300|10:01][3|park|8900|10:02]
โ ๋ ์ฝ๋ ํ๋๊ฐ ๋ถ์ด ์์
์ด ์ ์ฅ (Parquet, ORC)
[1|2|3][kim|lee|park][1200|300|8900][10:00|10:01|10:02]
โ ๊ฐ์ ์ปฌ๋ผ ๊ฐ์ด ๋ถ์ด ์์SELECT sum(amount) FROM orders๋ฅผ ์คํํ๋ฉด ์ฐจ์ด๊ฐ ๋๋ฌ๋๋ค.
- ํ ์ ์ฅ: ๋ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ฝ์ผ๋ฉด์
amount์์น์ ๊ฐ๋ง ๊บผ๋ธ๋ค. ์ ์ฐ๋ ์ปฌ๋ผ๋ ๋์คํฌ์์ ์ฌ๋ผ์จ๋ค - ์ด ์ ์ฅ:
amount๋ธ๋ก๋ง ์ฝ๋๋ค. ์ปฌ๋ผ์ด 100๊ฐ๊ณ ํ๋๋ง ์ฐ๋ฉด I/O๊ฐ 1/100๋ก ์ค์ด๋ ๋ค
์์ถ๋ฅ ๋ ๋ฒ์ด์ง๋ค. ์ด ์ ์ฅ์ ๊ฐ์ ํ์ , ๋น์ทํ ๊ฐ์ด ์ธ์ ํด ์์ด์ ์ฌ์ ์ธ์ฝ๋ฉ์ด๋ ๋ฐ๋ณต ์ ๊ฑฐ์ ํจ๊ณผ๊ฐ ํฌ๋ค. ํ ์ ์ฅ์ ์ ์ ์์ ๋ฌธ์์ด์ด ์ค๊ณ ๊ทธ ์์ ํ์์คํฌํ๊ฐ ์ค๋ฏ๋ก ํจํด์ ์ฐพ๊ธฐ ์ด๋ ต๋ค.
๋ ์ฝ๋ ํ๋๋ฅผ ํต์งธ๋ก ๊บผ๋ด๊ฑฐ๋ ์ ๋ ์ฝ๋ ํ๋๋ฅผ ๋ง๋ถ์ด๋ ์์ ์ ํ ์ ์ฅ์ด ์ ๋ฆฌํ๋ค. ์ด ์ ์ฅ์์ ํ ํ์ ์ฌ๊ตฌ์ฑํ๋ ค๋ฉด ์ปฌ๋ผ ์๋งํผ ์์น๋ฅผ ์ฐพ์ ์กฐ๋ฆฝํด์ผ ํ๋ค.
3. Parquet
์ฐ์์ด ๊ฐ์ฅ ๋์ ํฌ๋งท์ด๋ผ ๊ตฌ์กฐ๋ถํฐ ์์ธํ ๋ณธ๋ค.
3.1 ๋ฌผ๋ฆฌ ๊ตฌ์กฐ
Parquet ํ์ผ์ ๋ค ๊ฒน์ผ๋ก ๋๋๋ค.
PAR1 โ magic bytes
โโโ Row Group 0 (๊ธฐ๋ณธ 128MB)
โ โโโ Column Chunk: id
โ โ โโโ Page 0 (๊ธฐ๋ณธ 1MB)
โ โ โโโ Page 1
โ โ โโโ ...
โ โโโ Column Chunk: user
โ โโโ Column Chunk: amount
โโโ Row Group 1
โโโ ...
โโโ Footer (FileMetaData)
โ โโโ ์คํค๋ง
โ โโโ Row Group๋ณ ยท Column Chunk๋ณ ๋ฉํ๋ฐ์ดํฐ
โ โโโ min / max / null ๊ฐ์ / ์คํ์
/ ์ธ์ฝ๋ฉ
โโโ footer ๊ธธ์ด (4๋ฐ์ดํธ)
โโโ PAR1- Row Group: ํ์ ์ผ์ ํฌ๊ธฐ๋ก ์๋ฅธ ๋จ์. ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์คํต์ ๊ธฐ๋ณธ ๋จ์๋ค
- Column Chunk: ํ Row Group ์์์ ์ปฌ๋ผ ํ๋์ ํด๋นํ๋ ์ฐ์ ๊ตฌ๊ฐ
- Page: ์ค์ ์์ถยท์ธ์ฝ๋ฉ์ด ์ ์ฉ๋๋ ์ต์ ๋จ์
- Footer: ์คํค๋ง์ ๋ชจ๋ ํต๊ณ๊ฐ ํ์ผ ๋์ ๋ชจ์ฌ ์๋ค
์ค์ฒฉ ์ปฌ๋ผ๋ ํ๋ฉด Column Chunk๋ก ํผ์ณ์ง๋ค
- ์ ๋์์์ Column Chunk๋ ๊ฐ์ด ์ผ๋ ฌ๋ก ๋์ด์ ๋ชจ์์ด๋ค. ์คํค๋ง์ ๊ตฌ์กฐ์ฒด๋ ๋ฐฐ์ด์ด ์์ผ๋ฉด ์ด ๋ชจ์์ ๊ทธ๋๋ก ๋ด๊ธฐ์ง ์๋๋ค
- ์ด๋ฒคํธ ๋ก๊ทธ๋ API ์๋ต์ ๊ทธ๋๋ก ์ ์ฌํ๋ฉด ์ด๋ฐ ์ปฌ๋ผ์ด ์๊ธด๋ค
{"id": 1, "user": {"name": "kim", "address": {"city": "Seoul"}}, "tags": ["sale", "mobile"]}
- Parquet์ ์ด ํธ๋ฆฌ๋ฅผ leaf node ๊ธฐ์ค์ผ๋ก ์ชผ๊ฐ ๋ค.
id,user.name,user.address.city,tags๋ท์ด ๊ฐ๊ฐ Column Chunk๊ฐ ๋๋ค.user์user.address๋ ์ค๊ฐ ๋ ธ๋๋ผ ๋ณ๋ Column Chunk๊ฐ ์๋ค- ๊ทธ๋์
SELECT user.address.city๊ฐ ๊ทธ ์ปฌ๋ผ๋ง ์ฝ๋๋ค.user์ ์ฒด๋ฅผ ์ฝ์ด ํ์ฑํ์ง ์๋๋ค- ๊ฐ๋ง ๋์ด๋์ผ๋ฉด ์๋ ๋ชจ์์ ์์ผ๋ฏ๋ก ๊ฐ๋ง๋ค definition level๊ณผ repetition level ๋ ์ซ์๋ฅผ ๋ถ์ฌ ์ด๋ ๊น์ด์์ null์ด์๋์ง, ์ด๋์ ์ ๋ฐฐ์ด์ด ์์๋๋์ง๋ฅผ ๊ธฐ๋กํ๋ค. Google Dremel ๋ ผ๋ฌธ์์ ์จ ๋ฐฉ์์ด๋ค
์ฝ๋ ์์๋ ๋ค์์ ์์ด๋ค. ๋ง์ง๋ง 4๋ฐ์ดํธ๋ก footer ๊ธธ์ด๋ฅผ ์์๋ด๊ณ footer๋ฅผ ์ฝ์ด ์คํค๋ง์ ํต๊ณ๋ฅผ ํ์ ํ ๋ค ํ์ํ Column Chunk์ ์คํ์ ์ผ๋ก ๊ฑด๋๋ด๋ค. ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์์๋ Range GET ๋์ธ ๋ฒ์ด๋ฉด ๋๋ค.
Row Group ํฌ๊ธฐ๋ ์ 128MB์ธ๊ฐ
- HDFS ๋ธ๋ก ํ๋์ Row Group ํ๋๊ฐ ๋ค์ด๊ฐ๋ฉด ๋คํธ์ํฌ๋ฅผ ํ์ง ์๊ณ ๋ก์ปฌ์์ ์ฝํ๋ค. ์ฌ๊ธฐ์ ๊ตณ์ด์ง ๊ธฐ๋ณธ๊ฐ์ด๋ค
- ํฌ๊ฒ ์ก์ผ๋ฉด ์์ถ๋ฅ ๊ณผ ์ค์บ ์ฒ๋ฆฌ๋์ด ์ค๋ฅด์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฐ๊ณ ์คํต ๋จ์๊ฐ ๊ฑฐ์น ์ด์ง๋ค
- ์๊ฒ ์ก์ผ๋ฉด ์ธ๋ฐํ๊ฒ ๊ฑธ๋ฌ๋ด์ง๋ง ๋ฉํ๋ฐ์ดํฐ ๋น์ค์ด ์ปค์ง๋ค. ํ์ผ์ด ์๋ง ๊ฐ๋ฉด footer ์ฝ๊ธฐ๋ง์ผ๋ก ๋ถ๋ด์ด ๋๋ค
์์ ํ์ผ ๋ฌธ์
- Parquet์ ํ์ผ๋น ์ค๋ฒํค๋๊ฐ ์๋ค. footer, ์ฌ์ , ์์ถ ๋ธ๋ก์ด ๋งค๋ฒ ๋ถ๋๋ค
- ์ MB์ง๋ฆฌ ํ์ผ์ด ์์ญ๋ง ๊ฐ๋ฉด ์์ถ๋ฅ ๋ ํต๊ณ ํจ๊ณผ๋ ๋์ค์ง ์๋๋ค
- ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์ ์ฌํ ๋ ํนํ ์ ์๊ธด๋ค. compaction์ ์ฃผ๊ธฐ๋ก ๋๋ ค์ผ ํ๋ค
3.2 ์ฝ๊ธฐ ์ ์ ๊ฑธ๋ฌ๋ด๊ธฐ
์ด ์ ์ฅ์ ์ด๋ ์ค ํฐ ๋ชซ์ โ์ฝ์ง ์๋ ๊ฒโ์์ ๋์ค๋๋ฐ ์ค์ด๋ ๋ฐฉํฅ์ ๋์ด๋ค. ์ฝ์ ์ปฌ๋ผ์ ์ขํ๋ ์ชฝ๊ณผ ์ฝ์ ํ์ ์ขํ๋ ์ชฝ์ด๋ค.
SELECT user FROM orders WHERE amount > 5000- projection pushdown: ์ฟผ๋ฆฌ์ ์ฐ์ธ
user,amountColumn Chunk๋ง ์ฝ๋๋ค.SELECT *๋ฅผ ์ฐ๋ฉด ๋ชจ๋ ์ปฌ๋ผ์ด ํ์ํ๋ค - predicate pushdown: ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ตฌ๊ฐ์ ์ฝ๊ธฐ ์ ์ ์ ์ธํ๋ค
- Row Group์ min/max:
amount์ max๊ฐ 3000์ด๋ฉดamount > 5000์ ๋ง์กฑํ๋ ํ์ด ์์ด ํด๋น Row Group์ ๊ฑด๋๋ด๋ค. footer์ ํต๊ณ๋ฅผ ์ฌ์ฉํ๋ค - Bloom filter:
WHERE user = 'kim'๊ฐ์ ๋ฑํธ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ค. Column Chunk๋ง๋ค ์ ์ฅ๋ ํํฐ๋ก Row Group์ ์ฐพ๋ ๊ฐ์ด ์๋์ง ํ์ ํ๋ค - page index: Page ๋จ์ min/max์ ์คํ์ ์ ์ฐธ์กฐํด ๋จ์ Row Group ์์์ ์ฝ์ ๊ตฌ๊ฐ์ ๊ณ ๋ฅธ๋ค
- Row Group์ min/max:
์ด๋ ์ ๋ ฌ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋ค.
- ์ ๋ ฌ:
amount๋ก ์ ๋ ฌํด์ ์ฐ๋ฉด Row Group๋ง๋ค ๊ฐ ๋ฒ์๊ฐ ์ข์์ ธ min/max๋ก ๋๋ถ๋ถ ๊ฑธ๋ฌ์ง๋ค. - ๋ฌด์์: ๊ฐ์ ๋ฌด์์ ์์๋ก ์ฐ๋ฉด ๊ฐ Row Group์ min/max ๋ฒ์๊ฐ ๋์ด์ง ์ ์๋ค.
- ์กฐ๊ฑด ๊ฒน์นจ: ์กฐํ ์กฐ๊ฑด์ ๊ฐ ๋ฒ์๊ฐ ๊ทธ min/max์ ์์ฃผ ๊ฒน์น๋ฉด ํต๊ณ๋ง์ผ๋ก ์ ์ธํ ์ ์๋ Row Group์ด ์ค์ด๋ ๋ค.
๊ฐ์ ๋ฐ์ดํฐ, ๊ฐ์ ํฌ๋งท์ธ๋ฐ ์ค์บ๋์ด ์์ญ ๋ฐฐ ๋ฒ์ด์ง๋ค.
Bloom filter: "์๋ค"๋ง ํ์คํ๊ฒ ๋ตํ๋ ๋นํธ ๋ฐฐ์ด
- ๊ฐ์ ํด์ํด ๋นํธ ๋ช ๊ฐ๋ฅผ ์ผ๋๋ค. ์ฐพ์ ๋ ๊ทธ ๋นํธ๊ฐ ํ๋๋ผ๋ 0์ด๋ฉด ์ด Row Group์ ๊ฐ์ด ์๋ค๊ณ ํ์ ํ๋ค
- ๋นํธ๊ฐ ์ ๋ถ 1์ด๋ฉด โ์์ ์๋ ์๋คโ์ ๊ทธ์น๋ค. ์ค์ ๋ก๋ ์์ ์ ์์ด ์ฝ์ด๋ด์ผ ์๋ค. ๋ถํ์ํ ์ฝ๊ธฐ ํ ๋ฒ์ผ๋ก ๋๋๊ณ ๊ฒฐ๊ณผ๊ฐ ํ๋ฆฌ์ง๋ ์๋๋ค
- ๊ฐ๋ ๊ฐ์๋ ์์น๋ ๋ด์ง ์๋๋ค. Parquet์ 32๋ฐ์ดํธ ๋ธ๋ก ์์์ ๋นํธ๋ฅผ ๊ฑด๋๋ฆฌ๋ Split Block Bloom Filter๋ฅผ ์จ์ ์กฐํ ํ ๋ฒ์ด CPU ์บ์ ํ ์ค์ ๋ค์ด๊ฐ๋ค
- ํด์๊ฐ์ด๋ผ ์์ ์ ๋ณด๊ฐ ์๋ค.
amount > 5000๊ฐ์ ๋ฒ์ ์กฐ๊ฑด์๋ ์ธ ์ ์๋ค- ํฌ๊ธฐ๋ ์์ ๊ณ ์ ๊ฐ ๊ฐ์์ ์คํ๋ฅ ๋ก ์ ํด์ง๋ค. ์ ๋ฐํ๊ฒ ์ก์์๋ก ํํฐ๊ฐ ์ปค์ง๊ณ ์ฝ์ ๋ฐ์ดํธ๋ ๋์ด ์ด๋์ด ์์๋๋ค
- ๊ธฐ๋ณธ์ ๊บผ์ ธ ์๋ค. ์ปฌ๋ผ์ ์ง์ ํด ์ผ ๋ค
(df.write .option("parquet.bloom.filter.enabled#user_id", "true") .option("parquet.bloom.filter.expected.ndv#user_id", "1000000") .parquet("s3://bucket/orders/"))
- ๋ชจ๋ ์ปฌ๋ผ์ ์ผ๋ฉด ํ์ผ๋ง ์ปค์ง๋ค. cardinality๊ฐ ๋๊ณ ๋ฑํธ๋ก ์์ฃผ ์กฐํํ๋ ์ปฌ๋ผ์๋ง ์ ์ฉํ๋ค.
user_id,order_id, ์ด๋ฉ์ผ ๊ฐ์ ์ปฌ๋ผ์ด๋ค
pushdown: ์ฐ์ฐ์ ๋ฐ์ดํฐ ์์ค ์ชฝ์ผ๋ก ๋๊ธฐ๋ ๊ฒ
- ๋ฐ์ดํฐ๋ ์คํ ๋ฆฌ์ง โ reader โ ์์ง ์์ผ๋ก ์ฌ๋ผ์จ๋ค. ์์ง์ด ํ ์ผ์ ์๋ ๊ณ์ธต์ผ๋ก ๋๊ธฐ๋ฉด pushdown์ด๋ผ ๋ถ๋ฅธ๋ค
- reader๊ฐ ์ฒ๋ฆฌ: footer๋ฅผ ๋ณด๊ณ ํ์ ์๋ ์ปฌ๋ผ๊ณผ ๊ตฌ๊ฐ์ ์ฝ์ง ์๋๋ค. ์คํ ๋ฆฌ์ง์๋ ํ์ํ ๋ฐ์ดํธ ๋ฒ์๋ง ์์ฒญํ๋ฏ๋ก ์ ์ก๋๋ ํจ๊ป ์ค๋ค
- ์์ง์ด ์ฒ๋ฆฌ: reader๊ฐ ์ ๋ถ ๋์ฝ๋ฉํด ์ฌ๋ ค๋ณด๋ด๊ณ ์์ง์ด ํ์ ์๋ ์ปฌ๋ผ๊ณผ ํ์ ๋ฒ๋ฆฐ๋ค. ํต๊ณ๊ฐ ์๋ CSVยทJSON์ ์ด ๋ฐฉ์์ ํด๋นํ๋ค
- ๋์์ด ์ปฌ๋ผ์ด๋ฉด projection, ์กฐ๊ฑด์ด๋ฉด predicate๋ค. ์์ง์ ๋ฐ๋ผ ์ง๊ณ๋
LIMIT์ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ ์๋ค
3.3 ์ธ์ฝ๋ฉ๊ณผ ์์ถ
Parquet์ ๋ ๋จ๊ณ๋ก ํฌ๊ธฐ๋ฅผ ์ค์ธ๋ค. ๊ฐ ์์ฒด๋ฅผ ๋ค์ ํํํ๋ ์ธ์ฝ๋ฉ์ด ๋จผ์ ๊ณ ๊ทธ ๊ฒฐ๊ณผ ๋ฐ์ดํธ๋ฅผ ์์ถํ๋ ๊ฒ ๋ค์์ด๋ค.
| ์ธ์ฝ๋ฉ | ๋ฐฉ์ | ์ ๋ง๋ ๋ฐ์ดํฐ |
|---|---|---|
PLAIN | ๊ฐ์ ๊ทธ๋๋ก | ์์ถ ํจ๊ณผ๊ฐ ๋ฎ์ ๋ฌด์์ ๊ฐ |
RLE_DICTIONARY (์ฌ์ ์ธ์ฝ๋ฉ) | ๊ฐ์ ์ฌ์ ์ ๋ฃ๊ณ ์ ์ ID๋ก ์นํ. ID ๋ฐฐ์ด์ RLE๋ก ์ ์ฅ | ๊ณ ์ ๊ฐ์ด ์ ์ ์ปฌ๋ผ. ๊ตญ๊ฐ, ์ํ ์ฝ๋ |
DELTA_BINARY_PACKED (๋ธํ ์ธ์ฝ๋ฉ) | ์ด์ ๊ฐ๊ณผ์ ์ฐจ์ด๋ง ์ ์ฅ | ์ฆ๊ฐํ๋ ์ ์. ํ์์คํฌํ, ์ํ์ค ID |
DELTA_BYTE_ARRAY (์ ๋์ฌ ์ธ์ฝ๋ฉ) | ์ ๋ฌธ์์ด๊ณผ ๊ณตํต ์ ๋์ฌ ์๋ต | ์ ๋ ฌ๋ URL, ๊ฒฝ๋ก |
BYTE_STREAM_SPLIT | ๋ถ๋์์์ ๋ฐ์ดํธ๋ฅผ ์๋ฆฌ๋ณ๋ก ๋ถ๋ฆฌ | ์ผ์ ์ธก์ ๊ฐ |
์ฌ์ ์ธ์ฝ๋ฉ์ด ๊ธฐ๋ณธ์ด๊ณ ๊ณ ์ ๊ฐ์ด ๋ง์ ์ฌ์ ์ด ์ปค์ง๋ฉด ์๋์ผ๋ก PLAIN์ผ๋ก ๋์ด๊ฐ๋ค.
์ฌ์ ์ธ์ฝ๋ฉ๊ณผ RLE: ๊ฒน์ณ ์ฐ๋ ๋ ๊ธฐ๋ฒ
- ์ฌ์ ์ธ์ฝ๋ฉ: ์ปฌ๋ผ์ ๊ณ ์ ๊ฐ์ ๋ชจ์ ๋ฒํธ๋ฅผ ๋งค๊ธฐ๊ณ ๋ฐ์ดํฐ ์๋ฆฌ์๋ ๋ฒํธ๋ง ๋จ๊ธด๋ค.
["KR","US","KR","KR","JP"]โ ์ฌ์ 0=KR, 1=US, 2=JP+ ๋ฐ์ดํฐ[0,1,0,0,2]- ๋ฒํธ๋ ๊ณ ์ ๊ฐ ๊ฐ์์ ๋ง๋ ์ต์ ๋นํธ ํญ์ผ๋ก ์ฑ์ด๋ค. ๊ณ ์ ๊ฐ 300๊ฐ๋ฉด 9๋นํธ
- ์ฌ์ ์ด ์๊ณ๋ฅผ ๋์ผ๋ฉด ๊ทธ Column Chunk๋ PLAIN์ผ๋ก ์ ํํ๋ค. UUID๋ ์ด๋ฉ์ผ์ฒ๋ผ ํ๋ง๋ค ๊ฐ์ด ๋ค๋ฅด๋ฉด ์ฌ์ ์ด ์๋ณธ๋งํผ ์ปค์ง๋ค
- ์ผ๋ถ ์์ง์ ๋์ฝ๋ฉ ์์ด ์ฌ์ ์ํ๋ก ํํฐ๋งํ๋ค.
WHERE country = 'KR'์ ์ ์ ๋น๊ต๋ก ์ฒ๋ฆฌํ๋ค- RLE(run-length encoding): ๊ฐ์ ๊ฐ์ ๋ฐ๋ณต์
0์ด 500๋ฒํํ๋ก ์ค์ธ๋ค.
- ์ฌ์ ์ธ์ฝ๋ฉ์ ๊ณ ์ ๊ฐ์ด ์ ์ ๋, RLE๋ ๊ฐ์ ๊ฐ์ด ์ฐ์์ผ๋ก ๋์ผ ๋ ํจ๊ณผ์ ์ด๋ค. ์ ๋ ฌํ๋ฉด ๊ฐ์ ๊ฐ์ ์ฐ์ ๊ตฌ๊ฐ์ด ๊ธธ์ด์ ธ RLE ํจ์จ์ด ์ค๋ฅธ๋ค. ์ฌ์ ํฌ๊ธฐ๋ ๊ณ ์ ๊ฐ ๊ฐ์๋ก ์ ํด์ ธ ์ ๋ ฌํด๋ ๊ทธ๋๋ก๋ค
- ์ด๋ฆ์ ๋ ์กฐ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ธต์ ๊ฐ๋ฆฌํจ๋ค. ์ฌ์ ์ ๋ณ๋ Dictionary Page์
PLAIN์ผ๋ก ์ ์ฅ๋๊ณRLE_DICTIONARY๋ ๋ฐ์ดํฐ ํ์ด์ง์ ๋ถ๋ ์ด๋ฆ์ด๋ค
DICTIONARY: ์ด ํ์ด์ง์ ๊ฐ์ ์ค์ ๊ฐ์ด ์๋๋ผ ์ฌ์ ์ธ๋ฑ์ค๋คRLE: ๊ทธ ์ธ๋ฑ์ค ๋ฐฐ์ด์ RLE๋ก ๋ด์๋ค. ๋ฐ๋ณต์ด ๊ธธ๋ฉด ํ์๋ก ์ ๊ณ ์งง์ผ๋ฉด ๋นํธ ํจํน์ผ๋ก ๋ด๋ ํ์ด๋ธ๋ฆฌ๋๋ค
์์ถ ์ฝ๋ฑ์ ์์ถ๊ณผ ํด์ ๋ฅผ ๋งก๋ ์๊ณ ๋ฆฌ์ฆ ํ ์์ด๋ค. ์์ถ๋ฅ ์ ๋์ผ์๋ก CPU ๋น์ฉ์ด ๋์ด๋๋ค.
| ์ฝ๋ฑ | ์์ถ๋ฅ | CPU ์ฌ์ฉ | ์ฐ์ |
|---|---|---|---|
| Snappy | ๋ฎ์ | ์ ์ | ์ค๋ ์ฐ์ธ ๊ธฐ๋ณธ๊ฐ |
| Zstd | ๋์ | ์ค๊ฐ | ์ต๊ทผ ๊ธฐ๋ณธ ์ ํ. ๋ ๋ฒจ๋ก ์กฐ์ |
| Gzip | ๋์ | ๋ง์ | ์์ฃผ ์ฝ์ง ์๋ ๋ณด๊ด ๋ฐ์ดํฐ |
| LZ4 | ๋ฎ์ | ๊ฐ์ฅ ์ ์ | ์์ถ ํด์ ๊ฐ ๋ถ๋ด๋ ๋ |
์ด๋ ์ชฝ์ด ๋ณ๋ชฉ์ธ์ง๋ก ์ ํ๋ค. ์ค์บ job์ CPU ์ฌ์ฉ๋ฅ ์ ๋๊ณ ๋์คํฌ ์ฌ์ฉ๋ฅ ์ ๋ฎ๋ค๋ฉด ์์ถ๋ฅ ๋ณด๋ค ์์ถ ํด์ ๋น์ฉ์ด ๋ฎ์ ์ฝ๋ฑ์ ์ ํํ๋ ํธ์ด ์ฒ๋ฆฌ๋์ ๋์ด๊ธฐ ์ข๋ค. ๋ฐ๋๋ก ๋คํธ์ํฌ bandwidth๊ฐ ๋ณ๋ชฉ์ด๋ฉด CPU๋ฅผ ๋ ์จ์๋ผ๋ ๋ฐ์ดํธ๋ฅผ ์ค์ธ๋ค.
# ์ ๋ ฌ์ ์ฐ๊ธฐ ์์ ์ ์ ํด์ง๋ค. ์ ์ฅํ ๋ค์๋ ๋ค์ ์ฐ์ง ์๋ ํ ์์๊ฐ ๋ฐ๋์ง ์๋๋ค
(df.sortWithinPartitions("country", "user_id")
.write.parquet("s3://bucket/orders/", compression="zstd"))-- Spark ์ธ์
๊ธฐ๋ณธ๊ฐ
SET spark.sql.parquet.compression.codec = zstd;์ ๋ ฌ ํค๊ฐ ์ธ์ฝ๋ฉยท์์ถ ์ ํ๋ณด๋ค ์ํฅ์ด ํฌ๋ค
- ํํฐ์ ์์ฃผ ์ฐ๋ ์ปฌ๋ผ์ผ๋ก ์ ๋ ฌํ๋ฉด ํต๊ณ ์คํต๊ณผ ์์ถ๋ฅ ์ด ํจ๊ป ์ข์์ง๋ค
- ์ ๋ ฌ ํค๊ฐ ์ฌ๋ฟ์ด๋ฉด cardinality๊ฐ ๋ฎ์ ์ปฌ๋ผ์ ์์๋ฆฌ์ ๋๋ค.
ORDER BY country, user_id์ฒ๋ผ ์ฐ๋ฉด ๊ฐ์ ๋ฒํธ๊ฐ ์ฐ์์ผ๋ก ๋ชฐ๋ ค RLE ๋ฐ๋ณต ๊ตฌ๊ฐ์ด ๊ธธ์ด์ง๋ค- ์ ๋ ฌ ํจ๊ณผ๋ ์์ชฝ ํค์ ์ง์ค๋๋ค.
user_id๋ง์ผ๋ก ๊ฑฐ๋ ํํฐ๋ ์ด๋์ด ์ ๋ค. ์ฌ๋ฌ ์ปฌ๋ผ์ผ๋ก ํํฐ๊ฐ ๋ค์ด์ค๋ฉด ํ ์ด๋ธ ํฌ๋งท ์ธต์ Z-Ordering์ด๋ Liquid Clustering์ ์ด๋ค- ์ ์ญ ์ ๋ ฌ์ shuffle ๋น์ฉ์ด ํฌ๋ค. ๋ ์ง๋ก ํํฐ์ ์ ๋๋ ์ฐ๋ ๋ฐฐ์น๋ผ๋ฉด
sortWithinPartitions๋ก ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค- ์ฝ๋ฑ์ ๋ฐ๊ฟ ์ป๋ ์ฐจ์ด๋ ์ด๋ณด๋ค ์๋ค
4. ORC (Optimized Row Columnar)
ORC๋ Hive์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํ๋ ค๊ณ 2013๋ ์ ๋์๋ค. ์ ์ฒด ๊ตฌ์กฐ๋ Parquet๊ณผ ๊ฐ๊ณ ๊ตฌ์ฑ ์ด๋ฆ๊ณผ ์ธ๋ถ ๋ฐฐ์น๊ฐ ๋ค๋ฅด๋ค.
โโโ Stripe 0 (๊ธฐ๋ณธ 64MB) โ Parquet์ Row Group์ ํด๋น
โ โโโ Index Data โ 1๋ง ํ๋ง๋ค min/max, ์์น, bloom filter
โ โโโ Row Data โ ์ปฌ๋ผ๋ณ ์คํธ๋ฆผ
โ โโโ Stripe Footer
โโโ Stripe 1
โโโ File Footer โ ์คํค๋ง, Stripe ๋ชฉ๋ก, ์ปฌ๋ผ ํต๊ณ
โโโ Postscript โ ์์ถ ๋ฐฉ์, File Footer ๊ธธ์ด- ์ธ๋ฑ์ค ์์น: ORC๋ Stripe ์์ ์ธ๋ฑ์ค๋ฅผ ๋ฃ๋๋ค. Parquet์ ํต๊ณ๋ฅผ ํ์ผ ๋ footer์ ๋ชจ์๋ค
- ์ธ๋ฑ์ค ๊ฐ๊ฒฉ: ๊ธฐ๋ณธ 1๋ง ํ๋ง๋ค ํต๊ณ๋ฅผ ๋จ๊ธด๋ค. Parquet์ page index์ ๋น์ทํ ์ญํ ์ ๋ ์ผ์ฐ ๊ฐ์ท๋ค
- ํ์
์์คํ
: Hive ํ์
์ ๋ง์ถฐ ์ค๊ณ๋ผ
DECIMAL,TIMESTAMP์ฒ๋ฆฌ๊ฐ Hive์ ์ด๊ธ๋์ง ์๋๋ค - ACID: Hive์ ํธ๋์ญ์ ํ ์ด๋ธ์ ORC๋ฅผ ์ ์ ๋ก ๋ง๋ค์ด์ก๋ค. delta ํ์ผ๊ณผ base ํ์ผ์ ๋ณํฉํด ์ฝ๋ ๊ตฌ์กฐ๊ฐ ํฌ๋งท ์์ ๋ค์ด ์๋ค
์ ํ ๊ธฐ์ค์ ์คํ ์คํ์ด๋ค.
- HiveยทTez: ORC๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๊ณ ํ๋ ์๋ฃ๋ ๊ทธ์ชฝ์ ๋ง๋ค
- SparkยทTrinoยทSnowflake์ Polars: Parquet ์ชฝ ์ต์ ํ๊ฐ ์์ ์๋ค
- ํ ์ด๋ธ ํฌ๋งท: ์ธ ์ข ๋ฅ(Iceberg, Delta Lake, Hudi)๊ฐ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก Parquet์ ์ด๋ค
- ์ ๊ท ํ๋ก์ ํธ: ๋๊ฐ Parquet์ผ๋ก ์์ํ๋ค
์ฃผ์: ์ฑ๋ฅ ๋น๊ต๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค์งํ๋ค
- ์์ถ๋ฅ ์ ๋ฐ์ดํฐ ์ฑ๊ฒฉ์ด ๊ฒฐ์ ํ๋ค. ๊ฐ์ ๋ฐ์ดํฐ์ ๊ฐ์ ์ฝ๋ฑ์ ์ฐ๋ฉด ๋ ํฌ๋งท ์ฐจ์ด๋ ํฌ์ง ์๋ค
- ๋ฒค์น๋งํฌ์์ ๋ฒ์ด์ง๋ ์ฐจ์ด๋ ๋๊ฐ ํฌ๋งท์ด ์๋๋ผ reader ๊ตฌํ๊ณผ ํต๊ณ ํ์ฉ๋์์ ์จ๋ค
- ๋ง์ด๊ทธ๋ ์ด์ ํ๋จ์ ๋ฒค์น๋งํฌ ์์น๋ณด๋ค ์์ง ์ง์ ๋ฒ์๋ก ํ๋ ํธ์ด ์์ ํ๋ค
5. Avro
Avro๋ ๋ ์ฝ๋๋ฅผ ํ ๋จ์๋ก ์์ผ๋ฉฐ ์์ ๋๊ณผ ๋ชฉ์ ์ด ๋ฌ๋ผ ๊ฐ์ ์ถ์ ๋๊ณ ์ฐ์ด์ ๊ฐ๋ฆฌ๊ธฐ ์ด๋ ต๋ค.
โโโ Header
โ โโโ magic "Obj\x01"
โ โโโ ์คํค๋ง (JSON) โ ํ์ผ ์์ ๋ค์ด ์์
โ โโโ sync marker (16๋ฐ์ดํธ ๋์)
โโโ Block 0: [ํ ๊ฐ์][๋ฐ์ดํธ ์][์ง๋ ฌํ๋ ๋ ์ฝ๋๋ค][sync marker]
โโโ Block 1: ...
โโโ ...- ์คํค๋ง ๋ด์ฅ: ํ์ผ ํค๋์ ์คํค๋ง๊ฐ JSON์ผ๋ก ๋ค์ด ์๋ค. ๋ณ๋ ์ฝ๋ ์์ฑ์ด๋ ์คํค๋ง ๋ ์ง์คํธ๋ฆฌ ์์ด ์ฝ์ ์ ์๋ค
- ์คํค๋ง ์งํ: ์ธ ๋์ ์คํค๋ง์ ์ฝ์ ๋์ ์คํค๋ง๊ฐ ๋ฌ๋ผ๋ ๊ท์น์ ๋ฐ๋ผ ํด์ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ด ์๋ ํ๋ ์ถ๊ฐ, ํ๋ ์ญ์ , ์ด๋ฆ ๋ณ๊ฒฝ(alias), ํ์ ์น๊ฒฉ์ด ๊ท๊ฒฉ์ ์ ์๋ผ ์๋ค
- ๋ถํ ๊ฐ๋ฅ: ๋ธ๋ก๋ง๋ค sync marker๊ฐ ์์ด ํ์ผ ์ค๊ฐ๋ถํฐ ์ฝ์ด๋ ๊ฒฝ๊ณ๋ฅผ ์ฐพ๋๋ค. ๋์ฉ๋ ํ์ผ์ ์ฌ๋ฌ ํ์คํฌ๋ก ๋๋ ์ ์๋ค
์ฐ์ด๋ ์๋ฆฌ๋ ๋ค๋ฅด๋ค.
- Kafka ๋ฉ์์ง: producer์ consumer๊ฐ Avro ์คํค๋ง๋ฅผ ์ฐธ์กฐํด ๋ฉ์์ง๋ฅผ ์ง๋ ฌํยท์ญ์ง๋ ฌํํ๋ค. Confluent Schema Registry๋ ์ ์คํค๋ง ๋ฒ์ ์ ๋ฑ๋กํ ๋ ์ค์ ๋ ํธํ์ฑ ๊ท์น์ ์ ์ฉํ๋ค
- landing zone: ์๋ณธ์ ๊ทธ๋๋ก ๋ฐ์๋๋ ๊ณ์ธต. ์คํค๋ง๊ฐ ์์ฃผ ๋ฐ๋๋ ์์ค์ ๋ง๋ค
- ํ ์ด๋ธ ํฌ๋งท ๋ด๋ถ: Iceberg manifest๊ฐ Avro๋ก ์ ์ฅ๋๋ค. ์คํค๋ง ์งํ๊ฐ ํ์ํ๊ณ ์ด ๋จ์ ์ค์บ์ ํ์ ์๋ ๋ฉํ๋ฐ์ดํฐ์ ๋ง๋ ์ ํ์ด๋ค
์ปฌ๋ผ ํ๋๋ง ํ์ํด๋ ๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์ฝ๊ณ ์ญ์ง๋ ฌํํด์ผ ํ๋ฏ๋ก ๋ถ์ ์ค์บ์๋ ๋ง์ง ์๋๋ค.
์ง๋ ฌํ ํฌ๋งท ์ถ์์ ๋ณธ Avro
- Avro๋ Protobuf, Thrift์ ๊ฐ์ ์ง๋ ฌํ ํฌ๋งท ๊ฐ๋๋ค. ์ฐจ์ด๋ ์คํค๋ง๋ฅผ ํ์ผ์ ๋ฃ๋๋ ์ฝ๋๋ก ์์ฑํ๋๋๋ค
- Protobuf๋
.proto์์ ํด๋์ค๋ฅผ ์์ฑํด ์ฐ๊ณ Avro๋ ๋ฐํ์์ ์คํค๋ง๋ฅผ ์ฝ์ด ์ฒ๋ฆฌํ๋ค
6. ํ๋์ ๋น๊ต
| ํญ๋ชฉ | Parquet | ORC | Avro |
|---|---|---|---|
| ์ ์ฅ ๋ฐฉํฅ | ์ด | ์ด | ํ |
| ์ถ์ | Twitter + Cloudera, 2013 | Hortonworks, 2013 | Hadoop, 2009 |
| ๋ธ๋ก ๋จ์ | Row Group 128MB | Stripe 64MB | Block |
| ํต๊ณ ์์น | ํ์ผ ๋ footer | Stripe ๋ด๋ถ + File Footer | ์์ |
| ์ธ๋ฐํ ์คํต | page index | 1๋ง ํ row index | ๋ถ๊ฐ |
| Bloom filter | Column Chunk ๋จ์ | 1๋ง ํ ๋จ์ | ์์ |
| ์ค์ฒฉ ๊ตฌ์กฐ | definition/repetition level | ์ค์ฒฉ ํ์ ์ง์ | ์คํค๋ง๋ก ํํ |
| ์คํค๋ง ์งํ | ์ปฌ๋ผ ์ถ๊ฐยท์ญ์ . rename์ ๋ถ๊ฐ | ์ปฌ๋ผ ์ถ๊ฐยท์ญ์ . rename์ ๋ถ๊ฐ | ์ถ๊ฐยท์ญ์ ยทrenameยทํ์ ์น๊ฒฉ |
| ํ ํ ์ฐ๊ธฐ | ๋น์ | ๋น์ | ์ |
| ์ฃผ ์ฌ์ฉ์ฒ | ๋ถ์ ์ค์บ ์ ๋ฐ | Hive ์คํ | ๋ฉ์์ง, landing zone |
7. ์ ํ ๊ธฐ์ค
| ์ํฉ | ์ ํ | ์ด์ |
|---|---|---|
| ๋ ์ดํฌํ์ฐ์ค ํ ์ด๋ธ ๋ฐ์ดํฐ | Parquet | ์์ง ์ง์์ด ๊ฐ์ฅ ๋๊ณ ํ ์ด๋ธ ํฌ๋งท ๊ธฐ๋ณธ๊ฐ |
| HiveยทTez ๊ธฐ์กด ์์ฐ | ORC | ํ์ ํธํ๊ณผ ACID ํ ์ด๋ธ ์ ์ |
| Kafka ๋ฉ์์ง | Avro | Schema Registry ์ฐ๋, ์คํค๋ง ์งํ |
| ์๋ณธ ๋ณด์กด์ฉ landing zone | Avro | ์คํค๋ง๊ฐ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ํธํ์ฑ ๊ท์น ์ ๊ณต |
| ์ปฌ๋ผ ์๋ฐฑ ๊ฐ, ์ผ๋ถ๋ง ์กฐํ | Parquet | projection pushdown ํจ๊ณผ๊ฐ ํผ |
๋ ์ฝ๋ ์กฐํ: ํ์ผ ํฌ๋งท๊ณผ ์ ์ฅ ์์คํ ์ ์ ํ
- ํ์ผ ํฌ๋งท: ํ ํ์ ๋ณต์ํ ๋ ์ฝ์ ๋ฐ์ดํฐ ์๊ณผ ์ญ์ง๋ ฌํ ๋น์ฉ์ ๋น๊ต
- ์ ์ฅ ์์คํ : ํน์ ํค์ ๋ ์ฝ๋๋ฅผ ์์ฃผ ์กฐํํ๋ ๊ฒฝ์ฐ ํค ๊ธฐ๋ฐ ์กฐํ๋ฅผ ์ง์ํ๋ KV ์คํ ์ด ๋ฑ์ ๋ณ๋๋ก ๊ฒํ
์ค๋ฌด์์๋ ๊ณ์ธต๋ณ๋ก ๋๋ ์ฐ๋ ๊ตฌ์ฑ์ด ํํ๋ค.
์์ค โ Kafka(Avro) โ landing zone(Avro) โ ๋ณํ โ ๋ถ์ ํ
์ด๋ธ(Parquet)์์ง ๋จ๊ณ๋ ์คํค๋ง ๋ณํ๋ฅผ ๊ฒฌ๋๋ ์ชฝ์ด, ๋ถ์ ๋จ๊ณ๋ ์ค์บ์ด ๋น ๋ฅธ ์ชฝ์ด ์ ๋ฆฌํ๋ค.
8. ํ ์ด๋ธ ํฌ๋งท๊ณผ ๊ฒน์น๋ ๋ถ๋ถ
๋ ๊ณ์ธต ๋ชจ๋ min/max ํต๊ณ๋ฅผ ์ด๋ค.
- Parquet footer์ ํต๊ณ: ํ์ผ ํ๋๋ฅผ ์ด์ด์ผ ๋ณผ ์ ์๋ค. ํ์ผ์ ์ฝ๊ธฐ ์์ํ ๋ค์์ ์คํต์ด๋ค
- Iceberg manifest์ ํต๊ณ: ๋ฐ์ดํฐ ํ์ผ์ ์ด๊ธฐ ์ ์ ๋ณผ ์ ์๋ค. ์ด๋ค ํ์ผ์ ์ด์ง ๊ฒฐ์ ํ๋ ๋จ๊ณ์ ์คํต์ด๋ค
์ธ ๋จ๊ณ๊ฐ ์์๋๋ก ์๋ํ๋ค.
- manifest ํต๊ณ: ์ฝ์ ํ์ผ ๋ชฉ๋ก ํ์ (ํ ์ด๋ธ ํฌ๋งท)
- footer ํต๊ณ: ์ฝ์ Row Group ํ์ (ํ์ผ ํฌ๋งท)
- page index: ์ฝ์ Page ํ์ (ํ์ผ ํฌ๋งท)
ํ์ผ ๋ด๋ถ ๋ฐฐ์น๋ ํ์ผ ํฌ๋งท์ด ๋งก๊ณ ํ์ผ ๋ชฉ๋ก ๊ด๋ฆฌ๋ ํ ์ด๋ธ ํฌ๋งท์ด ๋งก๋๋ค.