7.1 Introduction to Apache Airflow#

../../_images/7_1_1.png

Airflow ๋ž€?#

  • Pythonย ๊ธฐ๋ฐ˜์˜ย workflowย tool ์ž…๋‹ˆ๋‹ค.

  • workflowย ๋ฅผย ๊ตฌ์„ฑํ•˜๋Š”ย ๋ฐฉ๋ฒ•์„ย DAGย ์™€ย taskย ๋ผ๋Š”ย ๋‹จ์œ„๋กœย ๋ณต์žกํ•˜๊ณ ย ๋‹ค์–‘ํ•˜๊ฒŒย ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • Task : airflow์˜ operator, etl๋“ฑ์˜ ์ž‘์—…๋“ค์ด ๊ฐ๊ฐ์˜ task๊ฐ€ ๋˜๋ฉฐ, task๊ฐ„ ์ˆœ์„œ ์ง€์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • DAG(Directes Acyclic Graph) : ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„๋กœ ๋ฐ์ดํ„ฐํŒŒ์ดํ”„๋ผ์ธ ํ•˜๋‚˜์˜ ๋‹จ์œ„, ํ•˜๋‚˜์˜ DAG์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ task๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Airflow๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ํƒœ์Šคํฌ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์›น ์„œ๋ฒ„, ์Šค์ผ€์ค„๋Ÿฌ ๋ฐ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ!

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Airflow#

  • ๐Ÿ’ก ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„(DAG)์— Task์™€ ์ด์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๐Ÿ’ก ์ˆ˜๋…„๊ฐ„ ํƒœ์Šคํฌ ๊ทธ๋ž˜ํ”„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์›Œํฌํ”Œ๋กœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ๊ฐœ๋ฐœ๋˜์—ˆ๊ณ , ๊ทธ ์ค‘ Airflow๋Š” ๋ฐฐ์น˜ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„์„ ์œ„ํ•ด ํŠนํ™”๋œ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Airflow์˜ ์žฅ๋‹จ์ #

์žฅ์ :#

  • ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋˜์–ด, ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์น˜, ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ด์ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ์ด์ฌ ์–ธ์–ด์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ํ›„์ˆ ํ•  Backfill ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ ์žฌ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ์žฌ์ƒ์„ฑ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ :#

  • ๋ฐ˜๋ณต์ ์ด๊ฑฐ๋‚˜ ๋ฐฐ์น˜ํƒœ์Šคํฌ์— ๊ธฐ๋Šฅ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Airflow์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ#

../../_images/7_1_2.png
  • Airflow ์›Œ์ปค: ์˜ˆ์•ฝ๋œ task๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • Airflow ์Šค์ผ€์ค„๋Ÿฌ: DAG๋ฅผ ๋ถ„์„, ํ˜„ ์‹œ์ ์—์„œ DAG์˜ ์Šค์ผ€์ค„์ด ์ง€๋‚œ ๊ฒฝ์šฐ ์›Œ์ปค์— DAG์˜ ํƒœ์Šคํฌ๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

  • Airflow ์›น์„œ๋ฒ„: ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ๋ถ„์„ํ•œ DAG๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  DAG ์‹คํ–‰๊ณผ ๊ฒฐ๊ณผ๋ฅผ ํ™˜์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด์™ธ ์ปดํฌ๋„ŒํŠธ#

  • Airflow database : ์ตœ์ดˆ ์„ค์น˜์‹œ ๊ธฐ๋ณธ์œผ๋กœ sqlite๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

  • Airflow queue : ๋ฉ€ํ‹ฐ๋…ธ๋“œ ๊ตฌ์„ฑ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Airflow ์Šค์ผ€์ฅด๋ง#

๐Ÿ’ก Airflow์˜ ์Šค์ผ€์ค„ ๊ฐ„๊ฒฉ์€ Cron๊ตฌ๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ์ฃผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋ก  ๊ตฌ๋ฌธ ์˜ˆ์‹œ

์„ค๋ช…

0 * * * *

๋งค์‹œ๊ฐ„ (์ •์‹œ ์‹คํ–‰)

0 0 * * *

๋งค์ผ (์ž์ •์— ์‹คํ–‰)

0 0 * * 0

๋งค์ฃผ (์ผ์š”์ผ ์ž์ •์— ์‹คํ–‰)

0 0 1 * *

๋งค์›” 1์ผ ์ž์ •

45 23 * * SAT

๋งค์ฃผ ํ† ์š”์ผ 23์‹œ 45๋ถ„

0 0 * * MON, WED, FRI

๋งค์ฃผ ์›”, ํ™”, ๊ธˆ ์ž์ •์— ์‹คํ–‰

0 0 * * MON-FRI

๋งค์ฃผ ์›”~๊ธˆ ์ž์ •์— ์‹คํ–‰

0 0,12 * * *

๋งค์ผ ์ž์ • ๋ฐ ์˜คํ›„ 12์‹œ ์‹คํ–‰

๋ฐฑํ•„(backfill)#

  • DAG์˜ ๊ณผ๊ฑฐ ์‹œ์ ์„ ์ง€์ •ํ•ด ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ž…๋‹ˆ๋‹ค.

  • DAG์— ๊ณผ๊ฑฐ ์‹œ์ž‘ ๋‚ ์งœ๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น DAG๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ณผ๊ฑฐ ์‹œ์ž‘ ์ดํ›„๋ถ€ํ„ฐ ํ˜„์žฌ์‹œ๊ฐ„๊นŒ์ง€์˜ ๋ชจ๋“  ์Šค์ผ€์ฅด ๊ฐ„๊ฒฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Backfill์˜ ๊ฒฝ์šฐ catchup์ด๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค. (True/False)

๐Ÿ›  ๋งค์ผ 0์‹œ 0๋ถ„์— ์‹คํ–‰๋˜๋Š” DAG์˜ˆ์ œ#

DAG( 
    dag_id='test_dag', 
    schedule_interval='0 0 * * *', 
    start_date=datetime.datetime(2023, 1, 1) 
)
  • ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด, ์ตœ์ดˆ ์‹คํ–‰์ผ์ž๋Š” 2023๋…„ 1์›” 2์ผ 0์‹œ 0๋ถ„์ด๋ฉฐ, 2023๋…„ 1์›” 1์ผ 0์‹œ ~ 2023๋…„ 1์›” 1์ผ 23์‹œ 59๋ถ„ ๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ 2021๋…„ 1์›” 4์ผ์— start_date๊ฐ€ 2021-01-01์ธ DAG๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ONํ–ˆ๋‹ค๋ฉด 2021-01-01, 2021-01-02, 2021-01-03์— ํ•ด๋‹นํ•˜๋Š” ์Šค์ผ€์ฅด์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Start_date : ์ฒ˜์Œ DAG๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„์ด ์•„๋‹Œ, COPYํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์‹œ๊ฐ„ ์ž…๋‹ˆ๋‹ค.

  • Execution_date : ์‹คํ–‰์‹œ๊ฐ์ด ์•„๋‹Œ, ์ผ๋ จ์˜ ์ฃผ๋ฌธ๋ฒˆํ˜ธ ๊ฐœ๋… (crontab์‹คํ–‰์‹œ์ )

    • ์ฆ๋ถ„ ์ ์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • ํŒŒ์ดํ”„๋ผ์ธ ์‹คํŒจ ํ˜น์€ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ’ ์ž…๋‹ˆ๋‹ค.

Airflow๋Š” ๋งŒ๋Šฅ?!#

  • Airflow๋Š” scheduling ๊ธฐ๋ฐ˜์˜ batch ์šฉ workflow ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

  • ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • streaming ์ž‘์—… (๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜์‹์œผ๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ตฌํ˜„์€ ๊ฐ€๋Šฅ)

    • ๋ฌดํ•œํžˆ ์‹คํ–‰๋˜๋Š” ์ž‘์—…

    • Airflow ์™ธ๋ถ€ ์š”์†Œ์— ์˜ํ•ด trigger ๋˜๋Š” scheduling ๋ฐฉ์‹ (API๋กœ ํŠธ๋ฆฌ๊ฑฐ๋Š” ๊ฐ€๋Šฅ, ์™ธ๋ถ€ API๊ฐ€ DAG์„ ์ฐŒ๋ฅด๋Š” ๊ฑด ์–ด๋ ค์›€)

  • ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์€ airflow์—์„œ ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ง€์—ฐ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์˜ ์Šค์ผ€์ค„๋ง

    • Airflow worker ๋‚ด์—์„œ ๊ณ ๋ถ€ํ•˜ ์ž‘์—…์˜ ์ฒ˜๋ฆฌ (๋‚ด๋ถ€์—์„œ ๊ณ ์—ฐ์‚ฐ ์ž‘์—…์„ ํ•˜๊ธฐ๋ณด๋‹จ ์ œ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.)