рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рдирдорд╕реНрддреЗ, Habr! рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдкрдХрд░рдгрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХрд░реНрдкреЛрд░реЗрдЯ DWH рд╡рд╛ рддрдкрд╛рдИрдВрдХреЛ DataLake рдХреЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдорд╛ред рд╣рд╛рдореА Apache Airflow рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ (рдпрд╕рд▓рд╛рдИ рдкрдЫрд┐ Airflow рднрдирд┐рдиреНрдЫ)ред рдпреЛ рдЕрдиреБрдЪрд┐рдд рд░реВрдкрдорд╛ Habr├й рдорд╛ рдзреНрдпрд╛рдирдмрд╛рдЯ рд╡рдЮреНрдЪрд┐рдд рдЫ, рд░ рдореБрдЦреНрдп рднрд╛рдЧрдорд╛ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╡рд┐рд╢реНрд╡рд╕реНрдд рдЧрд░рд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреБ рдХрд┐ рдХрдореНрддрд┐рдорд╛ рдПрдпрд░рдлреНрд▓реЛ рддрдкрд╛рдИрдХреЛ ETL/ELT рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрд╕реВрдЪрдХ рдЫрдиреМрдЯ рдЧрд░реНрджрд╛ рд╣реЗрд░реНрди рд▓рд╛рдпрдХ рдЫред

рдкрд╣рд┐рд▓реЗ, рдореИрд▓реЗ рдЯрд┐рдЩреНрдХрдл рдмреИрдВрдХрдорд╛ рдХрд╛рдо рдЧрд░реНрджрд╛ DWH рдХреЛ рд╡рд┐рд╖рдпрдорд╛ рд▓реЗрдЦрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓реЗрдЦреЗрдХреЛ рдерд┐рдПрдБред рдЕрдм рдо Mail.Ru рд╕рдореВрд╣ рдЯреЛрд▓реАрдХреЛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдиреЗрдХреЛ рдЫреБ рд░ рдЧреЗрдорд┐рдЩ рдХреНрд╖реЗрддреНрд░рдорд╛ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрджреИрдЫреБред рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╕рдорд╛рдЪрд╛рд░ рд░ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рджреЗрдЦрд╛ рдкрд░реНрджрд╛, рдореЗрд░реЛ рдЯреЛрд▓реА рд░ рдо рдпрд╣рд╛рдБ рдбрд╛рдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореНрд░реЛ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛

рддреНрдпрд╕реИрд▓реЗ, рд╕реБрд░реБ рдЧрд░реМрдВред рд╡рд╛рдпреБ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╣реЛ? рдпреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛ (рд╡рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реЗрдЯ) рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕, рдпреЛрдЬрдирд╛ рд░ рдЕрдиреБрдЧрдорди рдЧрд░реНрдиред рдПрдпрд░рдлреНрд▓реЛрдХреЛ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛: рдкрд╛рдЗрдерди рдХреЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ (рд╡рд┐рдХрд╛рд╕) рд╡рд░реНрдгрди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░ рд╡рд┐рдХрд╛рд╕рд▓рд╛рдИ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдпрд╕рдХрд╛ рдзреЗрд░реИ рдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН: рд╕рдВрдХреНрд╖реЗрдкрдорд╛, рддрдкрд╛рдИрдВрдХреЛ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐) ETL рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рдЗрдерди рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ, рд░ рддрдкрд╛рдИрдВрд▓реЗ рдкреВрд░реНрд╡рд╛рдзрд╛рд░, рдЯреЛрд▓реАрдХреЛ рдЖрдХрд╛рд░ рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рд╣рд░реВрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреЗрд░ рдпрд╕рд▓рд╛рдИ рдЖрдлреНрдиреЛ рдЗрдЪреНрдЫрд╛ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реБред рдЗрдиреНрд╕реНрдЯреНрд░реБрдореЗрдиреНрдЯрд▓реА рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА PyCharm + Git рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпреЛ рдЕрджреНрднреБрдд рд░ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ!

рдЕрдм Airflow рдХреЛ рдореБрдЦреНрдп рд╕рдВрд╕реНрдерд╛рд╣рд░реБ рд▓рд╛рдИ рд╣реЗрд░реМрдВред рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рд╛рд░ рд░ рдЙрджреНрджреЗрд╢реНрдп рдмреБрдЭреЗрд░, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рд▓рд╛рдИ рдЙрддреНрддрдо рд░реВрдкрдорд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╕рд╛рдпрдж рдореБрдЦреНрдп рдЗрдХрд╛рдИ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл рд╣реЛ (рдпрд╕рдкрдЫрд┐ DAG рднрдирд┐рдиреНрдЫ)ред

