ML/MLOps Engineer
airflow ์‚ฌ์šฉ๊ธฐ

11์›”์—๋Š” ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐฐ์น˜ ์‹คํ–‰์„ ์œ„ํ•ด airflow๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
  

Airflow์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์œ ์—ฐํ•œ ํŒŒ์ด์ฌ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ตœ์‹  ๊ธฐ์ˆ  ํ™˜๊ฒฝ์—์„œ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋“ค์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋นŒ๋”ฉ ๋ธ”๋ก์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
- ๋ฐ”์Šค ํ•˜๋ Œ์Šฌ๋ฝ, Data Pipelines with Apache Airflow

  
๋ฐฐ์น˜ ์‹คํ–‰์„ ํ•ด์•ผ ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์›์ฒœ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ(DB, HDFS, FTP) - ๋ณ€ํ™˜ - ์ถœ๋ ฅ(DB, HDFS) ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ณ€ํ™˜ ์ž‘์—…์€ NULL๊ฐ’ ์ฒ˜๋ฆฌ, ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ, ์ปฌ๋Ÿผ ์ƒ์„ฑ ๋“ฑ ํ•™์Šต ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์ด ์†ํ•ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ task๋Š” pyspark๋ฅผ ์‚ฌ์šฉํ•œ task ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  
๊ธฐ์กด์— airflow๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์น˜๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ์—๋Š” ์ „์ฒด ์ž‘์—…์„ ๋‹จ์ผ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ชจ๋†€๋ฆฌ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์Šคํฌ๋ฆฝํŠธ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” ์ „์—ญ์ ์œผ๋กœ ์„ ์–ธ๋œ spark session์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ I/O, ๋ณ€ํ™˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์—…๊ฐ„ spark viewtable์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›์•„ A๋ผ๋Š” ๋ทฐ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” Aํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ B ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ์ดํ›„ ๋‹จ๊ณ„์—์„œ๋Š” B ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ C ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด์ „ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ ๋ทฐํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. 
  
airflow๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐฐ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ด๋Ÿฐ ์–ด๋ ค์›€์„ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
  
" ๊ฐ๊ฐ์˜ ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ๊ฐœ๋ณ„ task ๋กœ ์ƒ์„ฑํ•˜์˜€์„ ๋•Œ ์ด์ „ ๋‹จ๊ณ„์—์„œ viewtable์„ ์ƒ์„ฑํ•˜๋”๋ผ๋„ ๋‹ค์Œ task ์—์„œ viewtable ์กฐํšŒ์‹œ ํ…Œ์ด๋ธ”์ด ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ "
  
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” task ๊ฐ„ spark session ๊ณต์œ ๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋‚˜์˜ task ์•ˆ์— ๋ชจ๋‘ ๋ชจ์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ์— ๋“œ๋Š” ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•  ๋งŒํ•œ์ง€๋„ ์˜๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ถ„๋ฆฌ๋œ task๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ Disk I/O์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  
์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์„ ํƒํ•˜๋ฉด ์ข‹์„์ง€ ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€, ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ dask ์Šคํ„ฐ๋”” ํŒ€์›๋ถ„๋“ค๊ป˜ ์˜๊ฒฌ์„ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜๊ฒฌ๋“ค์„ ์ข…ํ•ฉํ•ด ๋ณด๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  

[task๋ฅผ ๋‚˜๋ˆ„๋Š” ๋‹จ์œ„]
1. ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์งง๋‹ค๋ฉด spark ์ž‘์—… ์ „์ฒด๋ฅผ ํ•˜๋‚˜์˜ task๋กœ ๋งŒ๋“œ๋Š” ํŽธ์ด ์ข‹๋‹ค.
2. ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๊ธธ๊ฑฐ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ƒ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ณ„๋„์˜ task๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. task ์ˆ˜ํ–‰์˜ ๊ฒฐ๊ณผ๋„ ๋‹จ๊ณ„๋ณ„๋กœ ์ ์žฌํ•œ๋‹ค.
  
[task๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ์ด์œ ]
- ์ค‘๊ฐ„์— ์‹คํŒจํ•œ task๋ฅผ ์žฌ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ
- task ๋ณ„ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚จ๊ธฐ๋Š” ์ด์œ ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์‹œ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•จ์ด๊ณ , ์—๋Ÿฌ ๋Œ€์‘์—๋„ ํ™œ์šฉํ•œ๋‹ค.
  
[ํƒœ์Šคํฌ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ]
- S3๋‚˜ ํ•˜๋‘ก ๋“ฑ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”ํ™”ํ•ด์„œ spark sql๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•จ.
-  Disk I/O(ex- parquet๋กœ ๋–จ๊ตฌ๊ณ  ๋‹ค์‹œ ๋กœ๋“œ)์— ๋”ฐ๋ฅธ ์ถ”๊ฐ€์ ์ธ ๋ถ€ํ•˜๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ๋‹จ๊ณ„๋ณ„ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธด ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ฐ„ ํŒŒ์ผ์„ ์ €์žฅํ•ด์„œ task ๋ณ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ถ”ํ›„ ์šด์˜์— ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

  
๋น„์ฆˆ๋‹ˆ์Šค์— ๋”ฐ๋ผ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ ์ƒ๊ฐํ•ด ๋ดค๋Š”๋ฐ, ๋งค์ถœ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋งค์ถœ raw data ์ถ”์ถœ -> ์›”๋ณ„ ํŒ๋งค๋Ÿ‰ ํ•ฉ๊ณ„ ๊ณ„์‚ฐ -> ์›”๋ณ„ ๊ณ ๊ฐ ์ˆ˜ ๋ฐ์ดํ„ฐ์™€ ์กฐ์ธ -> ์›”๋ณ„ 1์ธ๋‹น ํ‰๊ท  ๊ตฌ๋งค์•ก output ์ด๋Ÿฌํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ํŠน์ • ๋‹จ๊ณ„์˜ ๋ฐ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์› ๋ฐ์ดํ„ฐ๋งŒ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. 
  
11์›”์—๋Š” airflow๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์—…๋ฌด๋ฅผ ์ฃผ๋กœ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ task ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. airflow ui๋ฅผ ํ†ตํ•ด ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. task๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ๋‹จ๊ณ„๋ณ„ ์ž‘์—… ์†Œ์š” ์‹œ๊ฐ„๊ณผ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ํ•„์š” ์—ฌ๋ถ€์— ๋”ฐ๋ผ task์˜ ๋ถ„๋ฆฌ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค!