์•Œ์•„๋ณผ ๋‚ด์šฉ

  • Airflow๋ž€?
  • Workflow Orchestration?
  • ๊ธฐ์กด cron ๋ฐฉ์‹์˜ ํ•œ๊ณ„?
  • UI, ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋“ฑ Airflow์˜ ํ•ต์‹ฌ ์žฅ์ 

1. Data Engineering์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์™œ ์ค‘์š”ํ•œ๊ฐ€?

ํ˜„๋Œ€ ๊ธฐ์—…์ด๋‚˜ ๊ธฐ๊ด€์€ ๋งค์ผ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ์กฐ์งํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹จ์ˆœํžˆ ์ €์žฅ๋งŒ ๋˜๋Š” โ€˜์ฃฝ์€ ๋ฐ์ดํ„ฐโ€™์— ๋ถˆ๊ณผํ•˜๋‹ค. ย 

์˜ˆ๋ฅผ ๋“ค์–ด ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ฅผ ๋– ์˜ฌ๋ ค ๋ณด์ž. ย 

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

์ด ํ๋ฆ„์€ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ๋๋‚˜์ง€ ์•Š๊ณ , โ€œ๋กœ๊ทธ ์ˆ˜์ง‘ โ†’ ์ •์ œ โ†’ ์ง‘๊ณ„ โ†’ ์ถ”์ฒœ ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ โ†’ ์‹œ๊ฐํ™”โ€ ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ย 

์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๊ธฐ์—… ๋‚ด์™ธ๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๋Ÿ‰์˜ ์›์ฒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ฐ€๊ณตยท์ •์ œํ•˜์—ฌ ๋ถ„์„ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ  ๋ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•œ๋‹ค
์˜ค๋Š˜๋‚  ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ต์‹ฌ ์ž์‚ฐ์œผ๋กœ ํ™œ์šฉ๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง์˜ ์ค‘์š”์„ฑ์ด ์ ์ฐจ ์ปค์ง€๊ณ  ์žˆ๋‹ค
๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž๋™ํ™”, ์—ฌ๋Ÿฌ ์†Œ์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์—ฐ๋™ ๋“ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ํ™œ์šฉํ•  ๊ธฐ๋ฐ˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง์˜ ํ•ต์‹ฌ ์—ญํ• ์ด๋‹ค

๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง์˜ ์ฃผ์š” ์ž‘์—…์—๋Š” ETL ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„ค๊ณ„ยท๊ตฌ์ถ•ยท์ž๋™ํ™”ยท์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํฌํ•จ๋œ๋‹ค
์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์–‘ํ•œ ์šด์˜ ์‹œ์Šคํ…œ๊ณผ ๋กœ๊ทธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ •์ œ ๋ฐ ๋ณ€ํ™˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ผ๊ด€์„ฑ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ ์žฌํ•˜๋Š” ๊ณผ์ •์„ ์ฒด๊ณ„ํ™”ํ•œ๋‹ค

์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค๋‚˜ ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์กฐ์ง ์ „๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ์‹œ๊ฐํ™”, ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ๋ง์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ์˜ ํ’ˆ์งˆ๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค
์ด๋Ÿฌํ•œ ์ธํ”„๋ผ๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ์™€ ๋ถ„์„๊ฐ€๋“ค์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •ํ™•ํ•œ ๋ถ„์„๊ณผ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์œผ๋กœ์จ, ๊ถ๊ทน์ ์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ์˜์‚ฌ๊ฒฐ์ •์— ๊ธฐ์—ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ฒŒ ๋œ๋‹ค

์š”์•ฝํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋ฐฉ๋Œ€ํ•œ ์›์ฒœ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์˜๋ฏธํ•œ ์ •๋ณด๋กœ ๋ฐ”๊พธ๋Š” ๋ชจ๋“  ๊ณผ์ •์„ ํฌ๊ด„ํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„ค๊ณ„์™€ ์ž๋™ํ™”๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ, ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ, ์‹œ์Šคํ…œ ๊ฐ„ ํ†ตํ•ฉ ๋“ฑ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ถ„์•ผ์ด๋‹ค


2. Airflow๋ž€?

Airflow์˜ ํ•„์š”์„ฑ

์ดˆ์ฐฝ๊ธฐ์—๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ๋‹จ์ˆœํžˆ cron ์Šค์ผ€์ค„๋Ÿฌ + ์Šคํฌ๋ฆฝํŠธ๋กœ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด์„œ ํ•œ๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค

  • ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ถ€์žฌ: ์–ด๋–ค ์ž‘์—…์ด ๋๋‚˜์•ผ ๋‹ค์Œ์ด ์‹คํ–‰๋˜๋Š”์ง€ ํ‘œํ˜„ ์–ด๋ ค์›€ ย 
  • ์žฅ์•  ์ฒ˜๋ฆฌ ๋ถ€์กฑ: ํ•œ ๋ฒˆ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด ์ค‘๋‹จ ย 
  • ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ๊ณ„: ์‹คํ–‰ ์—ฌ๋ถ€ ์™ธ์—๋Š” ์ƒํƒœ ์ถ”์ ์ด ์–ด๋ ค์›€ ย 
  • ํ™•์žฅ์„ฑ ์ œ์•ฝ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ์ˆ˜๋ฐฑ~์ˆ˜์ฒœ ๊ฐœ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€ ย 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด Workflow Orchestration ๋„๊ตฌ์ด๊ณ  ๊ทธ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๋ฐ”๋กœ Apache Airflow๋‹ค. ย 

Airflow๋ž€?

Apache Airflow๋Š” ์›Œํฌํ”Œ๋กœ์šฐ(์ž‘์—… ํ๋ฆ„)๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ณ  ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”Œ๋žซํผ์œผ๋กœ ์ผ๋ จ์˜ ์ž‘์—…๋“ค์„ DAG(Directed Acyclic Graph, ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„) ํ˜•ํƒœ๋กœ ์ •์˜ํ•˜๊ณ , ์ •์˜๋œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ •ํ•ด์ง„ ์ผ์ •์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ, ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค Airflow์—์„œ๋Š” ๋ชจ๋“  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณต์žกํ•œ ์ž‘์—… ํ๋ฆ„๋„ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํŠน์ง•์ด๋‹ค

Airflow๋Š” ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ถ„์•ผ์—์„œ ํŠนํžˆ ๊ฐ๊ด‘๋ฐ›๋Š” ๋„๊ตฌ๋กœ, ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ์— ๊ฑธ์นœ ์ž‘์—…๋“ค์„ orchestrationํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค

Airflow ์ž์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์ผ์ •๊ณผ ์˜์กด ๊ด€๊ณ„์— ๋”ฐ๋ผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…๋“ค์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์ œ์–ด ํ•œ๋‹ค
์˜ˆ๋ฅผ ๋“ค์–ด Spark๋‚˜ Hadoop์—์„œ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์žฌํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ Airflow๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ๋‹จ๊ณ„๋ฅผ ํƒœ์Šคํฌ๋กœ ์ •์˜ํ•˜๊ณ  DAG๋กœ ์—ฎ์–ด ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

Airflow์˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„์ด๋‚˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ ํƒœ์Šคํฌ๋“ค์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ , ์‚ฌ์ „ ์ •์˜๋œ ์˜์กด์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ๋ณด์žฅํ•œ๋‹ค ๋˜ํ•œ Airflow๋Š” metadata DB, Scheduler, Executor, ์›น ์„œ๋ฒ„(UI) ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ์ž‘์—…์„ ์•ˆ์ •์ ์œผ๋กœ ์Šค์ผ€์ค„๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์‚ฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค

Airflow์˜ ์žฅ์ 
  • ์ง๊ด€์  DAG ๊ด€๋ฆฌ: ์˜์กด์„ฑ์„ ์ฝ”๋“œ์™€ ๊ทธ๋ž˜ํ”„๋กœ ๋™์‹œ์— ํ‘œํ˜„ ย 
  • ์›น UI ์ œ๊ณต: ์‹คํ–‰ ์ƒํƒœ, ๋กœ๊ทธ, ๊ทธ๋ž˜ํ”„๋ฅผ ํ•œ๋ˆˆ์— ํ™•์ธ ๊ฐ€๋Šฅ ย 
  • ์—๋Ÿฌ ํ•ธ๋“ค๋ง: ์‹คํŒจ ์‹œ ์ž๋™ ์žฌ์‹œ๋„ ๋ฐ ์•Œ๋ฆผ ์—ฐ๋™ (Slack, Email ๋“ฑ) ย 
  • ํ™•์žฅ์„ฑ: Celery, KubernetesExecutor ๋“ฑ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹คํ–‰ ์ง€์› ย 
  • ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ: ๋ชจ๋“  ํŒŒ์ดํ”„๋ผ์ธ์„ Python์œผ๋กœ ์ž‘์„ฑ โ†’ ๋ฒ„์ „ ๊ด€๋ฆฌ ์šฉ์ด