Airflow āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

Airflow āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

āļŠāļ§āļąāļŠāļ”āļĩāļŪāļąāļš! āđƒāļ™āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰ āļ‰āļąāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāļžāļđāļ”āļ„āļļāļĒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļĒāļ­āļ”āđ€āļĒāļĩāđˆāļĒāļĄāļ­āļĒāđˆāļēāļ‡āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒ āđ€āļŠāđˆāļ™ āđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ DWH āļ‚āļ­āļ‡āļ­āļ‡āļ„āđŒāļāļĢāļŦāļĢāļ·āļ­ DataLake āļ‚āļ­āļ‡āļ„āļļāļ“ āđ€āļĢāļēāļˆāļ°āļžāļđāļ”āļ–āļķāļ‡ Apache Airflow (āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļĩāļĒāļāļ§āđˆāļē Airflow) HabrÃĐ āļ–āļđāļāļ•āļąāļ”āļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāļ­āļĒāđˆāļēāļ‡āđ„āļĄāđˆāļĒāļļāļ•āļīāļ˜āļĢāļĢāļĄ āđāļĨāļ°āđƒāļ™āļŠāđˆāļ§āļ™āļŦāļĨāļąāļ āļ‰āļąāļ™āļˆāļ°āļžāļĒāļēāļĒāļēāļĄāđ‚āļ™āđ‰āļĄāļ™āđ‰āļēāļ§āļ„āļļāļ“āļ§āđˆāļēāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ Airflow āļāđ‡āļ„āļļāđ‰āļĄāļ„āđˆāļēāļ—āļĩāđˆāļˆāļ°āļ”āļđāđ€āļĄāļ·āđˆāļ­āđ€āļĨāļ·āļ­āļāļ•āļąāļ§āļāļģāļŦāļ™āļ”āđ€āļ§āļĨāļēāļŠāļģāļŦāļĢāļąāļšāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ ETL/ELT āļ‚āļ­āļ‡āļ„āļļāļ“

āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āļ‰āļąāļ™āđ€āļ‚āļĩāļĒāļ™āļšāļ—āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļŠāļļāļ”āđƒāļ™āļŦāļąāļ§āļ‚āđ‰āļ­ DWH āļ•āļ­āļ™āļ—āļĩāđˆāļ‰āļąāļ™āļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆ Tinkoff Bank āļ•āļ­āļ™āļ™āļĩāđ‰āļ‰āļąāļ™āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļ—āļĩāļĄ Mail.Ru Group āđāļĨāļ°āļāļģāļĨāļąāļ‡āļžāļąāļ’āļ™āļēāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļĨāđˆāļ™āđ€āļāļĄ āļˆāļĢāļīāļ‡āđ† āđāļĨāđ‰āļ§ āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļ‚āđˆāļēāļ§āļŠāļēāļĢāđāļĨāļ°āļ§āļīāļ˜āļĩāđāļāđ‰āļ›āļąāļāļŦāļēāļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™ āļ—āļĩāļĄāļ‚āļ­āļ‡āļ‰āļąāļ™āđāļĨāļ°āļ‰āļąāļ™āļˆāļ°āļžāļđāļ”āļ„āļļāļĒāļ—āļĩāđˆāļ™āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡āđ€āļĢāļēāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ‚āđ‰āļ­āļĄāļđāļĨ

āļ­āļēāļĢāļąāļĄāļ āļšāļ—

