Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αžŸαž½αžŸαŸ’αžαžΈ αž αžΆαž”! αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž§αž”αž€αžšαžŽαŸαžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž€αŸ’αžšαž»αž˜ αž§αž‘αžΆαž αžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ DWH ឬ DataLake αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈ Apache Airflow (αžαž‘αŸ…αž“αŸαŸ‡αž αŸ…αžαžΆ Airflow)αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαž€αž αžΌαžαžŠαŸ„αž™αž’αž™αž»αžαŸ’αžαž·αž’αž˜αŸŒαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž›αžΎHabre αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŸαŸ†αžαžΆαž“αŸ‹ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αž‰αŸ’αž…αž»αŸ‡αž”αž‰αŸ’αž…αžΌαž›αž’αŸ’αž“αž€αžαžΆ αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ Airflow αž‚αžΊαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž˜αžΎαž›αž“αŸ…αž–αŸαž›αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ETL/ELT αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž–αžΈαž˜αž»αž“αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αžαŸ’αžαž”αž‘αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž›αžΎαž”αŸ’αžšαž’αžΆαž“αž”αž‘ DWH αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαž€αžΆαžšαž“αŸ…αž’αž“αžΆαž‚αžΆαžš Tinkoff αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž€αŸ’αžšαž»αž˜ Mail.Ru Group αž αžΎαž™αž€αŸ†αž–αž»αž„αž”αž„αŸ’αž€αžΎαžαžœαŸαž‘αž·αž€αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αž αŸ’αž‚αŸαž˜αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αŸαžαŸŒαž˜αžΆαž“ αž“αž·αž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αŸαž…αž‘αžΎαž„ αž€αŸ’αžšαž»αž˜αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž“αž·αž„αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž’αŸ†αž–αžΈαžœαŸαž‘αž·αž€αžΆαžšαž”αžŸαŸ‹αž™αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

Prologue

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαžΌαž˜αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αžαžΎαž›αŸ†αž αžΌαžšαžαŸ’αž™αž›αŸ‹αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈ? αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ (ឬ αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™) αžŠαžΎαž˜αŸ’αž”αžΈαž’αž—αž·αžœαžŒαŸ’αž αžšαŸ€αž”αž…αŸ†αž•αŸ‚αž“αž€αžΆαžš αž“αž·αž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž„αžΆαžšαŸ” αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž…αž˜αŸ’αž”αž„αž“αŸƒαž›αŸ†αž αžΌαžšαžαŸ’αž™αž›αŸ‹αŸ– αž€αžΌαžŠ Python αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž–αžŽαŸŒαž“αžΆ (αž’αž—αž·αžœαžŒαŸ’αž) αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αžœαžΆαž˜αžΆαž“αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αž˜αŸ’αžšαŸ„αž„ αž“αž·αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ– αž‡αžΆαžŸαŸ†αžαžΆαž“αŸ‹ αž‚αž˜αŸ’αžšαŸ„αž„ ETL αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„ Python αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ€αž”αž…αŸ†αžœαžΆαž”αžΆαž“αžαžΆαž˜αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“ αžŠαŸ„αž™αž‚αž·αžαž‚αžΌαžšαž–αžΈαž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž‘αŸ†αž αŸ†αž€αŸ’αžšαž»αž˜ αž“αž·αž„ αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž§αž”αž€αžšαžŽαŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸ PyCharm + Git αŸ” αžœαžΆαž–αž·αžαž‡αžΆαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™ αž“αž·αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŽαžΆαžŸαŸ‹!

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž’αžΆαžαž»αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒ Airflow αŸ” αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž–αžΈαžαŸ’αž›αžΉαž˜αžŸαžΆαžš αž“αž·αž„αž‚αŸ„αž›αž”αŸ†αžŽαž„αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ€αž”αž…αŸ†αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αžΆαž“αž™αŸ‰αžΆαž„αž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αž„αŸ’αž‚αž—αžΆαž–αžŸαŸ†αžαžΆαž“αŸ‹αž‚αžΊ Directed Acyclic Graph (αžαž‘αŸ…αž“αŸαŸ‡αž αŸ…αžαžΆ DAG)αŸ”