DAG

рдПрдХ DAG рддрдкрд╛рдЗрдБрдХреЛ рдХрд╛рд░реНрдпрд╣рд░реБ рдХреЛ рдХреЗрд╣рд┐ рдЕрд░реНрдердкреВрд░реНрдг рд╕рдВрдШ рд╣реЛ рдЬреБрди рддрдкрд╛рдЗрдБ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕рдЦреНрдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдиреБрдХреНрд░рдо рдорд╛ рдкреВрд░рд╛ рдЧрд░реНрди рдЪрд╛рд╣рд╛рдиреБрд╣реБрдиреНрдЫред рдПрдпрд░рдлреНрд▓реЛрд▓реЗ DAGs рд░ рдЕрдиреНрдп рдирд┐рдХрд╛рдпрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

DAG рдпрд╕реНрддреЛ рджреЗрдЦрд┐рди рд╕рдХреНрдЫ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ DAG рдбрд┐рдЬрд╛рдЗрди рдЧрд░реНрджрд╛, DAG рднрд┐рддреНрд░рдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░рд┐рдиреЗ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдХреЛ рд╕реЗрдЯ рд░рд╛рдЦреНрдЫред рдпрд╣рд╛рдБ рд╣рд╛рдореА рдЕрд░реНрдХреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╕реНрдерд╛рдорд╛ рдЖрдЙрдБрдЫреМрдВ: рд╡рд╛рдпреБрдкреНрд░рд╡рд╛рд╣ рдЕрдкрд░реЗрдЯрд░ред

рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ

рдПрдХ рдЕрдкрд░реЗрдЯрд░ рдПрдХ рд╕рдВрд╕реНрдерд╛ рд╣реЛ рдЬрд╕рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫ, рдЬрд╕рд▓реЗ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдгрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдХреНрд░рдордорд╛ рдХреЗ рд╣реБрдиреЗрдЫ рднрдиреЗрд░ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫред GitHub рдмрд╛рдЯ рдПрдпрд░рдлреНрд▓реЛ рд░рд┐рд▓реАрдЬ рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рддрдпрд╛рд░ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдХреЛ рд╕реЗрдЯ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ:

  • BashOperator - bash рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдЕрдкрд░реЗрдЯрд░ред
  • PythonOperator - рдкрд╛рдЗрдерди рдХреЛрдб рдХрд▓ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░ред
  • рдЗрдореЗрд▓ рдЕрдкрд░реЗрдЯрд░ - рдЗрдореЗрд▓ рдкрдард╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░ред
  • HTTPOperator - http рдЕрдиреБрд░реЛрдзрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрдкрд░реЗрдЯрд░ред
  • SqlOperator - SQL рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдЕрдкрд░реЗрдЯрд░ред
  • рд╕реЗрдиреНрд╕рд░ рдШрдЯрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреЗ рдЕрдкрд░реЗрдЯрд░ рд╣реЛ (рдЖрд╡рд╢реНрдпрдХ рд╕рдордпрдХреЛ рдЖрдЧрдорди, рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓рдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐, рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рд▓рд╛рдЗрди, API рдмрд╛рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдЖрджрд┐ред)ред

рддреНрдпрд╣рд╛рдБ рдердк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рдЫрдиреН: DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperatorред

рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рдЖрдлреНрдиреИ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реБ рдХреЛ рдЖрдзрд╛рд░ рдорд╛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реБ рдХреЛ рд╡рд┐рдХрд╛рд╕ рд░ рддрдкрд╛рдЗрдБрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ MongoDBToHiveViaHdfsTransfer, MongoDB рдмрд╛рдЯ Hive рдорд╛ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рдирд┐рд░реНрдпрд╛рдд рдЧрд░реНрдиреЗ рдЕрдкрд░реЗрдЯрд░, рд░ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕: CHLoadFromHiveOperator рд░ CHTableLoaderOperatorред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдкрдорд╛, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓реЗ рдкреНрд░рд╛рдп: рдЖрдзрд╛рд░рднреВрдд рдХрдердирд╣рд░реВрдорд╛ рдирд┐рд░реНрдорд┐рдд рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдмрд┐рддреНрддрд┐рдХреИ, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдирдпрд╛рдБ рдХрдердирдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рд╕реЛрдЪреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╕рд▓реЗ рдердк рд╡рд┐рдХрд╛рд╕рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдиреЗрдЫ, рд░ рддрдкрд╛рдИрдВрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрд░рд╣реЗрдХрд╛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫред

рдЕрд░реНрдХреЛ, рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдпреА рд╕рдмреИ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдЕрдм рд╣рд╛рдореА рдЕрдиреБрд╕реВрдЪрдХрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рдЕрдиреБрд╕реВрдЪреАрдХрд░реНрддрд╛

Airflow рдХреЛ рдХрд╛рд░реНрдп рд╢реЗрдбреНрдпреВрд▓рд░ рдорд╛ рдирд┐рд░реНрдорд┐рдд рдЫ рдЕрдЬрд╡рд╛рдЗрдиред рд╕реЗрд▓реЗрд░реА рдПрдХ рдкрд╛рдЗрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд░ рд╡рд┐рддрд░рдг рдЧрд░рд┐рдПрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд╛рдИ рд▓рд╛рдо рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдПрдпрд░рдлреНрд▓реЛ рдкрдХреНрд╖рдорд╛, рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ рдкреВрд▓рд╣рд░реВрдорд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЫрдиреНред рдкреЛрдЦрд░реАрд╣рд░реВ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрд░реЛрддрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрднрд╛рд░рд▓рд╛рдИ рд╕реАрдорд┐рдд рдЧрд░реНрдиреБ рд╡рд╛ DWH рднрд┐рддреНрд░ рдХрд╛рд░реНрдпрд╣рд░реВ рдЯрд╛рдЗрдк рдЧрд░реНрдиреБ рд╣реЛред рдкреВрд▓рд╣рд░реВ рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕ рдорд╛рд░реНрдлрдд рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рдкреНрд░рддреНрдпреЗрдХ рдкреВрд▓рдорд╛ рд╕реНрд▓рдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рд╕реАрдорд╛ рдЫред 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 рд╕реНрддрд░рдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреВрд▓ рдХрд╛рд░реНрдп рд╕реНрддрд░рдорд╛ рдУрднрд░рд░рд╛рдЗрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
рдПрдЙрдЯрд╛ рдЫреБрдЯреНрдЯреИ рдкреНрд░рдХреНрд░рд┐рдпрд╛, рд╢реЗрдбреНрдпреБрд▓рд░, рдПрдпрд░рдлреНрд▓реЛрдорд╛ рднрдПрдХрд╛ рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдЙрди рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рд╣реБрдиреНрдЫред рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╢реЗрдбреНрдпреБрд▓рд░рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдпрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрдиреЗ рд╕рдмреИ рдореЗрдХрд╛рдирд┐рдХрд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдЭреМрддрд╛ рдЧрд░реНрджрдЫред рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреБ рдЕрдШрд┐ рдзреЗрд░реИ рдЪрд░рдгрд╣рд░реВ рдорд╛рд░реНрдлрдд рдЬрд╛рдиреНрдЫ:

  1. рдбреАрдПрдЬреАрдорд╛ рдкрд╣рд┐рд▓реЗрдХрд╛ рдХрд╛рдорд╣рд░реВ рдкреВрд░рд╛ рднрдЗрд╕рдХреЗрдХрд╛ рдЫрдиреН, рдирдпрд╛рдБ рд▓рд╛рдЗрдирдорд╛ рд░рд╛рдЦреНрди рд╕рдХрд┐рдиреНрдЫред
  2. рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдХреЛ рдЖрдзрд╛рд░рдорд╛ рд▓рд╛рдо рдХреНрд░рдордмрджреНрдз рдЧрд░рд┐рдПрдХреЛ рдЫ (рдкреНрд░рд╛рдердорд┐рдХрддрд╛рд╣рд░реВ рдкрдирд┐ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ), рд░ рдпрджрд┐ рдкреВрд▓рдорд╛ рдирд┐: рд╢реБрд▓реНрдХ рд╕реНрд▓рдЯ рдЫ рднрдиреЗ, рдХрд╛рд░реНрдп рд╕рдЮреНрдЪрд╛рд▓рдирдорд╛ рд▓рд┐рди рд╕рдХрд┐рдиреНрдЫред
  3. рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗрд▓реЗрд░реА рдЫ рднрдиреЗ, рдХрд╛рд░реНрдп рдпрд╕рд▓рд╛рдИ рдкрдард╛рдЗрдиреНрдЫ; рддрдкрд╛рдИрдВрд▓реЗ рд╕рдорд╕реНрдпрд╛рдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЧрд░реНрдиреБрднрдПрдХреЛ рдХрд╛рдо рдПрдХ рд╡рд╛ рдЕрд░реНрдХреЛ рдЕрдкрд░реЗрдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕реБрд░реБ рд╣реБрдиреНрдЫред

рдкрд░реНрдпрд╛рдкреНрдд рд╕рд░рд▓ред

рд╢реЗрдбреНрдпреБрд▓рд░ рд╕рдмреИ DAGs рд░ DAG рднрд┐рддреНрд░рдХрд╛ рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реЗрдЯрдорд╛ рдЪрд▓реНрдЫред

DAG рд╕рдБрдЧ рдХрд╛рдо рд╕реБрд░реБ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, DAG рд▓реЗ рд╕рдордпрддрд╛рд▓рд┐рдХрд╛ рд╕реЗрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

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

рддреНрдпрд╣рд╛рдБ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдкреНрд░рд┐рд╕реЗрдЯрд╣рд░реВрдХреЛ рд╕реЗрдЯ рдЫ: @once, @hourly, @daily, @weekly, @monthly, @yearly.

рддрдкрд╛рдИрдВ рдХреНрд░реЛрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐

рдПрдпрд░рдлреНрд▓реЛрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐, DAG рдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐ рдХреЗ рд╣реЛ рднрдиреЗрд░ рдмреБрдЭреНрди рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред рдПрдпрд░рдлреНрд▓реЛрдорд╛, DAG рд╕рдБрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐ рдЖрдпрд╛рдо рд╣реБрдиреНрдЫ, рдЕрд░реНрдерд╛рддреН, DAG рдХреЛ рдХрд╛рд░реНрдп рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЖрдзрд╛рд░рдорд╛, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫред рд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐, рдХрд╛рд░реНрдпрд╣рд░реВ рдкреБрди: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ - рд╡рд╛, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, DAG рд▓реЗ рдзреЗрд░реИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐рд╣рд░реВрдорд╛ рдПрдХреИ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдЫред рдпреЛ рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдЫ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢ (рд╡рд╛ рд╣реБрдирд╕рдХреНрдЫ рд╕реМрднрд╛рдЧреНрдпрд╡рд╢: рдпреЛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫ), рдпрджрд┐ DAG рдорд╛ рдХрд╛рд░реНрдпрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдЪреНрдпрд╛рдЗрдпреЛ рднрдиреЗ, рдЕрдШрд┐рд▓реНрд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рддрд┐рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╛рдпреЛрдЬрдирд╣рд░реВрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреЗрд░ рдЕрдЧрд╛рдбрд┐ рдмрдвреНрдиреЗрдЫред рдпреЛ рд░рд╛рдореНрд░реЛ рдЫ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдирдпрд╛рдБ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд┐рдЧрддрдХрд╛ рдЕрд╡рдзрд┐рд╣рд░реВрдорд╛ рдбреЗрдЯрд╛ рдкреБрди: рдЧрдгрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддрд░ рдпреЛ рдирд░рд╛рдореНрд░реЛ рдЫ рдХрд┐рдирднрдиреЗ рдкрд░рд┐рдгрд╛рдордХреЛ рдкреБрди: рдЙрддреНрдкрд╛рджрди рдХреНрд╖рдорддрд╛ рд╣рд░рд╛рдПрдХреЛ рдЫ (рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдХрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ Git рдмрд╛рдЯ рд╕реНрд░реЛрдд рдХреЛрдбрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг рдлрд┐рд░реНрддрд╛ рдЧрд░реНрди рд░ рдХреЗ рдЧрдгрдирд╛ рдЧрд░реНрди рдкрд░реЗрд╢рд╛рди рдЧрд░реНрджреИрдиред рддрдкрд╛рдИрд▓рд╛рдИ рдПрдХ рдкрдЯрдХ рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬрд╕рд░реА рддрдкрд╛рдИрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдЫ)ред