āđ€āļ­āļēāļĨāđˆāļ° āļĄāļēāđ€āļĢāļīāđˆāļĄāļāļąāļ™āđ€āļĨāļĒ āđāļ­āļĢāđŒāđ‚āļŸāļĨāļ§āđŒāļ„āļ·āļ­āļ­āļ°āđ„āļĢ? āļ™āļĩāđˆāļ„āļ·āļ­āļŦāđ‰āļ­āļ‡āļŠāļĄāļļāļ” (āļŦāļĢāļ·āļ­ āļŠāļļāļ”āļ‚āļ­āļ‡āļŦāđ‰āļ­āļ‡āļŠāļĄāļļāļ”) āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļē āļ§āļēāļ‡āđāļœāļ™ āđāļĨāļ°āļ•āļīāļ”āļ•āļēāļĄāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļŦāļĨāļąāļāļ‚āļ­āļ‡ Airflow: āļĢāļŦāļąāļŠ Python āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļ­āļ˜āļīāļšāļēāļĒ (āļžāļąāļ’āļ™āļē) āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļĄāļĩāļ‚āđ‰āļ­āļ”āļĩāļĄāļēāļāļĄāļēāļĒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļĢāļ°āđ€āļšāļĩāļĒāļšāđ‚āļ„āļĢāļ‡āļāļēāļĢāđāļĨāļ°āļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļ„āļļāļ“ āđ‚āļ”āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāđ‰āļ§ āđ‚āļ„āļĢāļ‡āļāļēāļĢ ETL āļ‚āļ­āļ‡āļ„āļļāļ“ (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡) āđ€āļ›āđ‡āļ™āđ€āļžāļĩāļĒāļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ Python āđāļĨāļ°āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļĢāļ°āđ€āļšāļĩāļĒāļšāđ„āļ”āđ‰āļ•āļēāļĄāļ—āļĩāđˆāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ‚āļ”āļĒāļ„āļģāļ™āļķāļ‡āļ–āļķāļ‡āļĨāļąāļāļĐāļ“āļ°āđ€āļ‰āļžāļēāļ°āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ āļ‚āļ™āļēāļ”āļ—āļĩāļĄ āđāļĨāļ° āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļ­āļ·āđˆāļ™ āđ† āđƒāļ™āļ—āļēāļ‡āļ”āļ™āļ•āļĢāļĩāļ—āļļāļāļ­āļĒāđˆāļēāļ‡āļāđ‡āđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒ āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ PyCharm + Git āļĄāļąāļ™āļ§āļīāđ€āļĻāļĐāļĄāļēāļāđāļĨāļ°āļŠāļ°āļ”āļ§āļāļŠāļšāļēāļĒāļĄāļēāļ!

āļ•āļ­āļ™āļ™āļĩāđ‰āđ€āļĢāļēāļĄāļēāļ”āļđāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāļ‚āļ­āļ‡ Airflow āļāļąāļ™ āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđƒāļˆāđāļāđˆāļ™āđāļ—āđ‰āđāļĨāļ°āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđāļĨāđ‰āļ§ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļĢāļ°āđ€āļšāļĩāļĒāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļĄāļ—āļĩāđˆāļŠāļļāļ” āļšāļēāļ‡āļ—āļĩāđ€āļ­āļ™āļ—āļīāļ•āļĩāļŦāļĨāļąāļāļ­āļēāļˆāđ€āļ›āđ‡āļ™ Directed Acyclic Graph (āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļĩāļĒāļāļ§āđˆāļē DAG)

DAG

DAG āļ„āļ·āļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ‡āļēāļ™āļ‚āļ­āļ‡āļ„āļļāļ“āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļŦāļĄāļēāļĒāļ‹āļķāđˆāļ‡āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļģāđƒāļŦāđ‰āđ€āļŠāļĢāđ‡āļˆāļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ„āļĢāđˆāļ‡āļ„āļĢāļąāļ”āļ•āļēāļĄāļāļģāļŦāļ™āļ”āļāļēāļĢāđ€āļ‰āļžāļēāļ° Airflow āļĄāļĩāđ€āļ§āđ‡āļšāļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļŸāļŠāļ—āļĩāđˆāļŠāļ°āļ”āļ§āļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļš DAG āđāļĨāļ°āđ€āļ­āļ™āļ—āļīāļ•āļĩāļ­āļ·āđˆāļ™āđ†:

Airflow āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

DAG āļ­āļēāļˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āđ€āļŠāđˆāļ™āļ™āļĩāđ‰:

Airflow āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

āđ€āļĄāļ·āđˆāļ­āļ­āļ­āļāđāļšāļš DAG āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ§āļēāļ‡āļŠāļļāļ”āļ‚āļ­āļ‡āļœāļđāđ‰āļ›āļāļīāļšāļąāļ•āļīāļ‡āļēāļ™āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ DAG āđ€āļĢāļēāļĄāļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ­āļĩāļāđāļŦāđˆāļ‡āļŦāļ™āļķāđˆāļ‡: Airflow Operator

āļœāļđāđ‰āļ›āļĢāļ°āļāļ­āļšāļāļēāļĢ

āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļ·āļ­āđ€āļ­āļ™āļ—āļīāļ•āļĩāļ•āļēāļĄāļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒāļ‡āļēāļ™āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡āļ­āļ˜āļīāļšāļēāļĒāļ–āļķāļ‡āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒāļ‡āļēāļ™ āļāļēāļĢāđ€āļœāļĒāđāļžāļĢāđˆ Airflow āļˆāļēāļ GitHub āļĄāļĩāļŠāļļāļ”āđ‚āļ­āđ€āļ›āļ­āđ€āļĢāđ€āļ•āļ­āļĢāđŒāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:

  • BashOperator - āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļģāļŠāļąāđˆāļ‡āļ—āļļāļšāļ•āļĩ
  • 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. āļŦāļēāļāļĄāļĩāļ„āļ·āđˆāļ™āļ‰āđˆāļēāļĒāļ„āļ™āļ‡āļēāļ™āļ­āļīāļŠāļĢāļ°āļ‡āļēāļ™āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āļĒāļąāļ‡āļ‡āļēāļ™āļ™āļąāđ‰āļ™ āļ‡āļēāļ™āļ—āļĩāđˆāļ„āļļāļ“āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ§āđ‰āđƒāļ™āļ›āļąāļāļŦāļēāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ­āļĒāđˆāļēāļ‡āđƒāļ”āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļķāđˆāļ‡

āļ‡āđˆāļēāļĒāļžāļ­

āļ•āļąāļ§āļāļģāļŦāļ™āļ”āđ€āļ§āļĨāļēāļ—āļģāļ‡āļēāļ™āļšāļ™āļŠāļļāļ”āļ‚āļ­āļ‡ DAG āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāļ°āļ‡āļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™ DAG

āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ 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 āļŠāļēāļĄāļŠāļēāļĢāđŒāļ”āđ€āļ›āđ‡āļ™āđāļŦāļĨāđˆāļ‡āļ—āļĩāđˆāļĄāļē āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļ›āļĩāļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāļēāļĢāđŒāļ”āđāļĨāļ°āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļšāļēāļ‡āļŠāđˆāļ§āļ™ āļĒāļīāđˆāļ‡āļāļ§āđˆāļēāļ™āļąāđ‰āļ™āļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ­āļīāļŠāļĢāļ°āđāļĨāļ°āļ„āļđāđˆāļ‚āļ™āļēāļ™āļāļąāļ™ āļĢāļŦāļąāļŠ 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 āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

āđƒāļ™āļāļĢāļ“āļĩāļ™āļĩāđ‰ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļŦāļĢāļ·āļ­āļĨāļšāļŠāļēāļĢāđŒāļ”āđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ›āļĢāļąāļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļ­āļąāļ›āđ€āļ”āļ• DAG āļŠāļ°āļ”āļ§āļāļŠāļšāļēāļĒ!

āļ„āļļāļ“āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ‚āļķāđ‰āļ™āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ āļ—āļģāļ‡āļēāļ™āļāļąāļšāđāļŦāļĨāđˆāļ‡āļ—āļĩāđˆāļĄāļēāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āļ­āļ˜āļīāļšāļēāļĒāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļšāļ•āļēāļĢāļēāļ‡ āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āļ„āļģāļ™āļķāļ‡āļ–āļķāļ‡āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ DWH āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ‚āļŦāļĨāļ” N āļ•āļēāļĢāļēāļ‡āļĨāļ‡āđƒāļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļ„āļļāļ“ āļŦāļĢāļ·āļ­ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļš API āļ—āļĩāđˆāđ„āļĄāđˆāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļšāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļĢāļēāļĒāļāļēāļĢ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ‡āļēāļ™ N āļ‡āļēāļ™āđƒāļ™ DAG āļˆāļēāļāļĢāļēāļĒāļāļēāļĢāļ™āļĩāđ‰ āļˆāļģāļāļąāļ”āļ„āļ§āļēāļĄāļ‚āļ™āļēāļ™āļ‚āļ­āļ‡āļ„āļģāļ‚āļ­āđƒāļ™ API āđ„āļ§āđ‰āļ—āļĩāđˆāļžāļđāļĨ āđāļĨāļ°āļ‚āļđāļ” āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļēāļ API āļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āđ„āļ”āđ‰!

āļ—āļĩāđˆāđ€āļāđ‡āļš

Airflow āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāđ‡āļāđ€āļ­āļ™āļ”āđŒāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (āļ­āļēāļˆāđ€āļ›āđ‡āļ™ MySQL āļŦāļĢāļ·āļ­ Postgres āđ€āļĢāļēāļĄāļĩ Postgres) āļ‹āļķāđˆāļ‡āļˆāļąāļ”āđ€āļāđ‡āļšāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ‡āļēāļ™, DAG, āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­, āļ•āļąāļ§āđāļ›āļĢāļŠāđˆāļ§āļ™āļāļĨāļēāļ‡ āļŊāļĨāļŊ āļŊāļĨāļŊ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰ āļ‰āļąāļ™āļ­āļĒāļēāļāļˆāļ°āļšāļ­āļāļ§āđˆāļē āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Airflow āļ™āļąāđ‰āļ™āļ‡āđˆāļēāļĒāļĄāļēāļ (āļ›āļĢāļ°āļĄāļēāļ“ 20 āļ•āļēāļĢāļēāļ‡) āđāļĨāļ°āļŠāļ°āļ”āļ§āļāļ–āđ‰āļēāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ‚āļ­āļ‡āļ„āļļāļ“āđ€āļ­āļ‡āļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļ™āļąāđ‰āļ™ āļ‰āļąāļ™āļˆāļģāļ•āļēāļĢāļēāļ‡ 100500 āļ•āļēāļĢāļēāļ‡āđƒāļ™āļ—āļĩāđˆāđ€āļāđ‡āļš Informatica āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāđ€āļ›āđ‡āļ™āđ€āļ§āļĨāļēāļ™āļēāļ™āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļŠāļĢāđ‰āļēāļ‡āđāļšāļšāļŠāļ­āļšāļ–āļēāļĄ

āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš

āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ„āļ§āļēāļĄāđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒāļ‚āļ­āļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‡āļēāļ™āļ—āļĩāđˆāļŠāļ°āļ”āļ§āļāļŠāļģāļŦāļĢāļąāļšāļ„āļļāļ“āđ„āļ”āđ‰ āđ€āļĢāļēāđƒāļŠāđ‰āđāļœāđˆāļ™āļˆāļ”āļšāļąāļ™āļ—āļķāļāđƒāļ™ Zeppelin āđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ‡āļēāļ™:

Airflow āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

āļ™āļĩāđˆāļ­āļēāļˆāđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļŸāļŠāļ‚āļ­āļ‡ Airflow āđ€āļ­āļ‡:

Airflow āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđāļšāļ•āļŠāđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

āļĢāļŦāļąāļŠ Airflow āđ€āļ›āđ‡āļ™āđ‚āļ­āđ€āļžāđˆāļ™āļ‹āļ­āļĢāđŒāļŠ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĢāļēāļˆāļķāļ‡āđ€āļžāļīāđˆāļĄāļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđ„āļ›āļĒāļąāļ‡ Telegram āļŦāļēāļāđ€āļāļīāļ”āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” āđāļ•āđˆāļĨāļ°āļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļˆāļ°āļŠāđāļ›āļĄāļāļĨāļļāđˆāļĄāđƒāļ™ Telegram āļ‹āļķāđˆāļ‡āļ—āļĩāļĄāļžāļąāļ’āļ™āļēāđāļĨāļ°āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ

āđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļšāļ—āļąāļ™āļ—āļĩāļœāđˆāļēāļ™āļ—āļēāļ‡ Telegram (āļŦāļēāļāļˆāļģāđ€āļ›āđ‡āļ™) āđāļĨāļ°āļœāđˆāļēāļ™āļ—āļēāļ‡ Zeppelin āđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡āļ‡āļēāļ™āđƒāļ™ Airflow

āđ€āļšāđ‡āļ”āđ€āļŠāļĢāđ‡āļˆ

Airflow āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđ€āļ›āđ‡āļ™āđ‚āļ­āđ€āļžāđˆāļ™āļ‹āļ­āļĢāđŒāļŠ āđāļĨāļ°āļ„āļļāļ“āđ„āļĄāđˆāļ„āļ§āļĢāļ„āļēāļ”āļŦāļ§āļąāļ‡āļ–āļķāļ‡āļ›āļēāļāļīāļŦāļēāļĢāļīāļĒāđŒāļˆāļēāļāļŠāļīāđˆāļ‡āļ™āļĩāđ‰ āđ€āļ•āļĢāļĩāļĒāļĄāļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļŠāļĨāļ°āđ€āļ§āļĨāļēāđāļĨāļ°āļ„āļ§āļēāļĄāļžāļĒāļēāļĒāļēāļĄāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ‹āļĨāļđāļŠāļąāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļœāļĨ āļšāļĢāļĢāļĨāļļāđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒāđ„āļ”āđ‰ āđ€āļŠāļ·āđˆāļ­āļ‰āļąāļ™āļŠāļī āļĄāļąāļ™āļ„āļļāđ‰āļĄāļ„āđˆāļē āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē āļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™ āļ„āļ§āļēāļĄāļ‡āđˆāļēāļĒāđƒāļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāđƒāļŦāļĄāđˆ - āļ„āļļāļ“āļˆāļ°āļŠāļ­āļšāļĄāļąāļ™ āđāļ™āđˆāļ™āļ­āļ™āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļāļąāļšāļāļēāļĢāļˆāļąāļ”āđ‚āļ„āļĢāļ‡āļāļēāļĢāļ„āļ§āļēāļĄāļĄāļąāđˆāļ™āļ„āļ‡āļ‚āļ­āļ‡ Airflow āđ€āļ­āļ‡: āļ›āļēāļāļīāļŦāļēāļĢāļīāļĒāđŒāļˆāļ°āđ„āļĄāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™

āļ•āļ­āļ™āļ™āļĩāđ‰āđ€āļĢāļēāļĄāļĩ Airflow āļ—āļģāļ‡āļēāļ™āļ—āļļāļāļ§āļąāļ™ āļ›āļĢāļ°āļĄāļēāļ“ 6,5 āļžāļąāļ™āļ‡āļēāļ™. āļžāļ§āļāđ€āļ‚āļēāļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ•āļąāļ§āļĨāļ°āļ„āļĢ āļĄāļĩāļ‡āļēāļ™āđƒāļ™āļāļēāļĢāđ‚āļŦāļĨāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ DWH āļŦāļĨāļąāļāļˆāļēāļāđāļŦāļĨāđˆāļ‡āļ—āļĩāđˆāļĄāļēāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđāļĨāļ°āđ€āļ‰āļžāļēāļ°āđ€āļˆāļēāļ°āļˆāļ‡ āļĄāļĩāļ‡āļēāļ™āļ„āļģāļ™āļ§āļ“āļŦāļ™āđ‰āļēāļĢāđ‰āļēāļ™āļ āļēāļĒāđƒāļ™ DWH āļŦāļĨāļąāļ āļĄāļĩāļ‡āļēāļ™āđ€āļœāļĒāđāļžāļĢāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ DWH āļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļĄāļĩāļ‡āļēāļ™āļĄāļēāļāļĄāļēāļĒ - āđāļĨāļ° Airflow āđ€āļ„āļĩāđ‰āļĒāļ§āļĄāļąāļ™āļˆāļ™āļŦāļĄāļ”āļ§āļąāļ™āđāļĨāđ‰āļ§āļ§āļąāļ™āđ€āļĨāđˆāļē āļžāļđāļ”āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ‚āļ™āļĩāđˆāļ„āļ·āļ­ 2,3 āļžāļąāļ™ āļ‡āļēāļ™ ELT āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ•āđˆāļēāļ‡āļāļąāļ™āļ āļēāļĒāđƒāļ™ DWH (Hadoop) āļ›āļĢāļ°āļĄāļēāļ“ 2,5 āļĢāđ‰āļ­āļĒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļŦāļĨāđˆāļ‡āļ—āļĩāđˆāļĄāļēāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļ—āļĩāļĄāļ‡āļēāļ™āļˆāļēāļ āļ™āļąāļāļžāļąāļ’āļ™āļē ETL 4 āļ„āļ™āļ‹āļķāđˆāļ‡āđāļšāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨ ETL āđƒāļ™ DWH āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨ ELT āļ āļēāļĒāđƒāļ™ DWH āđāļĨāļ°āđāļ™āđˆāļ™āļ­āļ™āļĄāļēāļāļāļ§āđˆāļēāļ™āļąāđ‰āļ™ āļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļ„āļ™āļŦāļ™āļķāđˆāļ‡āļ‹āļķāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāļšāļĢāļīāļāļēāļĢ

āđāļœāļ™āļŠāļģāļŦāļĢāļąāļšāļ­āļ™āļēāļ„āļ•

āļˆāļģāļ™āļ§āļ™āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ­āļĒāđˆāļēāļ‡āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰ āđāļĨāļ°āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļ—āļĩāđˆāđ€āļĢāļēāļˆāļ°āļ—āļģāđƒāļ™āđāļ‡āđˆāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ Airflow āļ„āļ·āļ­āļāļēāļĢāļ›āļĢāļąāļšāļ‚āļ™āļēāļ” āđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļąāļŠāđ€āļ•āļ­āļĢāđŒ Airflow āļˆāļąāļ”āļŠāļĢāļĢāļ‚āļēāļ„āļđāđˆāļŦāļ™āļķāđˆāļ‡āđƒāļŦāđ‰āļāļąāļšāļžāļ™āļąāļāļ‡āļēāļ™ Celery āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŠāđˆāļ§āļ™āļŦāļąāļ§āļ—āļĩāđˆāļ—āļģāļ‹āđ‰āļģāđƒāļ™āļ•āļąāļ§āđ€āļ­āļ‡āļ”āđ‰āļ§āļĒāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āđ€āļ§āļĨāļēāļ‡āļēāļ™āđāļĨāļ°āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ

āļ–āđ‰āļ­āļĒāļ„āļģāļŠ

āđāļ™āđˆāļ™āļ­āļ™āļ§āđˆāļēāļ™āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāļ—āļļāļāļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ‰āļąāļ™āļ­āļĒāļēāļāļˆāļ°āļšāļ­āļāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Airflow āđāļ•āđˆāļ‰āļąāļ™āļžāļĒāļēāļĒāļēāļĄāđ€āļ™āđ‰āļ™āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļŦāļĨāļąāļ āļ„āļ§āļēāļĄāļ­āļĒāļēāļāļ­āļēāļŦāļēāļĢāļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāļāļēāļĢāļāļīāļ™ āļĨāļ­āļ‡āđāļĨāđ‰āļ§āļˆāļ°āļ•āļīāļ”āđƒāļˆ :)

āļ—āļĩāđˆāļĄāļē: will.com

āļ‹āļ·āđ‰āļ­āđ‚āļŪāļŠāļ•āļīāđ‰āļ‡āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ„āļ”āđ‰āļŠāļģāļŦāļĢāļąāļšāđ„āļ‹āļ•āđŒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ DDoS āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ VPS VDS ðŸ”Ĩ āļ‹āļ·āđ‰āļ­āļšāļĢāļīāļāļēāļĢāđ€āļ§āđ‡āļšāđ‚āļŪāļŠāļ•āļīāđ‰āļ‡āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ„āļ”āđ‰ āļžāļĢāđ‰āļ­āļĄāļĢāļ°āļšāļšāļ›āđ‰āļ­āļ‡āļāļąāļ™ DDoS āđāļĨāļ°āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ VPS/VDS | ProHoster