TL;DR

  • ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ๋Š” ํŒŒ์ผ์„ ๊ณ ์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์Šคํ‚ค๋งˆ๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ํ•œ ํ…Œ์ด๋ธ”์— ๊ณต์กด
  • ํŒ๋‹จ ๊ธฐ์ค€์€ ํ˜ธํ™˜์„ฑ ๋ฐฉํ–ฅ. backward๋Š” ์ปจ์Šˆ๋จธ ๋จผ์ €, forward๋Š” ํ”„๋กœ๋“€์„œ ๋จผ์ € ๋ฐฐํฌ
  • ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ๊ณผ ํƒ€์ž… ๋ณ€๊ฒฝ์ด ์œ„ํ—˜ ๊ตฌ๊ฐ„. ํŒŒ์ผ ํฌ๋งท๋งŒ์œผ๋กœ๋Š” ๋ชป ํ’€๊ณ  ํ…Œ์ด๋ธ” ํฌ๋งท์˜ field-id๊ฐ€ ํ•„์š”

AI-assisted


1. ์Šคํ‚ค๋งˆ๋Š” ๊ณ„์† ๋ฐ”๋€๋‹ค

ํ…Œ์ด๋ธ”์„ ํ•œ ๋ฒˆ ์„ค๊ณ„ํ•˜๊ณ  ๋๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๊ณ  ๋ฐ”๋€Œ๋Š” ์ด์œ ๋„ ๋Œ€์ฒด๋กœ ์…‹์œผ๋กœ ์ขํ˜€์ง„๋‹ค.

  • ์‹ ๊ทœ ์ง€ํ‘œ ์š”๊ตฌ: ๋งˆ์ผ€ํŒ…์—์„œ ์œ ์ž… ์ฑ„๋„๋ณ„ ๋ถ„์„์„ ์š”์ฒญํ•˜๋ฉด utm_source ์ปฌ๋Ÿผ์ด ๋ถ™๋Š”๋‹ค
  • ์†Œ์Šค ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ: ์ƒ๋ฅ˜ ์„œ๋น„์Šค๊ฐ€ user_name์„ first_name๊ณผ last_name์œผ๋กœ ์ชผ๊ฐœ๋ฉด ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ์˜จ๋‹ค
  • CDC๋กœ ๋“ค์–ด์˜ค๋Š” DDL: ์šด์˜ DB์—์„œ ALTER TABLE์ด ์‹คํ–‰๋˜๋ฉด ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ํ˜๋Ÿฌ์˜จ๋‹ค

์šด์˜ DB๋ผ๋ฉด ALTER TABLE๋กœ ๋๋‚  ์ผ์ธ๋ฐ ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ์—์„œ๋Š” ์•„๋ž˜ ์ด์œ ๋กœ ์‚ฌ์ •์ด ๋‹ค๋ฅด๋‹ค.

  • ์Šคํ‚ค๋งˆ๊ฐ€ ํฉ์–ด์ ธ ์žˆ๋‹ค: DB๋Š” ์นดํƒˆ๋กœ๊ทธ์— ์Šคํ‚ค๋งˆ ์ •์˜๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๊ณ  ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋„ DB ํ”„๋กœ์„ธ์Šค๋งŒ ๋งŒ์ง„๋‹ค. ๋ ˆ์ดํฌ๋Š” ํŒŒ์ผ๋งˆ๋‹ค ์ž๊ธฐ ์Šคํ‚ค๋งˆ๋ฅผ ํ’ˆ๊ณ  ์žˆ์–ด ๊ณ ์น  ๋Œ€์ƒ์ด ์ˆ˜์‹ญ๋งŒ ๊ฐœ๋‹ค
  • ์›์ž์„ฑ์ด ์—†๋‹ค: DB์˜ DDL์€ ๋ฝ์„ ๊ฑธ๊ณ  ์ปค๋ฐ‹ํ•˜๋ฏ€๋กœ ์ค‘๊ฐ„ ์ƒํƒœ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. ํŒŒ์ผ 10๋งŒ ๊ฐœ๋ฅผ ๋‹ค์‹œ ์“ฐ๋Š” ๋„์ค‘์— ๋ˆ„๊ฐ€ ์กฐํšŒํ•˜๋ฉด ์ ˆ๋ฐ˜์€ ์˜› ์Šคํ‚ค๋งˆ ์ ˆ๋ฐ˜์€ ์ƒˆ ์Šคํ‚ค๋งˆ์ธ ์ƒํƒœ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ณด์ธ๋‹ค
  • ์“ฐ๋Š” ์ฃผ์ฒด๊ฐ€ ์—ฌ๋Ÿฟ์ด๋‹ค: DB๋Š” ๋‹จ์ผ ์ง„์ž…์ ์ด๋‹ค. ๋ ˆ์ดํฌ์˜ ๊ฐ™์€ ๊ฒฝ๋กœ์—๋Š” Spark ๋ฐฐ์น˜, Flink ์ŠคํŠธ๋ฆฌ๋ฐ, ๋‹ค๋ฅธ ํŒ€ job์ด ๊ฐ์ž ์“ด๋‹ค. โ€œ์ง€๊ธˆ๋ถ€ํ„ฐ ์ƒˆ ์Šคํ‚ค๋งˆ๋กœ ์“ฐ์„ธ์š”โ€๋ฅผ ๊ฐ•์ œํ•  ์ฃผ์ฒด๊ฐ€ ์—†๋‹ค

2. ํŒŒ์ผ์„ ๊ณ ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

๋ฐฐ์น˜๊ฐ€ ๋Œ ๋•Œ๋งˆ๋‹ค ํ…Œ์ด๋ธ”์— ํŒŒ์ผ์ด ์Œ“์ด๊ณ  ๊ฐ ํŒŒ์ผ์—๋Š” ๊ทธ๋•Œ์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ•ํ˜€ ์žˆ๋‹ค.

s3://lake/orders/
  dt=2024-03-01/part-0.parquet    id, user_name, amount
  dt=2024-03-02/part-0.parquet    id, user_name, amount
  ...
  dt=2026-08-01/part-0.parquet    id, user_name, amount, country   โ† ์ปฌ๋Ÿผ ์ถ”๊ฐ€
  dt=2026-08-02/part-0.parquet    id, user_name, amount, country

์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  2024๋…„ ํŒŒ์ผ์„ ๋‹ค์‹œ ์“ฐ์ง€๋Š” ์•Š๋Š”๋‹ค.

  • ์žฌ์ž‘์„ฑ ๋น„์šฉ: ํŽ˜ํƒ€๋ฐ”์ดํŠธ๋ฅผ ๋‹ค์‹œ ์“ฐ๋ ค๋ฉด ์‹œ๊ฐ„๊ณผ ์ปดํ“จํŠธ๊ฐ€ ๊ทธ๋งŒํผ ๋“ ๋‹ค
  • ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์ œ์•ฝ: S3 ๊ฐ์ฒด๋Š” ๋ถ€๋ถ„ ์ˆ˜์ •์ด ์•ˆ ๋œ๋‹ค. ํ†ต์งธ๋กœ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์ฝ๋Š” ์ชฝ์ด ์—ฌ๋Ÿฟ: ๋Œ€์‹œ๋ณด๋“œ, ML ํŒŒ์ดํ”„๋ผ์ธ, ๋ฆฌ๋ฒ„์Šค ETL์ด ๊ฐ์ž ๋‹ค๋ฅธ ์‹œ์ ์— ๋ฐฐํฌ๋œ๋‹ค. ๋ชจ๋‘๋ฅผ ํ•œ ๋ฒˆ์— ๋งž์ถœ ์ˆ˜ ์—†๋‹ค

๊ทธ๋ž˜์„œ ํ•œ ํ…Œ์ด๋ธ” ์•ˆ์— ์Šคํ‚ค๋งˆ๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ๊ณต์กดํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ „์ œ๋กœ ์„ค๊ณ„ํ•œ๋‹ค. ์ฝ๋Š” ์‹œ์ ์— ์ฐจ์ด๋ฅผ ํก์ˆ˜ํ•˜๋Š” ๊ทœ์น™์ด ์Šคํ‚ค๋งˆ ์ง„ํ™”๋‹ค.