рдХрд╛рд░реНрдпрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджреИ

DAG рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдЗрдердирдорд╛ рдХреЛрдб рд╣реЛ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛ рдХреЛрдбрдХреЛ рдорд╛рддреНрд░рд╛ рдШрдЯрд╛рдЙрдиреЗ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░рд┐рдХрд╛ рдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЫрд╛рдпрд╛рджрд╛рд░ рд╕реНрд░реЛрддрд╣рд░реВрд╕рдБрдЧред рдорд╛рдиреМрдВ рддрдкрд╛рдИрдВрд╕рдБрдЧ рд╕реНрд░реЛрддрдХреЛ рд░реВрдкрдорд╛ рддреАрди MySQL рд╢рд╛рд░реНрдбрд╣рд░реВ рдЫрдиреН, рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХрдорд╛ рдЪрдвреНрди рд░ рдХреЗрд╣реА рдбрд╛рдЯрд╛ рдЙрдард╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, рд╕реНрд╡рддрдиреНрддреНрд░ рд░ рд╕рдорд╛рдирд╛рдиреНрддрд░ рд░реВрдкрдорд╛ред 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 рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддрдкрд╛рдЗрдБ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рд╕рдорд╛рдпреЛрдЬрди рдЧрд░реЗрд░ рд░ DAG рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реЗрд░ рд╢рд╛рд░реНрдб рдердкреНрди рд╡рд╛ рд╣рдЯрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЖрд░рд╛рдорджрд╛рдпреА!

рддрдкрд╛рдИрд▓реЗ рдердк рдЬрдЯрд┐рд▓ рдХреЛрдб рдЙрддреНрдкрд╛рджрди рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдбрд╛рдЯрд╛рдмреЗрд╕рдХреЛ рд░реВрдкрдорд╛ рд╕реНрд░реЛрддрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╡рд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рд╡рд░реНрдгрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рддрд╛рд▓рд┐рдХрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рд░ DWH рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреЗрд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рддрдкрд╛рдИрдВрдХреЛ рднрдгреНрдбрд╛рд░рдгрдорд╛ N рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд▓реЛрдб рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ред рд╡рд╛, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдПрдкреАрдЖрдИрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЬрд╕рд▓реЗ рд╕реВрдЪреАрдХреЛ рд░реВрдкрдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди, рддрдкрд╛рдЗрдБ рдпрд╕ рд╕реВрдЪреАрдмрд╛рдЯ DAG рдорд╛ N рдХрд╛рд░реНрдпрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдПрдкреАрдЖрдИрдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╕рдорд╛рдирд╛рдиреНрддрд░рд▓рд╛рдИ рдкреВрд▓рдорд╛ рд╕реАрдорд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕реНрдХреНрд░реНрдпрд╛рдк рдЧрд░реНрдиреБрд╣реЛрд╕реНред API рдмрд╛рдЯ рдЖрд╡рд╢реНрдпрдХ рдбрд╛рдЯрд╛ред рд▓рдЪрд┐рд▓реЛ!

рднрдгреНрдбрд╛рд░

рдПрдпрд░рдлреНрд▓реЛрдХреЛ рдЖрдлреНрдиреИ рдмреНрдпрд╛рдХрдЗрдиреНрдб рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдЫ, рдбрд╛рдЯрд╛рдмреЗрд╕ (MySQL рд╡рд╛ Postgres рд╣реБрди рд╕рдХреНрдЫ, рд╣рд╛рдореАрд╕рдБрдЧ Postgres рдЫ), рдЬрд╕рд▓реЗ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдЕрд╡рд╕реНрдерд╛, DAGs, рдЬрдбрд╛рди рд╕реЗрдЯрд┐рдЩрд╣рд░реВ, рдЧреНрд▓реЛрдмрд▓ рдЪрд░рд╣рд░реВ, рдЗрддреНрдпрд╛рджрд┐ рднрдгреНрдбрд╛рд░ рдЧрд░реНрджрдЫред рдпрд╣рд╛рдБ рдо рднрдиреНрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ Airflow рдорд╛ рднрдгреНрдбрд╛рд░ рдзреЗрд░реИ рд╕рд░рд▓ рдЫ (рд▓рдЧрднрдЧ 20 рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ) рд░ рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпрд╕рдХреЛ рд╢реАрд░реНрд╖рдорд╛ рддрдкрд╛рдЗрдБрдХреЛ рдЖрдлреНрдиреИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫред рдорд▓рд╛рдИ рдЗрдиреНрдлрд░реНрдореЗрдЯрд┐рдХрд╛ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрдорд╛ 100500 рдЯреЗрдмрд▓рд╣рд░реВ рдпрд╛рдж рдЫ, рдЬреБрди рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗ рднрдиреЗрд░ рдмреБрдЭреНрди рдЕрдШрд┐ рд▓рд╛рдореЛ рд╕рдордпрд╕рдореНрдо рдЕрдзреНрдпрдпрди рдЧрд░реНрдиреБрдкрд░реНрдереНрдпреЛред

рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрджреИ

рднрдгреНрдбрд╛рд░рдХреЛ рд╕рд░рд▓рддрд╛рд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрджреИ, рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдп рдЕрдиреБрдЧрдорди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╣рд╛рдореА Zeppelin рдорд╛ рдПрдХ рдиреЛрдЯрдкреНрдпрд╛рдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ, рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реНрдерд┐рддрд┐ рд╣реЗрд░реНрдЫреМрдВ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рдпреЛ рдкрдирд┐ Airflow рдХреЛ рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕ рд╣реБрди рд╕рдХреНрдЫ:

рдПрдпрд░рдлреНрд▓реЛ рдмреНрдпрд╛рдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рд╣рдЬ рд░ рдЫрд┐рдЯреЛ рд╡рд┐рдХрд╛рд╕ рд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ

рдПрдпрд░рдлреНрд▓реЛ рдХреЛрдб рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реЛ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордорд╛ рд╕рддрд░реНрдХрддрд╛ рдердкреЗрдХрд╛ рдЫреМрдВред рдХрд╛рд░реНрдпрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЙрджрд╛рд╣рд░рдг, рдпрджрд┐ рддреНрд░реБрдЯрд┐ рднрдпреЛ рднрдиреЗ, рдЯреЗрд▓реАрдЧреНрд░рд╛рдордорд╛ рд╕рдореВрд╣рд▓рд╛рдИ рд╕реНрдкреНрдпрд╛рдо рдЧрд░реНрджрдЫ, рдЬрд╣рд╛рдБ рд╕рдореНрдкреВрд░реНрдг рд╡рд┐рдХрд╛рд╕ рд░ рд╕рдорд░реНрдерди рдЯреЛрд▓реА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

рд╣рд╛рдореАрд▓реЗ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рднрдПрдорд╛) рдорд╛рд░реНрдлрдд рджреНрд░реБрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ, рд░ Zeppelin рдорд╛рд░реНрдлрдд рд╣рд╛рдореАрд▓реЗ Airflow рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рдордЧреНрд░ рддрд╕реНрд╡реАрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВред

рдХреБрд▓

рдПрдпрд░рдлреНрд▓реЛ рдореБрдЦреНрдп рд░реВрдкрдорд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реЛ, рд░ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рдмрд╛рдЯ рдЪрдорддреНрдХрд╛рд░рд╣рд░реВрдХреЛ рдЖрд╢рд╛ рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред рдХрд╛рдо рдЧрд░реНрдиреЗ рд╕рдорд╛рдзрд╛рди рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдордп рд░ рдкреНрд░рдпрд╛рд╕рдорд╛ рд░рд╛рдЦреНрди рддрдпрд╛рд░ рд╣реБрдиреБрд╣реЛрд╕реНред рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдорд▓рд╛рдИ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдпреЛ рдпрд╕рдХреЛ рд▓рд╛рдпрдХ рдЫред рд╡рд┐рдХрд╛рд╕рдХреЛ рдЧрддрд┐, рд▓рдЪрд┐рд▓реЛрдкрди, рдирдпрд╛рдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдердкреНрди рд╕рдЬрд┐рд▓реЛ - рддрдкрд╛рдИрдВрд▓рд╛рдИ рдпреЛ рдордирдкрд░реНрдиреЗрдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рддрдкрд╛рдИрдВрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╕рдВрдЧрдарди, рдПрдпрд░рдлреНрд▓реЛрдХреЛ рд╕реНрдерд┐рд░рддрд╛рдорд╛ рдзреЗрд░реИ рдзреНрдпрд╛рди рджрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ: рдЪрдорддреНрдХрд╛рд░рд╣рд░реВ рд╣реБрдБрджреИрдиред

рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рджреИрдирд┐рдХ рд╡рд╛рдпреБ рдкреНрд░рд╡рд╛рд╣ рдЫ рд▓рдЧрднрдЧ 6,5 рд╣рдЬрд╛рд░ рдХрд╛рд░реНрдпрд╣рд░реВред рддрд┐рдиреАрд╣рд░реВ рдЪрд░рд┐рддреНрд░рдорд╛ рдПрдХрджрдо рдлрд░рдХ рдЫрдиреНред рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдлрд░рдХ рд░ рдзреЗрд░реИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдореБрдЦреНрдп DWH рдорд╛ рдбрд╛рдЯрд╛ рд▓реЛрдб рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН, рддреНрдпрд╣рд╛рдБ рдореБрдЦреНрдп DWH рднрд┐рддреНрд░ рд╕реНрдЯреЛрд░рдлреНрд░рдиреНрдЯрд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН, рддреНрдпрд╣рд╛рдБ рдЫрд┐рдЯреЛ DWH рдорд╛ рдбрд╛рдЯрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ, рдзреЗрд░реИ рдлрд░рдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН - рд░ Airflowред рддреА рд╕рдмреИ рджрд┐рдирджрд┐рдиреИ рдЪрдкрд╛рдЙрдБрдЫрдиреНред рд╕рдВрдЦреНрдпрд╛рдорд╛ рдмреЛрд▓реНрджреИ, рдпреЛ рд╣реЛ Thousand рд╣рдЬрд╛рд░ DWH (Hadoop) рднрд┐рддреНрд░ рд╡рд┐рднрд┐рдиреНрди рдЬрдЯрд┐рд▓рддрд╛рд╣рд░реВрдХреЛ ELT рдХрд╛рд░реНрдпрд╣рд░реВ, рд▓рдЧрднрдЧред 2,5 рд╕рдп рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реНрд░реЛрдд, рдпреЛ рдПрдХ рдЯреЛрд▓реА рд╣реЛ 4 ETL рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ, рдЬрд╕рд▓рд╛рдИ DWH рдорд╛ ETL рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рд░ DWH рднрд┐рддреНрд░ ELT рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рд░ рдкрдХреНрдХреИ рдкрдирд┐ рдердкрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ, рдЬрд╕рд▓реЗ рд╕реЗрд╡рд╛рдХреЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рд╕рдБрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрджрдЫред

рднрд╡рд┐рд╖реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛрдЬрдирд╛рд╣рд░реВ

рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд░реВрдкрдорд╛ рдмрдвреНрджреИ рдЫ, рд░ рд╣рд╛рдореАрд▓реЗ рдПрдпрд░рдлреНрд▓реЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рдЧрд░реНрдиреЗ рдореБрдЦреНрдп рдХреБрд░рд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╣реЛред рд╣рд╛рдореА рдПрдпрд░рдлреНрд▓реЛ рдХреНрд▓рд╕реНрдЯрд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рд╕реЗрд▓реЗрд░реА рдХрд╛рдорджрд╛рд░рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдЦреБрдЯреНрдЯрд╛рдХреЛ рдПрдХ рдЬреЛрдбрд╛ рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рд░ рдХрд╛рдордХреЛ рд╕рдордпрддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд░ рднрдгреНрдбрд╛рд░рдХреЛ рд╕рд╛рде рдПрдХ рд╕реЗрд▓реНрдл-рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЯрд╛рдЙрдХреЛ рдмрдирд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреМрдВред

Epilogue

рдпреЛ, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдореИрд▓реЗ рдПрдпрд░рдлреНрд▓реЛрдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрддрд╛рдЙрди рдЪрд╛рд╣рдиреЗ рд╕рдмреИ рдХреБрд░рд╛ рд╣реЛрдЗрди, рддрд░ рдореИрд▓реЗ рдореБрдЦреНрдп рдмреБрдБрджрд╛рд╣рд░реВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВред рднреЛрдХ рдЦрд╛рдПрд╕рдБрдЧреИ рдЖрдЙрдБрдЫ, рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддрдкрд╛рдИрд▓рд╛рдИ рдпреЛ рдордирдкрд░реНрдиреЗрдЫ :)

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди