Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เบชเบฐเบšเบฒเบเบ”เบต, Habr! เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™ batch, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบšเปเบฅเบดเบชเบฑเบ” DWH เบซเบผเบท DataLake เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบš Apache Airflow (เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ Airflow). เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเป€เบชเบ”เบขเปˆเบฒเบ‡เบšเปเปˆเบเบธเบ•เบดเบ—เปเบฒเบ‚เบญเบ‡เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™Habre, เปเบฅเบฐเปƒเบ™เบชเปˆเบงเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบˆเบปเป‰เบฒเบซเบกเบฑเป‰เบ™เปƒเบˆเบงเปˆเบฒเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ Airflow เบกเบตเบกเบนเบ™เบ„เปˆเบฒเป€เบšเบดเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฅเบทเบญเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ ETL / ELT เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เบšเบปเบ”เป€เบฅเบทเปˆเบญเบ‡เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ‚เบญเบ‡ DWH เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเบ—เบฐเบ™เบฒเบ„เบฒเบ™ Tinkoff. เบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ—เบตเบก Mail.Ru Group เปเบฅเบฐเบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบงเบ—เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเป€เบเบก. เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบง, เบเป‰เบญเบ™เบงเปˆเบฒเบ‚เปˆเบฒเบงเปเบฅเบฐเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ›เบฒเบเบปเบ”, เบ—เบตเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบฅเบฐเบ‚เป‰เบญเบเบˆเบฐเป€เบงเบปเป‰เบฒเบ—เบตเปˆเบ™เบตเป‰เบเปˆเบฝเบงเบเบฑเบšเป€เบงเบ—เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‚เปเป‰เบกเบนเบ™.

Prologue

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. Airflow เปเบกเปˆเบ™เบซเบเบฑเบ‡? เบ™เบตเป‰เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” (เบซเบผเบท เบŠเบธเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”) เป€เบžเบทเปˆเบญเบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบงเบฒเบ‡เปเบœเบ™ เปเบฅเบฐ เบ•เบดเบ”เบ•เบฒเบกเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ. เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡ Airflow: เบฅเบฐเบซเบฑเบ” Python เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบ (เบžเบฑเบ”เบ—เบฐเบ™เบฒ) เบ‚เบฐเบšเบงเบ™เบเบฒเบ™. เบกเบฑเบ™เบกเบตเบ‚เปเป‰เบ”เบตเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™: เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบง, เป‚เบ„เบ‡เบเบฒเบ™ ETL เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเป‚เบ„เบ‡เบเบฒเบ™ Python, เปเบฅเบฐเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบกเบฑเบ™เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™, เป‚เบ”เบเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™, เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ—เบตเบกเบ‡เบฒเบ™เปเบฅเบฐ. เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบทเปˆเบ™เป†. เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ. เปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™ PyCharm + Git. เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบชเบดเปˆเบ‡โ€‹เบกเบฐโ€‹เบซเบฑเบ”โ€‹เปเบฅเบฐโ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เบซเบผเบฒเบโ€‹!

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡ Airflow. เป‚เบ”เบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเป€เบ™เบทเป‰เบญเปเบ—เป‰ เปเบฅเบฐเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ”เบตเบ—เบตเปˆเบชเบธเบ”. เบšเบฒเบ‡เบ—เบตเบซเบปเบงเบซเบ™เปˆเบงเบเบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™ Directed Acyclic Graph (เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ DAG).

DAG

A DAG เปเบกเปˆเบ™เบšเบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เบฅเปเบฒเบ”เบฑเบšเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบขเปˆเบฒเบ‡เป€เบ‚เบฑเป‰เบกเบ‡เบงเบ”เบ•เบฒเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเบฐเป€เบžเบฒเบฐ. Airflow เปƒเบซเป‰เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบงเบฑเบšเบ—เบตเปˆเบชเบฐเบ”เบงเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš DAGs เปเบฅเบฐเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบญเบทเปˆเบ™เป†:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

DAG เบญเบฒเบ”เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ, เป€เบกเบทเปˆเบญเบญเบญเบเปเบšเบš DAG, เบงเบฒเบ‡เบŠเบธเบ”เบ‚เบญเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบงเบฝเบเบ‡เบฒเบ™เบžเบฒเบเปƒเบ™ DAG เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡: Airflow Operator.

เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™

เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เปเบกเปˆเบ™เบ™เบดเบ•เบดเบšเบธเบเบ„เบปเบ™เบšเบปเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบงเบฝเบเบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ—เบดเบšเบฒเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบงเบฝเบ. Airflow เบ›เปˆเบญเบเบญเบญเบเบกเบฒเบˆเบฒเบ GitHub เบกเบตเบŠเบธเบ”เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เปเบฅเป‰เบง. เบ•เบปเบงเบขเปˆเบฒเบ‡:

  • BashOperator - เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡ bash.
  • PythonOperator - เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบซเบฑเบ” Python.
  • EmailOperator โ€” เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบญเบตโ€‹เป€เบกเบงโ€‹.
  • HTTPOperator - เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป http.
  • SqlOperator - เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ” SQL.
  • เป€เบŠเบฑเบ™เป€เบŠเบตเปเบกเปˆเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเปเบ–เป‰เบฒเป€เบซเบ”เบเบฒเบ™ (เบเบฒเบ™เบกเบฒเบฎเบญเบ”เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰, เบฎเบนเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เป€เบชเบฑเป‰เบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบˆเบฒเบ API, เปเบฅเบฐเบญเบทเปˆเบ™เป†).

เบกเบตเบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเป€เบžเบตเปˆเบกเป€เบ•เบตเบก: DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator.

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบžเบฑเบ”เบ—เบฐเบ™เบฒเบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡ MongoDBToHiveViaHdfsTransfer, เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบญเบญเบเป€เบญเบเบฐเบชเบฒเบ™เบˆเบฒเบ MongoDB เป„เบ› Hive, เปเบฅเบฐเบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš เบเบปเบ”เบ›เบธเปˆเบก: CHLoadFromHiveOperator เปเบฅเบฐ CHTableLoaderOperator. เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบง, เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เป„เบ”เป‰เปƒเบŠเป‰เป€เบฅเบทเป‰เบญเบเป†เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบเบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เปƒเบซเบกเปˆ. เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™, เปเบฅเบฐเบ—เปˆเบฒเบ™เบˆเบฐเบ‚เบฐเบซเบเบฒเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ‚เบญเบ‡เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เบ•เปเปˆเป„เบ›, เบ—เบธเบเป†เบเปเบฅเบฐเบ™เบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบฅเบฐเบ•เบญเบ™เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒ.

เบœเบนเป‰เบˆเบฑเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เบ•เบปเบงเบเบณเบ™เบปเบ”เป€เบงเบฅเบฒเปœเป‰เบฒเบงเบฝเบเบ‚เบญเบ‡ Airflow เปเบกเปˆเบ™เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™ Celery. Celery เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” Python เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบฅเบฐเบšเบฝเบšเบ„เบดเบงเบšเบงเบเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบšเปเปˆเบเบปเบ‡เบเบฑเบ™เปเบฅเบฐเปเบˆเบเบขเบฒเบ. เปƒเบ™เบ”เป‰เบฒเบ™ Airflow, เบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบชเบฐเบ™เบธเบเป€เบเบต. เบชเบฐเบ™เบธเบเป€เบเบตเปเบกเปˆเบ™เบชเป‰เบฒเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเปเบซเบผเปˆเบ‡เบซเบผเบทเป€เบžเบทเปˆเบญเบžเบดเบกเบซเบ™เป‰เบฒเบงเบฝเบเบžเบฒเบเปƒเบ™ DWH. เบชเบฐเบ™เบธเบเป€เบเบตเบชเบฒเบกเบฒเบ”เบ–เบทเบเบˆเบฑเบ”เบเบฒเบ™เบœเปˆเบฒเบ™เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเป€เบงเบฑเบš:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เปเบ•เปˆเบฅเบฐเบชเบฐเบ™เบธเบเป€เบเบตเบกเบตเบ‚เบญเบšเป€เบ‚เบ”เบˆเปเบฒเบเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบชเบฐเบฅเบฑเบญเบ”เบ•เบดเบ‡. เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡ DAG, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบกเบญเบšเปƒเบซเป‰:

ALERT_MAILS =  Variable.get("gv_mail_admin_dwh")
DAG_NAME = 'dma_load'
OWNER = 'Vasya Pupkin'
DEPENDS_ON_PAST = True
EMAIL_ON_FAILURE = True
EMAIL_ON_RETRY = True
RETRIES = int(Variable.get('gv_dag_retries'))
POOL = 'dma_pool'
PRIORITY_WEIGHT = 10

start_dt = datetime.today() - timedelta(1)
start_dt = datetime(start_dt.year, start_dt.month, start_dt.day)

default_args = {
    'owner': OWNER,
    'depends_on_past': DEPENDS_ON_PAST,
    'start_date': start_dt,
    'email': ALERT_MAILS,
    'email_on_failure': EMAIL_ON_FAILURE,
    'email_on_retry': EMAIL_ON_RETRY,
    'retries': RETRIES,
    'pool': POOL,
    'priority_weight': PRIORITY_WEIGHT
}
dag = DAG(DAG_NAME, default_args=default_args)
dag.doc_md = __doc__

เบชเบฐเบ™เบธเบเป€เบเบตเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบš DAG เบชเบฒเบกเบฒเบ”เบ–เบทเบ overridden เปƒเบ™เบฅเบฐเบ”เบฑเบšเบซเบ™เป‰เบฒเบงเบฝเบ.
เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, Scheduler, เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ Airflow. เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบง, Scheduler เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบเบปเบ™เป„เบเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบงเบฝเบเบ‡เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบงเบฝเบเบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบœเปˆเบฒเบ™เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”:

  1. เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฒโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เปƒเบ™ DAGโ€‹, เป€เบ›เบฑเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เปƒเบซเบกเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบˆเบฑเบ”โ€‹เบ„เบดเบงโ€‹เป„เบ”เป‰โ€‹.
  2. เปเบ–เบงเบ–เบทเบเบˆเบฑเบ”เบฎเบฝเบ‡เบ‚เบถเป‰เบ™เบขเบนเปˆเบเบฑเบšเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™ (เบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเป„เบ”เป‰), เปเบฅเบฐเบ–เป‰เบฒเบกเบตเบŠเปˆเบญเบ‡เบซเบงเปˆเบฒเบ‡เปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบต, เบงเบฝเบเบ‡เบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”.
  3. เบ–เป‰เบฒเบกเบต celery เบžเบฐเบ™เบฑเบเบ‡เบฒเบ™เบŸเบฃเบต, เบงเบฝเบเบ‡เบฒเบ™เปเบกเปˆเบ™เบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบกเบฑเบ™; เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เบฑเป‰เบ‡เป‚เบ„เบ‡เบเบฒเบ™เบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบซเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบญเบทเปˆเบ™.

เบ‡เปˆเบฒเบเบ”เบฒเบเบžเบฝเบ‡เบžเป.

Scheduler เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบŠเบธเบ”เบ‚เบญเบ‡ DAGs เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบซเบ™เป‰เบฒเบงเบฝเบเบ—เบฑเบ‡เบซเบกเบปเบ”เบžเบฒเบเปƒเบ™ DAGs.

เบชเปเบฒเบฅเบฑเบš Scheduler เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš DAG, DAG เบ•เป‰เบญเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒ:

dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='@hourly')

เบกเบตเบŠเบธเบ”เบ‚เบญเบ‡ presets เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบก: @once, @hourly, @daily, @weekly, @monthly, @yearly.

เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ cron:

dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='*/10 * * * *')

เบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”

เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ Airflow, เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบกเปˆเบ™เบซเบเบฑเบ‡เบชเปเบฒเบฅเบฑเบš DAG. เปƒเบ™ Airflow, DAG เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”, i.e., เบญเบตเบ‡เบ•เบฒเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ DAG, เบ•เบปเบงเบขเปˆเบฒเบ‡เบงเบฝเบเปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”. เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”, เบงเบฝเบเบ‡เบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบทเบ™เปƒเบซเบกเปˆ - เบซเบผเบท, เบ•เบปเบงเบขเปˆเบฒเบ‡, DAG เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบžเป‰เบญเบกเป†เบเบฑเบ™เปƒเบ™เบซเบผเบฒเบเป†เบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบ—เบตเปˆเบ™เบตเป‰:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ (เบซเบผเบทเบญเบฒเบ”เบˆเบฐเป‚เบŠเบเบ”เบต: เบกเบฑเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™), เบ–เป‰เบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เปƒเบ™ DAG เบ–เบทเบเปเบเป‰เป„เบ‚, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบงเบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เบ›เบฑเบšเบ•เบปเบง. เบ™เบตเป‰เปเบกเปˆเบ™เบ”เบตเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเป‚เบ”เบเปƒเบŠเป‰ algorithm เปƒเบซเบกเปˆ, เปเบ•เปˆเบกเบฑเบ™เบšเปเปˆเบ”เบตเป€เบžเบฒเบฐเบงเปˆเบฒเบเบฒเบ™เบชเบทเบšเบžเบฑเบ™เบ‚เบญเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเบชเบนเบ™เป€เบชเบ (เปเบ™เปˆเบ™เบญเบ™, เบšเปเปˆเบกเบตเปƒเบœเบฅเบปเบšเบเบงเบ™เบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบฒเบ Git เปเบฅเบฐเบ„เบดเบ”เป„เบฅเปˆเบงเปˆเบฒเปเบกเปˆเบ™เบซเบเบฑเบ‡. เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบฑเป‰เบ‡เบ”เบฝเบง, เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™).

เบเบณเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เปœเป‰เบฒเบงเบฝเบ

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡ DAG เปเบกเปˆเบ™เบฅเบฐเบซเบฑเบ”เปƒเบ™ Python, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบ”เบงเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบฅเบฐเบซเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฑเบšเปเบซเบผเปˆเบ‡ sharded. เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบตเบชเบฒเบก MySQL shards เป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ›เบตเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เปเบฅเบฐเป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ”เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™. เบฅเบฐเบซเบฑเบ” Python เปƒเบ™ DAG เบญเบฒเบ”เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

connection_list = lv.get('connection_list')

export_profiles_sql = '''
SELECT
  id,
  user_id,
  nickname,
  gender,
  {{params.shard_id}} as shard_id
FROM profiles
'''

for conn_id in connection_list:
    export_profiles = SqlToHiveViaHdfsTransfer(
        task_id='export_profiles_from_' + conn_id,
        sql=export_profiles_sql,
        hive_table='stg.profiles',
        overwrite=False,
        tmpdir='/data/tmp',
        conn_id=conn_id,
        params={'shard_id': conn_id[-1:], },
        compress=None,
        dag=dag
    )
    export_profiles.set_upstream(exec_truncate_stg)
    export_profiles.set_downstream(load_profiles)

DAG เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบซเบผเบทเป€เบญเบปเบฒ shard เป„เบ”เป‰เป‚เบ”เบเบžเบฝเบ‡เปเบ•เปˆเบ›เบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡ DAG. เบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบ!

เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเปเบซเบผเปˆเบ‡เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบทเบญเบฐเบ—เบดเบšเบฒเบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เปเบฅเบฐเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ DWH, เบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ N เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบซเบผเบท, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš API เบ—เบตเปˆเบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™ N เปƒเบ™ DAG เบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ™เบตเป‰, เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ API เบเบฑเบšเบชเบฐเบ™เบธเบเป€เบเบตเปเบฅเบฐเบ‚เบนเบ”. เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบˆเบฒเบ API. เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰!

เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™

Airflow เบกเบต repository backend เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ (เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™ MySQL เบซเบผเบท Postgres, เบžเบงเบเป€เบฎเบปเบฒเบกเบต Postgres), เป€เบŠเบดเปˆเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบงเบฝเบ, DAGs, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบ•เบปเบงเปเบ›เบ—เบปเปˆเบงเป‚เบฅเบ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. repository เปƒเบ™ Airflow เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ (เบ›เบฐเบกเบฒเบ™ 20 เบ•เบฒเบ•เบฐเบฅเบฒเบ‡) เปเบฅเบฐเบชเบฐเบ”เบงเบเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบกเบฑเบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบทเปˆ 100500 เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบ„เบฑเบ‡เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™ Informatica, เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เป„เบ”เป‰เบชเบถเบเบชเบฒเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบชเบญเบšเบ–เบฒเบก.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡ repository, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบเบงเบ”เบเบฒเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเบฐเบ”เบงเบเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™. เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ notepad เปƒเบ™ Zeppelin, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเป€เบงเบฑเบšเบ‚เบญเบ‡ Airflow เป€เบญเบ‡:

Airflow เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เปเบฅเบฐโ€‹เบงเปˆเบญเบ‡โ€‹เป„เบงโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ batchโ€‹

เบฅเบฐเบซเบฑเบ” Airflow เปเบกเปˆเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เปƒเบชเปˆ Telegram. เปเบ•เปˆเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™, เบ–เป‰เบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™, spams เบเบธเปˆเบกเปƒเบ™ Telegram, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เบตเบกเบ‡เบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ›เบฐเบเบญเบšเบ”เป‰เบงเบ.

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ—เบฑเบ™เบ—เบตเป‚เบ”เบเบœเปˆเบฒเบ™ Telegram (เบ–เป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™), เปเบฅเบฐเบœเปˆเบฒเบ™ Zeppelin เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเบšเบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™เปƒเบ™ Airflow.

เบฅเบงเบก

Airflow เปเบกเปˆเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบ•เบปเป‰เบ™เบ•เป, เปเบฅเบฐเบ—เปˆเบฒเบ™เบšเปเปˆเบ„เบงเบ™เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบชเบดเปˆเบ‡เบกเบฐเบซเบฑเบ”เบชเบฐเบˆเบฑเบ™เบˆเบฒเบเบกเบฑเบ™. เบˆเบปเปˆเบ‡เบเบฝเบกเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเป€เบงเบฅเบฒเปเบฅเบฐเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰, เป€เบŠเบทเปˆเบญเบ‚เป‰เบญเบ, เบกเบฑเบ™เบ„เบธเป‰เบกเบ„เปˆเบฒ. เบ„เบงเบฒเบกเป„เบงเบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™, เบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบซเบกเปˆ - เบ—เปˆเบฒเบ™เบˆเบฐเบกเบฑเบเบกเบฑเบ™. เปเบ™เปˆเบ™เบญเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบซเบผเบฒเบเบ•เปเปˆเบญเบปเบ‡เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™, เบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบ‚เบญเบ‡ Airflow เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡: เบกเบฐเบซเบฑเบ”เบชเบฐเบˆเบฑเบ™เบšเปเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบต Airflow เป€เบฎเบฑเบ”เบงเบฝเบเบ›เบฐเบˆเปเบฒเบงเบฑเบ™ เบ›เบฐเบกเบฒเบ™ 6,5 เบžเบฑเบ™เบงเบฝเบเบ‡เบฒเบ™. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ. เบกเบตเบงเบฝเบเบ‡เบฒเบ™เบเบฒเบ™เป‚เบซเบผเบ”เบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ DWH เบ•เบปเป‰เบ™เบ•เปเบˆเบฒเบเบซเบผเบฒเบเปเบซเบผเปˆเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบฅเบฐเบชเบฐเป€เบžเบฒเบฐเบซเบผเบฒเบ, เบกเบตเบงเบฝเบเบ‡เบฒเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบซเบ™เป‰เบฒเบฎเป‰เบฒเบ™เบžเบฒเบเปƒเบ™ DWH เบ•เบปเป‰เบ™เบ•เป, เบกเบตเบงเบฝเบเบ‡เบฒเบ™เป€เบœเบตเบเปเบœเปˆเบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ DWH เป„เบง, เบกเบตเบซเบผเบฒเบ, เบซเบผเบฒเบเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ - เปเบฅเบฐ Airflow. chews เบžเบงเบโ€‹เป€เบ‚เบปเบฒโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เป€เบ–เบดเบ‡โ€‹เบกเบทเป‰โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹. เป€เบงเบปเป‰เบฒเปƒเบ™เบ•เบปเบงเป€เบฅเบ, เบ™เบตเป‰เปเบกเปˆเบ™ 2,3 เบžเบฑเบ™ เบงเบฝเบเบ‡เบฒเบ™ ELT เบ‚เบญเบ‡เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบžเบฒเบเปƒเบ™ DWH (Hadoop), เบ›เบฐเบกเบฒเบ™. 2,5 เบฎเป‰เบญเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบ—เบตเบกเบ‡เบฒเบ™เบˆเบฒเบ 4 เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ ETL, เป€เบŠเบดเปˆเบ‡เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™ ETL เปƒเบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™ DWH เปเบฅเบฐ ELT เบžเบฒเบเปƒเบ™ DWH เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™เบซเบผเบฒเบ. เบซเบ™เบถเปˆเบ‡ admin, เบœเบนเป‰เบ—เบตเปˆเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™.

เปเบœเบ™เบชเปเบฒเบฅเบฑเบšเบญเบฐเบ™เบฒเบ„เบปเบ”

เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบซเบผเบตเบเบฅเปˆเบฝเบ‡เบšเปเปˆเป„เบ”เป‰, เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เปƒเบ™เบ”เป‰เบฒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ Airflow เปเบกเปˆเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ‚เบฐเบซเบ™เบฒเบ”. เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบก Airflow, เบˆเบฑเบ”เบชเบฑเบ™เบ‚เบฒเบ„เบนเปˆเบชเปเบฒเบฅเบฑเบšเบžเบฐเบ™เบฑเบเบ‡เบฒเบ™ Celery, เปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบซเบปเบงเบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เบ”เป‰เบงเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบงเบฝเบเปเบฅเบฐเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™.

Epilogue

เบ™เบตเป‰, เปเบ™เปˆเบ™เบญเบ™, เบšเปเปˆเปเบกเปˆเบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบขเบฒเบเบšเบญเบเบเปˆเบฝเบงเบเบฑเบš Airflow, เปเบ•เปˆเบ‚เป‰เบญเบเบžเบฐเบเบฒเบเบฒเบกเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบˆเบธเบ”เบ•เบปเป‰เบ™เบ•เป. เบ„เบงเบฒเบกเบขเบฒเบเบญเบฒเบซเบฒเบ™เบกเบฒเบžเป‰เบญเบกเบเบฑเบšเบเบฒเบ™เบเบดเบ™, เบฅเบญเบ‡เป€เบšเบดเปˆเบ‡เปเบฅเป‰เบงเป€เบˆเบปเป‰เบฒเบˆเบฐเบกเบฑเบเบกเบฑเบ™ :)

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™