DAG

DAG αž‚αžΊαž‡αžΆαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŠαŸαž˜αžΆαž“αž’αžαŸ’αžαž“αŸαž™αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αŸ†αž–αŸαž‰αžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž™αŸ‰αžΆαž„αžαžΉαž„αžšαŸ‰αžΉαž„αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž€αžΆαž›αžœαž·αž—αžΆαž‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ” Airflow αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžŠαžΆαž‰αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ DAGs αž“αž·αž„αž’αž„αŸ’αž‚αž—αžΆαž–αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ–

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

DAG αž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αŸ…αž–αŸαž›αžšαž…αž“αžΆ DAG αž”αžΆαž“αžŠαžΆαž€αŸ‹αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸ…αž€αŸ’αž“αž»αž„ DAG αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž˜αž€αžŠαž›αŸ‹αž’αž„αŸ’αž‚αž—αžΆαž–αžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž‘αŸ€αž: αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž›αŸ†αž αžΌαžšαžαŸ’αž™αž›αŸ‹αŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‚αžΊαž‡αžΆαž’αž„αŸ’αž‚αž—αžΆαž–αž˜αž½αž™αž“αŸ…αž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αžšαžŽαžΈαž€αžΆαžšαž„αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αžŠαŸ‚αž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž„αžΆαžšαŸ” αž›αŸ†αž αžΌαžšαžαŸ’αž™αž›αŸ‹αž…αŸαž‰αž–αžΈ GitHub αž˜αžΆαž“αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž§αž‘αžΆαž αžšαžŽαŸ:

  • BashOperator - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ bash αŸ”
  • PythonOperator - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž αŸ…αž€αžΌαžŠ Python αŸ”
  • EmailOperator - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‰αžΎαž’αŸŠαžΈαž˜αŸ‚αž›αŸ”
  • HTTPOperator - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαŸ†αžŽαžΎ http αŸ”
  • SqlOperator - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΌαžŠ SQL αŸ”
  • αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆαž‚αžΊαž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž„αŸ‹αž…αžΆαŸ†αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž˜αž½αž™ (αž€αžΆαžšαž˜αž€αžŠαž›αŸ‹αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš αžšαžΌαž”αžšαžΆαž„αž“αŸƒαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš αž”αž“αŸ’αž‘αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈ API αž‡αžΆαžŠαžΎαž˜)αŸ”

αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ– DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator αŸ”

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž’αž—αž·αžœαžŒαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž›αž€αŸ’αžαžŽαŸˆαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αž”αŸ’αžšαžΎαž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž MongoDBToHiveViaHdfsTransfer αžŠαŸ‚αž›αž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αžΆαŸ†αž…αŸαž‰αž―αž€αžŸαžΆαžšαž–αžΈ MongoDB αž‘αŸ… Hive αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ αž…αž»αž…αž•αŸ’αž‘αŸ‡αŸ– CHLoadFromHiveOperator αž“αž·αž„ CHTableLoaderOperator αŸ” αž‡αžΆαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹ αžŠαžšαžΆαž”αžŽαžΆαž‚αž˜αŸ’αžšαŸ„αž„αž˜αž½αž™αž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž€αžΌαžŠαžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž›αžΎαžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž’αŸ’αž“αž€αž’αžΆαž…αž‚αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž€αžŸαžΆαž„αžœαžΆαž‘αŸ…αž‡αžΆαžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸαžαŸ’αž˜αžΈαž˜αž½αž™αŸ” αžœαžΆαž“αžΉαž„αž‡αž½αž™αžŸαž˜αŸ’αžšαž½αž›αžŠαž›αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αž αžΎαž™αž’αŸ’αž“αž€αž“αžΉαž„αž–αž„αŸ’αžšαžΈαž€αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αž αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αŸ”

αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ†αž€αžΆαž›αžœαž·αž—αžΆαž‚

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹ Airflow αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž›αžΎ សអទី. Celery αž‚αžΊαž‡αžΆαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ Python αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ†αž‡αž½αžš αž”αžΌαž€αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž˜αž·αž“αžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜ αž“αž·αž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αŸ” αž“αŸ…αž•αŸ’αž“αŸ‚αž€ Airflow αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αž‘αŸ…αž‡αžΆαžαŸ’αž›αž»αž€αŸ” αž’αžΆαž„αž‘αžΉαž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αžŠαŸƒαŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž‚αŸ„αž›αž”αŸ†αžŽαž„αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž‚αžΊαž€αŸ†αžŽαžαŸ‹αž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž—αž– αž¬αžŠαžΎαž˜αŸ’αž”αžΈαžœαžΆαž™αž”αž‰αŸ’αž…αžΌαž›αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸ…αž€αŸ’αž“αž»αž„ DWH αŸ” αž’αžΆαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžαžΆαž˜αžšαž™αŸˆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžŠαžΆαž‰αŸ–

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αž’αžΆαž„αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž›αžΎαž…αŸ†αž“αž½αž“αžšαž“αŸ’αž’αžŠαŸ„αžαŸ” αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαž 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 αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž—αžΆαžšαž€αž·αž…αŸ’αž…αŸ”
αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™ Scheduler αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αžΆαž›αžœαž·αž—αžΆαž‚αž€αžΆαžšαž„αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ Airflow αŸ” αžαžΆαž˜αž–αž·αž Scheduler αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž™αž“αŸ’αžαž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ” αž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αžšαžΌαžœαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‡αžΆαž…αŸ’αžšαžΎαž“αž˜αž»αž“αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ–

  1. αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž»αž“αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ DAG αž αžΎαž™ αž€αžΆαžšαž„αžΆαžšαžαŸ’αž˜αžΈαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαž˜αŸ’αžšαž„αŸ‹αž‡αž½αžšαŸ”
  2. αž‡αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαž˜αŸ’αžšαŸ€αž”αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž’αžΆαž‘αž·αž—αžΆαž–αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžš (αž’αžΆαž‘αž·αž—αžΆαž–αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž•αž„αžŠαŸ‚αžš) αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αžšαž“αŸ’αž’αžŠαŸ„αžαž‘αŸ†αž“αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαž„ αž“αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”
  3. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“ celery αž€αž˜αŸ’αž˜αž€αžšαžŠαŸ„αž™αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ, αž—αžΆαžšαž€αž·αž…αŸ’αž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αžœαžΆ; αž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž˜αž½αž™ αž¬αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαžŸαŸ†αžŽαž»αŸ†αž“αŸƒ DAGs αž“αž·αž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ DAGs αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Scheduler αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ DAG DAG αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž€αžΆαž›αžœαž·αž—αžΆαž‚αŸ–

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

αž˜αžΆαž“αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αŸ– @once, @hourly, @daily, @weekly, @monthly, @yearly.

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž”αŸ’αžšαžΎαž€αž“αŸ’αžŸαŸ„αž˜ cronαŸ–

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

αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·

αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž› Airflow αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžœαžΆαž‡αžΆαžšαžΏαž„αžŸαŸ†αžαžΆαž“αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž™αž›αŸ‹αž–αžΈαž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ DAG αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ Airflow DAG αž˜αžΆαž“αžœαž·αž˜αžΆαžαŸ’αžšαž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž–αŸ„αž›αž‚αžΊαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž€αžΆαž›αžœαž·αž—αžΆαž‚αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹ DAG αž€αžšαžŽαžΈαž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αžΈαž˜αž½αž™αŸ—αŸ” αž αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αžΈαž˜αž½αž™αŸ— αž—αžΆαžšαž€αž·αž…αŸ’αž…αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‘αžΎαž„αžœαž·αž‰ αž¬αž§αž‘αžΆαž αžšαžŽαŸ DAG αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ–

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αž‡αžΆαž’αž€αž»αžŸαž› (αž¬αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžŸαŸ†αžŽαžΆαž„αŸ– αžœαžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–) αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸ…αž€αŸ’αž“αž»αž„ DAG αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ‚αžαž˜αŸ’αžšαžΌαžœ αž“αŸ„αŸ‡αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž˜αž»αž“αž“αžΉαž„αž”αž“αŸ’αžαžŠαŸ„αž™αž‚αž·αžαž‚αžΌαžšαž–αžΈαž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαŸ” αžœαžΆαž›αŸ’αž’αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‚αžŽαž“αžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΎαž„αžœαž·αž‰αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž€αž“αŸ’αž›αž„αž˜αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ’αž˜αžΈ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž˜αž·αž“αž›αŸ’αž’αž‘αŸαž–αŸ’αžšαŸ„αŸ‡αž€αžΆαžšαž•αž›αž·αžαž‘αžΎαž„αžœαž·αž‰αž“αŸƒαž›αž‘αŸ’αž’αž•αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹ (αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αžšαŸ†αžαžΆαž“αž’αŸ’αž“αž€αž±αŸ’αž™αžαŸ’αžšαž‘αž”αŸ‹αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸƒαž€αžΌαžŠαž”αŸ’αžšαž—αž–αž–αžΈ Git αž αžΎαž™αž‚αžŽαž“αžΆαž’αŸ’αžœαžΈ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαŸ‚αž˜αŸ’αžαž„αž‡αžΆαžœαž·αž’αžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžš)

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž—αžΆαžšαž€αž·αž…αŸ’αž…

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž DAG αž‚αžΊαž‡αžΆαž€αžΌαžŠ Python αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αžœαž·αž’αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž…αŸ†αž“αž½αž“αž€αžΌαžŠαž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžš αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž—αž–αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αŸ” αž§αž”αž˜αžΆαžαžΆαž’αŸ’αž“αž€αž˜αžΆαž“ 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 αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜ αž¬αž›αž»αž” shard αžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž– DAG αŸ” αž˜αžΆαž“β€‹αž•αžΆβ€‹αžŸαž»αžαž—αžΆαž–!

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž”αŸ’αžšαžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΌαžŠαžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž‡αžΆαž„αž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž—αž–αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž¬αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαžšαžΆαž„ αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžαžΆαžšαžΆαž„ αž“αž·αž„αžŠαŸ„αž™αž‚αž·αžαž‚αžΌαžšαž–αžΈαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ DWH αž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‘αž»αž€αžαžΆαžšαžΆαž„ N αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž¬αž§αž‘αžΆαž αžšαžŽαŸ αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ API αžŠαŸ‚αž›αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž”αž‰αŸ’αž‡αžΈ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž€αž·αž…αŸ’αž…αž€αžΆαžš N αž€αŸ’αž“αž»αž„ DAG αž–αžΈαž”αž‰αŸ’αž‡αžΈαž“αŸαŸ‡ αž€αŸ†αžŽαžαŸ‹αž—αžΆαž–αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αŸƒαžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ API αž‘αŸ…αž’αžΆαž„αž˜αž½αž™ αž αžΎαž™αž”αŸ†αž”αŸ‚αž€ αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž–αžΈ API αŸ” αž”αžαŸ‹αž”αŸ‚αž“!

αžƒαŸ’αž›αžΆαŸ†αž„

Airflow αž˜αžΆαž“αžƒαŸ’αž›αžΆαŸ†αž„ backend αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ (αž’αžΆαž…αž‡αžΆ MySQL ឬ Postgres αž™αžΎαž„αž˜αžΆαž“ Postgres) αžŠαŸ‚αž›αž•αŸ’αž‘αž»αž€αž“αžΌαžœαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž€αž·αž…αŸ’αž…αž€αžΆαžš DAGs αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž’αžαŸαžšαžŸαž€αž›αŸ”αž›αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž“αž·αž™αžΆαž™αž”αžΆαž“αžαžΆ αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„ Airflow αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹ (αž”αŸ’αžšαž αŸ‚αž› 20 តុ) αž αžΎαž™αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž›αžΎαžœαžΆαŸ” αžαŸ’αž‰αž»αŸ†αž…αžΆαŸ†αžαžΆαžšαžΆαž„αž…αŸ†αž“αž½αž“ 100500 αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ Informatica αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžŸαž·αž€αŸ’αžŸαžΆαž’αžŸαŸ‹αžšαž™αŸˆαž–αŸαž›αž‡αžΆαž™αžΌαžšαž˜αž»αž“αž–αŸαž›αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž½αžšαŸ”

αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™

αžŠαŸ„αž™αž‚αž·αžαž–αžΈαž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αŸ” αž™αžΎαž„αž”αŸ’αžšαžΎ notepad αž“αŸ…αž€αŸ’αž“αž»αž„ Zeppelin αžŠαŸ‚αž›αž™αžΎαž„αž˜αžΎαž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ–

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αž“αŸαŸ‡αž€αŸαž’αžΆαž…αž‡αžΆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžŠαžΆαž‰αžšαž”αžŸαŸ‹ Airflow αžαŸ’αž›αž½αž“αžœαžΆαž•αž„αžŠαŸ‚αžšαŸ–

Airflow αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αžΆαž…αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ

αž›αŸαžαž€αžΌαžŠ Airflow αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž  αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž‘αŸ…αž€αžΆαž“αŸ‹ Telegram αŸ” αžšαžΆαž›αŸ‹αž€αžšαžŽαžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž€αŸ†αž αž»αžŸαž€αžΎαžαž‘αžΎαž„ αž“αŸ„αŸ‡ spam αž€αŸ’αžšαž»αž˜αž“αŸ…αž€αŸ’αž“αž»αž„ Telegram αžŠαŸ‚αž›αž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž‡αŸ†αž“αž½αž™αž‘αžΆαŸ†αž„αž˜αžΌαž›αž˜αžΆαž“αŸ”

αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž—αŸ’αž›αžΆαž˜αŸ—αžαžΆαž˜αžšαž™αŸˆ Telegram (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹) αž αžΎαž™αžαžΆαž˜αžšαž™αŸˆ Zeppelin αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžšαžΌαž”αž—αžΆαž–αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Airflow αŸ”

αžŸαžšαž»αž”

Airflow αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αž‡αžΆαž…αž˜αŸ’αž”αž„ αž αžΎαž™αž’αŸ’αž“αž€αž˜αž·αž“αž‚αž½αžšαžšαŸ†αž–αžΉαž„αžαžΆαž“αžΉαž„αž˜αžΆαž“αž’αž–αŸ’αž—αžΌαžαž αŸαžαž»αž–αžΈαžœαžΆαž‘αŸαŸ” αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž–αŸαž›αžœαŸαž›αžΆ αž“αž·αž„αž€αžΆαžšαžαž·αžαžαŸ†αž”αŸ’αžšαžΉαž„αž”αŸ’αžšαŸ‚αž„αžŠαžΎαž˜αŸ’αž”αžΈαž€αžŸαžΆαž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž‚αŸ„αž›αžŠαŸ…αž‚αžΊαž’αžΆαž…αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“ αž‡αžΏαžαŸ’αž‰αž»αŸ† αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαŸ” αž›αŸ’αž”αžΏαž“αž“αŸƒαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž—αžΆαž–αž”αžαŸ‹αž”αŸ‚αž“αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸƒαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αž˜αžΈ - αž’αŸ’αž“αž€αž“αžΉαž„αž…αžΌαž›αž…αž·αžαŸ’αžαžœαžΆαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αž˜αŸ’αžšαŸ„αž„αžŸαŸ’αžαŸαžšαž—αžΆαž–αž“αŸƒαž›αŸ†αž αžΌαžšαžαŸ’αž™αž›αŸ‹αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„: αž’αž–αŸ’αž—αžΌαžαž αŸαžαž»αž˜αž·αž“αž€αžΎαžαž‘αžΎαž„αž‘αŸαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“ Airflow αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αžαŸ’αž„αŸƒ αž”αŸ’αžšαž αŸ‚αž› 6,5 αž–αžΆαž“αŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž…. αž–αž½αž€αž‚αŸαž˜αžΆαž“αž…αžšαž·αžαžαž»αžŸαž‚αŸ’αž“αžΆαžαŸ’αž›αžΆαŸ†αž„αŸ” αž˜αžΆαž“αž—αžΆαžšαž€αž·αž…αŸ’αž…αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„ DWH αž…αž˜αŸ’αž”αž„αž–αžΈαž”αŸ’αžšαž—αž–αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž“αž·αž„αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž”αŸ†αž•αž»αž αž˜αžΆαž“αž—αžΆαžšαž€αž·αž…αŸ’αž…αž‚αžŽαž“αžΆαž˜αž»αžαž‘αŸ†αž“αž·αž‰αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ DWH αžŸαŸ†αžαžΆαž“αŸ‹ αž˜αžΆαž“αž—αžΆαžšαž€αž·αž…αŸ’αž…αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„ DWH αž›αžΏαž“ αž˜αžΆαž“αž€αžΆαžšαž„αžΆαžšαž…αŸ’αžšαžΎαž“ αž…αŸ’αžšαžΎαž“αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αž“αž·αž„αž›αŸ†αž αžΌαžšαžαŸ’αž™αž›αŸ‹ αž‘αŸ†αž–αžΆαžšαžœαžΆαž–αŸαž‰αž˜αž½αž™αžαŸ’αž„αŸƒαŸ” αž“αž·αž™αžΆαž™β€‹αž‡αžΆβ€‹αž›αŸαžβ€‹αž‚αžΊβ€‹αž“αŸαŸ‡β€‹αž―αž„ αŸ₯្ αž˜αŸ‰αžΊαž“ αž—αžΆαžšαž€αž·αž…αŸ’αž… ELT αž“αŸƒαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ DWH (Hadoop) αž”αŸ’αžšαž αžΆαž€αŸ‹αž”αŸ’αžšαž αŸ‚αž›αŸ” αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ 2,5 αžšαž™ αž”αŸ’αžšαž—αž–, αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ’αžšαž»αž˜αž˜αž€αž–αžΈ 4 αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ ETLαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αž‘αŸ…αž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ ETL αž“αŸ…αž€αŸ’αž“αž»αž„ DWH αž“αž·αž„ ELT αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αž“αž»αž„ DWH αž“αž·αž„αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αž αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž˜αŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”

αž•αŸ‚αž“αž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αžΆαž‚αž

αž…αŸ†αž“αž½αž“αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ†αž–αž»αž„αž€αžΎαž“αž‘αžΎαž„αžŠαŸ„αž™αž‡αŸ€αžŸαž˜αž·αž“αžšαž½αž… αž αžΎαž™αžšαžΏαž„αžŸαŸ†αžαžΆαž“αŸ‹αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Airflow αž‚αžΊαž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αŸ” αž™αžΎαž„αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜ Airflow αž”αŸ‚αž„αž…αŸ‚αž€αž‡αžΎαž„αž˜αž½αž™αž‚αžΌαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αž€αžš Celery αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž€αŸ’αž”αžΆαž›αžŸαŸ’αž‘αž½αž“αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž€αžΆαž›αžœαž·αž—αžΆαž‚αž€αžΆαžšαž„αžΆαžš αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αŸ”

Epilogue

αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ†αž–αžΈ Airflow αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αŸ’αž™αžΆαž™αžΆαž˜αž‚αžΌαžŸαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ†αžŽαž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αŸ” αž…αŸ†αžŽαž„αŸ‹β€‹αž…αŸ†αžŽαžΌαž›β€‹αž…αž·αžαŸ’αžβ€‹αž˜αž€β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αž‰αŸ‰αžΆαŸ† αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αžœαžΆβ€‹αž αžΎαž™β€‹αž’αŸ’αž“αž€β€‹αž“αžΉαž„β€‹αž…αžΌαž›αž…αž·αžαŸ’αžβ€‹αžœαžΆ :)

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