writer schema์™€ reader schema

  • writer schema: ๊ทธ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ์“ด ์Šคํ‚ค๋งˆ. ํŒŒ์ผ์— ๋ฐ•ํ˜€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค
  • reader schema: ์ง€๊ธˆ ์ฝ๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์Šคํ‚ค๋งˆ
  • ๋‘˜์ด ์–ด๊ธ‹๋‚œ ์ž๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฉ”์šธ์ง€๊ฐ€ ์Šคํ‚ค๋งˆ ์ง„ํ™”์˜ ์‹ค์ฒด์ด๊ณ  ํŒŒ์ผ์ด ๋ถˆ๋ณ€์ด๋ฏ€๋กœ ๋งž์ถ”๋Š” ์ผ์€ ํ•ญ์ƒ ์ฝ๋Š” ์ชฝ์—์„œ ์ผ์–ด๋‚œ๋‹ค

3. ํ˜ธํ™˜์„ฑ ๋ฐฉํ–ฅ

์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ์Šน์ธํ• ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ, ๋‘ ๋ฐฉํ–ฅ์ด ์žˆ๋‹ค.

backward   ์ƒˆ ์Šคํ‚ค๋งˆ๋กœ ์˜› ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค
           v2 ์ฝ”๋“œ โ†’ v1 ๋ฐ์ดํ„ฐ โœ“
 
forward    ์˜› ์Šคํ‚ค๋งˆ๋กœ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค
           v1 ์ฝ”๋“œ โ†’ v2 ๋ฐ์ดํ„ฐ โœ“
 
full       ์–‘๋ฐฉํ–ฅ ๋ชจ๋‘

๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ์ชฝ๊ณผ ์ฝ๋Š” ์ชฝ์„ ๊ฐ™์€ ์ˆœ๊ฐ„์— ๋ฐฐํฌํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์–ด๋А ์ชฝ์„ ๋จผ์ € ์˜ฌ๋ ค๋„ ์•ˆ ๊นจ์ง€๋Š”์ง€๋ฅผ ํ˜ธํ™˜์„ฑ ๋ฐฉํ–ฅ์ด ์ •ํ•œ๋‹ค.

  • backward๋งŒ ๋ณด์žฅ: ์ฝ๋Š” ์ชฝ(์ปจ์Šˆ๋จธ, downstream job)์„ ๋จผ์ € ๋ฐฐํฌํ•œ๋‹ค. ์ƒˆ ์ฝ”๋“œ๊ฐ€ ์˜› ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ์‚ฌ์ด ๋“ค์–ด์˜ค๋Š” ์˜› ๋ฐ์ดํ„ฐ๋„ ์ฒ˜๋ฆฌ๋œ๋‹ค
  • forward๋งŒ ๋ณด์žฅ: ์“ฐ๋Š” ์ชฝ(ํ”„๋กœ๋“€์„œ, ingestion job)์„ ๋จผ์ € ๋ฐฐํฌํ•œ๋‹ค. ์˜› ์ฝ”๋“œ๊ฐ€ ์ƒˆ ๋ฐ์ดํ„ฐ์˜ ๋ชจ๋ฅด๋Š” ํ•„๋“œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ฝ๋Š”๋‹ค
  • full: ์ˆœ์„œ๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋Œ€์‹  ํ—ˆ์šฉ๋˜๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์ข์•„์ง„๋‹ค

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ backward๋ฅผ ๋‘๋Š” ๊ณณ์ด ๋งŽ๋‹ค. ๋ถ„์„ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ๋Š” ์ผ์ด ์žฆ์•„์„œ ์ƒˆ ์ฝ”๋“œ๊ฐ€ ์˜› ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋ฉด ๊ณง๋ฐ”๋กœ ์žฅ์• ๊ฐ€ ๋œ๋‹ค.

๋ฐฉํ–ฅ ์ด๋ฆ„์ด ํ—ท๊ฐˆ๋ฆด ๋•Œ

  • ์ด๋ฆ„์€ ์ƒˆ ์Šคํ‚ค๋งˆ ๊ธฐ์ค€์ด๋‹ค. backward๋Š” โ€œ๋’ค์ชฝ(์˜› ๋ฐ์ดํ„ฐ)์„ ํ–ฅํ•ด ํ˜ธํ™˜๋œ๋‹คโ€๋Š” ๋œป์ด๋‹ค
  • ํŒ๋‹จํ•  ๋•Œ๋Š” ์ด๋ฆ„ ๋Œ€์‹  โ€œ๋ˆ„๊ฐ€ ๋จผ์ € ๋ฐฐํฌ๋˜์–ด์•ผ ์•ˆ ๊นจ์ง€๋‚˜โ€๋ฅผ ๋ฌผ์œผ๋ฉด ๋น ๋ฅด๋‹ค
  • backward๋ฉด ์ปจ์Šˆ๋จธ ๋จผ์ €, forward๋ฉด ํ”„๋กœ๋“€์„œ ๋จผ์ €๋‹ค

4. ๋ณ€๊ฒฝ ์œ ํ˜•๋ณ„ ์•ˆ์ „๋„

๋ณ€๊ฒฝbackwardforward์˜› ํŒŒ์ผ ์ฝ๊ธฐ ๊ฒฐ๊ณผ
๊ธฐ๋ณธ๊ฐ’ ์žˆ๋Š” ์ปฌ๋Ÿผ ์ถ”๊ฐ€์•ˆ์ „์•ˆ์ „์˜› ํŒŒ์ผ์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ง
๊ธฐ๋ณธ๊ฐ’ ์—†๋Š” ์ปฌ๋Ÿผ ์ถ”๊ฐ€๊นจ์ง์•ˆ์ „์˜› ํŒŒ์ผ์—์„œ ๊ฐ’์„ ๋งŒ๋“ค ๋ฐฉ๋ฒ•์ด ์—†์Œ
์ปฌ๋Ÿผ ์‚ญ์ œ์•ˆ์ „๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋˜ ํ•„๋“œ๋ฉด ์•ˆ์ „์ƒˆ ์ฝ”๋“œ๊ฐ€ ์•ˆ ์ฝ์œผ๋ฏ€๋กœ ๋ฌดํ•ด
์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝaliases๋‚˜ field-id๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ์ „๊นจ์ง๋Œ€์‘ ์ˆ˜๋‹จ์ด ์—†์œผ๋ฉด ์กฐ์šฉํžˆ null
ํƒ€์ž… ํ™•์žฅ (intโ†’long)์•ˆ์ „๊นจ์ง๋„“์€ ํƒ€์ž…์ด ์ข์€ ๊ฐ’์„ ๋‹ด์Œ
ํƒ€์ž… ์ถ•์†Œ (longโ†’int)๊นจ์ง์•ˆ์ „์ƒˆ ์ฝ”๋“œ๊ฐ€ ์˜› ๊ฐ’์„ ๋‹ด์ง€ ๋ชปํ•ด ์˜ˆ์™ธ
ํƒ€์ž… ๋ณ€๊ฒฝ (intโ†’string)๊นจ์ง๊นจ์งreader๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง
์ปฌ๋Ÿผ ์ˆœ์„œ ๋ณ€๊ฒฝ์•ˆ์ „์•ˆ์ „์ด๋ฆ„์œผ๋กœ ๋งค์นญํ•˜๋ฏ€๋กœ ๋ฌด๊ด€

๋‘ ๊ตฌ๊ฐ„์ด ์‹ค๋ฌด์—์„œ ์‚ฌ๊ณ ๋ฅผ ๋‚ธ๋‹ค.

์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ์€ ๋Œ€์‘ ์ˆ˜๋‹จ์ด ์—†์œผ๋ฉด ์—๋Ÿฌ ์—†์ด ํ‹€๋ฆฐ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ๋‹ค.

-- user_name์„ customer_name์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์ƒˆ ํŒŒ์ผ๋ถ€ํ„ฐ ๊ทธ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ ๋’ค
SELECT customer_name, count(*) FROM orders GROUP BY 1;
-- 2024~2025 ๊ตฌ๊ฐ„์ด ์ „๋ถ€ null ํ•œ ์ค„๋กœ ๋ญ‰์นœ๋‹ค

reader๋Š” โ€œ์š”์ฒญํ•œ ์ปฌ๋Ÿผ์ด ์ด ํŒŒ์ผ์— ์—†๋‹คโ€๊ณ  ํŒ๋‹จํ•ด null์„ ๋Œ๋ ค์ค€๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ง‘๊ณ„ ์ˆซ์ž๋งŒ ์กฐ์šฉํžˆ ์–ด๊ธ‹๋‚œ๋‹ค.

ํƒ€์ž… ๋ณ€๊ฒฝ์€ ๊ทธ ์ž๋ฆฌ์—์„œ ์‹คํŒจํ•œ๋‹ค. amount๋ฅผ INT๋กœ ์Œ“๋‹ค๊ฐ€ STRING์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์˜› ํŒŒ์ผ์˜ 4๋ฐ”์ดํŠธ ์ •์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ•ด์„ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

Parquet column cannot be converted in file s3://lake/orders/dt=2024-03-01/part-0.parquet
Column: [amount], Expected: string, Found: INT32

์ฃผ์˜: ์—๋Ÿฌ๋ณด๋‹ค ์กฐ์šฉํ•œ null์ด ์œ„ํ—˜ํ•˜๋‹ค

  • ํƒ€์ž… ๋ณ€๊ฒฝ์€ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉˆ์ถ”๋ฏ€๋กœ ๊ณง๋ฐ”๋กœ ๋ฐœ๊ฒฌ๋œ๋‹ค
  • ์ด๋ฆ„ ๋ณ€๊ฒฝ์€ ์•„๋ฌด ์‹ ํ˜ธ๊ฐ€ ์—†๋‹ค. ๋Œ€์‹œ๋ณด๋“œ ์ˆซ์ž๊ฐ€ ์ค„์–ด๋“  ๊ฒƒ์„ ๋ˆ„๊ตฐ๊ฐ€ ์•Œ์•„์ฑŒ ๋•Œ๊นŒ์ง€ ๋ฐฉ์น˜๋œ๋‹ค
  • ์Šคํ‚ค๋งˆ๋ฅผ ๋ฐ”๊พผ ๋’ค์—๋Š” ๊ณผ๊ฑฐ ๊ตฌ๊ฐ„์„ ์ƒ˜ํ”Œ๋งํ•ด null ๋น„์œจ์„ ํ™•์ธํ•œ๋‹ค

5. ํŒŒ์ผ ํฌ๋งท ๊ด€์ 

ํŒŒ์ผ ํฌ๋งท๋งˆ๋‹ค ๋Œ€์‘ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅด๋‹ค.

Avro๋Š” ๊ทœ๊ฒฉ์— ๋งค์นญ ๊ทœ์น™์„ ๋„ฃ์—ˆ๋‹ค. ํŒŒ์ผ ํ—ค๋”์— writer schema๊ฐ€ ๋“ค์–ด ์žˆ๊ณ  ์ฝ๋Š” ์ชฝ์ด reader schema๋ฅผ ๋”ฐ๋กœ ๋„˜๊ธฐ๋ฉด ๋‘˜์„ ๋Œ€์กฐํ•ด ํ•ด์„ํ•œ๋‹ค.

{
  "name": "country",
  "type": "string",
  "default": "UNKNOWN"
}
{
  "name": "customer_name",
  "type": "string",
  "aliases": ["user_name"]
}
  • default: ์˜› ํŒŒ์ผ์— ์—†๋Š” ํ•„๋“œ๋ฅผ ์ด ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค. backward ํ˜ธํ™˜์˜ ํ•ต์‹ฌ ์žฅ์น˜๋‹ค
  • aliases: ์˜› ์ด๋ฆ„์„ ์ ์–ด๋‘๋ฉด reader๊ฐ€ ๊ทธ ์ด๋ฆ„์œผ๋กœ๋„ ํ•„๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค
  • ํƒ€์ž… ์Šน๊ฒฉ: int โ†’ long โ†’ float โ†’ double, string โ†” bytes๊ฐ€ ๊ทœ๊ฒฉ์— ์ •์˜๋ผ ์žˆ๋‹ค

Parquet๊ณผ ORC๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ๊ธฐ๋ก๋งŒ ํ•œ๋‹ค. ํŒŒ์ผ๋งˆ๋‹ค ์ปฌ๋Ÿผ ๊ตฌ์„ฑ์ด ๋‹ค๋ฅผ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ฉ์น ์ง€๋Š” ๊ทœ๊ฒฉ ๋ฐ–์ด๊ณ  ์—”์ง„์ด ์ •ํ•œ๋‹ค.

# ํŒŒ์ผ๋ณ„ ์Šคํ‚ค๋งˆ๋ฅผ ํ•ฉ์ณ์„œ ์ฝ๊ธฐ. ํŒŒ์ผ ์ˆ˜๋งŒํผ footer๋ฅผ ์ฝ์–ด์•ผ ํ•ด์„œ ๋А๋ฆฌ๋‹ค
spark.read.option("mergeSchema", "true").parquet("s3://lake/orders/")

์ปฌ๋Ÿผ ์ถ”๊ฐ€์™€ ์‚ญ์ œ๋Š” ์ด ๋ฐฉ์‹์œผ๋กœ ํก์ˆ˜๋˜์ง€๋งŒ ์ด๋ฆ„ ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฆ„์ด ๊ณง ์‹๋ณ„์ž๋ผ์„œ ๋ฐ”๊พธ๋Š” ์ˆœ๊ฐ„ ๋‹ค๋ฅธ ์ปฌ๋Ÿผ์ด ๋œ๋‹ค.


6. ํ…Œ์ด๋ธ” ํฌ๋งท ๊ด€์ 

ํ…Œ์ด๋ธ” ํฌ๋งท์€ ์ด๋ฆ„ ๋Œ€์‹  ID๋กœ ์ปฌ๋Ÿผ์„ ์‹๋ณ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.

ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ     1: order_id   2: user_name   3: amount
                                 โ†“ rename
                  1: order_id   2: customer_name   3: amount
 
2024๋…„ Parquet    field-id 2์— ์ €์žฅ๋œ ๊ฐ’ โ†’ ์ƒˆ ์ด๋ฆ„์œผ๋กœ ๊ทธ๋Œ€๋กœ ์ฝํž˜
2026๋…„ Parquet    field-id 2์— ์ €์žฅ๋œ ๊ฐ’ โ†’ ๋™์ผ

Iceberg๋Š” ์ปฌ๋Ÿผ๋งˆ๋‹ค field-id๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  Parquet ํŒŒ์ผ ์•ˆ์—๋„ ๊ทธ ID๋ฅผ ์‹ฌ๋Š”๋‹ค. ์ด๋ฆ„์ด ๋ฐ”๋€Œ์–ด๋„ ID๋กœ ์ฐพ์œผ๋ฏ€๋กœ ๊ธฐ์กด ํŒŒ์ผ์„ ๋‹ค์‹œ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

ALTER TABLE analytics.orders RENAME COLUMN user_name TO customer_name;
-- ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •๋œ๋‹ค. ๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ๋‹ค

Delta๋Š” Column Mapping์„ ์ผœ๋ฉด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ALTER TABLE orders SET TBLPROPERTIES (
  'delta.columnMapping.mode' = 'name',
  'delta.minReaderVersion' = '2',
  'delta.minWriterVersion' = '5'
);
๋™์ž‘IcebergDeltaHudi
์ปฌ๋Ÿผ ์ถ”๊ฐ€์ง€์›์ง€์›์ง€์›
์ปฌ๋Ÿผ ์‚ญ์ œ์ง€์›Column Mapping ํ•„์š”schema.on.read ํ™œ์„ฑํ™” ํ•„์š”
์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ง€์›Column Mapping ํ•„์š”schema.on.read ํ™œ์„ฑํ™” ํ•„์š”
์ปฌ๋Ÿผ ์ˆœ์„œ ๋ณ€๊ฒฝ์ง€์›REPLACE COLUMNS๋กœ ๊ฐ€๋Šฅ์ง€์›
ํƒ€์ž… ์Šน๊ฒฉ์ง€์›์ง€์›์ง€์›
ํŒŒํ‹ฐ์…˜ ์ŠคํŽ™ ๋ณ€๊ฒฝ์ง€์›, ์žฌ์ž‘์„ฑ ๋ถˆํ•„์š”Liquid Clustering์œผ๋กœ ๋Œ€์‘์ œํ•œ์ 

ํŒŒํ‹ฐ์…˜ ์ŠคํŽ™ ์ง„ํ™”: Iceberg์—๋งŒ ์žˆ๋Š” ๊ฒƒ

  • ํŒŒํ‹ฐ์…˜ ๊ธฐ์ค€์„ ์ผ๋ณ„์—์„œ ์‹œ๊ฐ„๋ณ„๋กœ ๋ฐ”๊ฟ”๋„ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค
  • ์˜› ํŒŒ์ผ์€ ์˜› ์ŠคํŽ™, ์ƒˆ ํŒŒ์ผ์€ ์ƒˆ ์ŠคํŽ™์œผ๋กœ ๊ธฐ๋ก๋˜๊ณ  query planning์ด ๋‘˜์„ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•œ๋‹ค
  • Hive ๋ฐฉ์‹์—์„œ๋Š” ํŒŒํ‹ฐ์…˜ ์ปฌ๋Ÿผ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ผ ๋ฐ”๊พธ๋ ค๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์จ์•ผ ํ–ˆ๋‹ค

7. ์ŠคํŠธ๋ฆฌ๋ฐ ๊ด€์ 

Kafka์—๋Š” ํ…Œ์ด๋ธ” ํฌ๋งท์ด ์—†๊ณ  ํ”„๋กœ๋“€์„œ์™€ ์ปจ์Šˆ๋จธ๊ฐ€ ๊ฐ์ž ๋ฐฐํฌ๋˜๋ฏ€๋กœ ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜๊ฐ€ ์ƒ์‹œ ๋ฐœ์ƒํ•œ๋‹ค.

ํ”„๋กœ๋“€์„œ v2 ๋ฐฐํฌ  โ†’  country ํ•„๋“œ๊ฐ€ ๋ถ™์€ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰
์ปจ์Šˆ๋จธ A (v1)     โ†’  country๋ฅผ ๋ชจ๋ฆ„. ๋ฌด์‹œํ•˜๊ณ  ์ฝ์–ด์•ผ ํ•จ
์ปจ์Šˆ๋จธ B (v2)     โ†’  country๋ฅผ ์‚ฌ์šฉ

Schema Registry๊ฐ€ ์Šคํ‚ค๋งˆ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐฐํฌ ์ „์— ํ˜ธํ™˜์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ •์ฑ…์„ ์ฃผ์ œ๋ณ„๋กœ ์„ค์ •ํ•œ๋‹ค.

# ํŠน์ • ํ† ํ”ฝ์˜ ํ˜ธํ™˜์„ฑ ์ •์ฑ… ์„ค์ •
curl -X PUT http://schema-registry:8081/config/orders-value \
  -H "Content-Type: application/json" \
  -d '{"compatibility": "BACKWARD"}'
์ •์ฑ…๊ฒ€์‚ฌ ๋ฒ”์œ„
BACKWARD์ง์ „ ๋ฒ„์ „๊ณผ backward ํ˜ธํ™˜. ๊ธฐ๋ณธ๊ฐ’
BACKWARD_TRANSITIVE๋ชจ๋“  ์ด์ „ ๋ฒ„์ „๊ณผ backward ํ˜ธํ™˜
FORWARD์ง์ „ ๋ฒ„์ „๊ณผ forward ํ˜ธํ™˜
FORWARD_TRANSITIVE๋ชจ๋“  ์ด์ „ ๋ฒ„์ „๊ณผ forward ํ˜ธํ™˜
FULL์ง์ „ ๋ฒ„์ „๊ณผ ์–‘๋ฐฉํ–ฅ ํ˜ธํ™˜
FULL_TRANSITIVE๋ชจ๋“  ์ด์ „ ๋ฒ„์ „๊ณผ ์–‘๋ฐฉํ–ฅ ํ˜ธํ™˜
NONE๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Œ

_TRANSITIVE๊ฐ€ ๋ถ™์€ ์ •์ฑ…์€ ์ „์ฒด ์ด๋ ฅ์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๋ฉด ์ด์ชฝ์„ ์“ด๋‹ค. ์ง์ „ ๋ฒ„์ „๋งŒ ๋ณด๋Š” ์ •์ฑ…์œผ๋กœ๋Š” v1 ๋ฐ์ดํ„ฐ๋ฅผ v3 ์ฝ”๋“œ๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค.

์ •์ฑ…์„ NONE์œผ๋กœ ๋‘๋ฉด

  • ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‚ฌ๋ผ์ ธ ์–ด๋–ค ๋ณ€๊ฒฝ์ด๋“  ๋“ฑ๋ก๋œ๋‹ค
  • ์ปจ์Šˆ๋จธ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜๋กœ ๋ฉˆ์ถ˜๋‹ค. ๊ทธ๋•Œ๋Š” ์ด๋ฏธ ๋ฌธ์ œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ† ํ”ฝ์— ์Œ“์ธ ๋’ค๋‹ค
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์“ฐ๊ณ  ์šด์˜์—์„œ๋Š” ์ตœ์†Œ BACKWARD๋ฅผ ๊ฑด๋‹ค

8. ์•ˆํ‹ฐํŒจํ„ด

  • ์ปฌ๋Ÿผ ์ด๋ฆ„ ์žฌํ™œ์šฉ: ์ง€์šด ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์„ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ๋‹ค์‹œ ์“ฐ๋ฉด ์˜› ํŒŒ์ผ์˜ ๊ฐ’์ด ์ƒˆ ์˜๋ฏธ๋กœ ์ฝํžŒ๋‹ค. ์ด๋ฆ„์€ ์€ํ‡ด์‹œํ‚ค๊ณ  ์ƒˆ ์ด๋ฆ„์„ ๋งŒ๋“ ๋‹ค
  • ํƒ€์ž…์œผ๋กœ ์˜๋ฏธ ๋ฐ”๊พธ๊ธฐ: status๋ฅผ INT ์ฝ”๋“œ์—์„œ STRING ๋ ˆ์ด๋ธ”๋กœ ๋ฐ”๊พธ๋Š” ์‹. ์ƒˆ ์ปฌ๋Ÿผ์„ ๋งŒ๋“ค๊ณ  ์˜› ์ปฌ๋Ÿผ์€ ์œ ์ง€ํ•˜๋‹ค ์‚ฌ์šฉ์ฒ˜๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์ง€์šด๋‹ค
  • mergeSchema ์ƒ์‹œ ํ™œ์„ฑํ™”: ํŽธํ•˜์ง€๋งŒ ์˜คํƒ€๋กœ ์ƒ๊ธด ์ปฌ๋Ÿผ๊นŒ์ง€ ์Šคํ‚ค๋งˆ์— ๋“ค์–ด์˜จ๋‹ค. user_id์™€ userid๊ฐ€ ๋”ฐ๋กœ ์Œ“์ธ๋‹ค
  • ๊ฒ€์ฆ ์—†๋Š” ๋ณ€๊ฒฝ: ์Šคํ‚ค๋งˆ๋ฅผ ๋ฐ”๊พผ ๋’ค ๊ณผ๊ฑฐ ๊ตฌ๊ฐ„์˜ null ๋น„์œจ์„ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ์กฐ์šฉํ•œ ์†์‹ค์„ ๋†“์นœ๋‹ค
  • ํ…Œ์ด๋ธ” ํฌ๋งท ์—†์ด rename: ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ Parquet ํ…Œ์ด๋ธ”์—์„œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์˜ฎ๊ธธ ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฉด ์ „์ฒด ์žฌ์ž‘์„ฑ์ด ์œ ์ผํ•œ ์ˆ˜๋‹จ์ด๋‹ค

9. ์ธต๋ณ„ ๋Œ€์‘ ๋ฒ”์œ„

๋ณ€๊ฒฝ ์œ ํ˜•์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ์ธต์ด ๋‹ค๋ฅด๋‹ค.

ํ•˜๋ ค๋Š” ๊ฒƒํ•„์š”ํ•œ ๊ฒƒ
์ปฌ๋Ÿผ ์ถ”๊ฐ€ยท์‚ญ์ œํŒŒ์ผ ํฌ๋งท๋งŒ์œผ๋กœ ๊ฐ€๋Šฅ. ์—”์ง„ ์„ค์ •์œผ๋กœ ํก์ˆ˜
์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝํ…Œ์ด๋ธ” ํฌ๋งท์˜ field-id. Avro๋ผ๋ฉด aliases
ํƒ€์ž… ํ™•์žฅํŒŒ์ผ ํฌ๋งท ๊ทœ๊ฒฉ์ด ์ •์˜ํ•œ ์Šน๊ฒฉ ๋ฒ”์œ„ ์•ˆ์—์„œ
ํŒŒํ‹ฐ์…˜ ๊ธฐ์ค€ ๋ณ€๊ฒฝIceberg์˜ ํŒŒํ‹ฐ์…˜ ์ŠคํŽ™ ์ง„ํ™”
ํ”„๋กœ๋“€์„œยท์ปจ์Šˆ๋จธ ์‹œ์ฐจ ํก์ˆ˜Schema Registry ํ˜ธํ™˜์„ฑ ์ •์ฑ…

๋ ˆ์ดํฌ๋ฅผ ์ƒˆ๋กœ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ํ…Œ์ด๋ธ” ํฌ๋งท์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋„์ž…ํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.