
āļŠāļ§āļąāļŠāļāļĩāļŪāļąāļ! āđāļāļāļāļāļ§āļēāļĄāļāļĩāđ āļāļąāļāļāđāļāļāļāļēāļĢāļāļđāļāļāļļāļĒāđāļāļĩāđāļĒāļ§āļāļąāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĩāđāļĒāļāļāđāļĒāļĩāđāļĒāļĄāļāļĒāđāļēāļāļŦāļāļķāđāļāđāļāļāļēāļĢāļāļąāļāļāļēāļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļĄāļđāļĨāđāļāļāđāļāļāļāđ āđāļāđāļ āđāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļāļāļāļ 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 āđāļĨāļ°āđāļāļāļāļīāļāļĩāļāļ·āđāļāđ:

DAG āļāļēāļāļĄāļĩāļĨāļąāļāļĐāļāļ°āđāļāđāļāļāļĩāđ:

āđāļĄāļ·āđāļāļāļāļāđāļāļ DAG āļāļąāļāļāļąāļāļāļēāļāļ°āļ§āļēāļāļāļļāļāļāļāļāļāļđāđāļāļāļīāļāļąāļāļīāļāļēāļāļāļĩāđāļāļ°āļŠāļĢāđāļēāļāļāļēāļāļ āļēāļĒāđāļ DAG āđāļĢāļēāļĄāļēāļāļķāļāļŦāļāđāļ§āļĒāļāļēāļāļāļĩāđāļŠāļģāļāļąāļāļāļĩāļāđāļŦāđāļāļŦāļāļķāđāļ: Airflow Operator
āļāļđāđāļāļĢāļ°āļāļāļāļāļēāļĢ
āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļāļ·āļāđāļāļāļāļīāļāļĩāļāļēāļĄāļāļīāļāļŠāđāļāļāļāđāļāļēāļāļāļĩāđāļŠāļĢāđāļēāļāļāļķāđāļ āļāļķāđāļāļāļāļīāļāļēāļĒāļāļķāļāļŠāļīāđāļāļāļĩāđāļāļ°āđāļāļīāļāļāļķāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļīāļāļŠāđāļāļāļāđāļāļēāļ āļĄāļĩāļāļļāļāđāļāđāļāļāđāļĢāđāļāļāļĢāđāļāļĢāđāļāļĄāđāļāđāļāļēāļāļāļĒāļđāđāđāļĨāđāļ§ āļāļąāļ§āļāļĒāđāļēāļ:
- BashOperator - āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļŠāļģāļŦāļĢāļąāļāļāļģāđāļāļīāļāļāļēāļĢāļāļģāļŠāļąāđāļāļāļļāļāļāļĩ
- PythonOperator - āđāļāđāļāļāđāļĢāđāļāļāļĢāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļ Python
- EmailOperator â āđāļāđāļāļāđāļĢāđāļāļāļĢāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāđāļāļāļĩāđāļĄāļĨ
- HTTPOperator - āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļąāļāļāļģāļāļ http
- SqlOperator - āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļĢāļąāļāđāļāđāļ SQL
- āđāļāđāļāđāļāļāļĢāđāđāļāđāļāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļĢāļāđāļŦāļāļļāļāļēāļĢāļāđ (āļāļēāļĢāļĄāļēāļāļķāļāļāļāļāđāļ§āļĨāļēāļāļĩāđāļāļģāļŦāļāļ, āļĨāļąāļāļĐāļāļ°āļāļāļāđāļāļĨāđāļāļĩāđāļāđāļāļāļāļēāļĢ, āļāļĢāļĢāļāļąāļāđāļāļāļēāļāļāđāļāļĄāļđāļĨ, āļāļēāļĢāļāļāļāļŠāļāļāļāļāļēāļ API āļŊāļĨāļŊ )
āļĄāļĩāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāđāļāļāļēāļ°āđāļāļīāđāļĄāđāļāļīāļĄ: DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator
āļāļļāļāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļāļēāļĄāļāļļāļāļĨāļąāļāļĐāļāļ°āļāļāļāļāļļāļāđāļāļāđāļĨāļ°āđāļāđāđāļāđāļāļĢāļāļāļēāļĢāļāļāļāļāļļāļāđāļāđ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āđāļĢāļēāļŠāļĢāđāļēāļ MongoDBToHiveViaHdfsTransfer āļāļķāđāļāđāļāđāļāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļŠāļģāļŦāļĢāļąāļāļŠāđāļāļāļāļāđāļāļāļŠāļēāļĢāļāļēāļ MongoDB āđāļāļĒāļąāļ Hive āđāļĨāļ°āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļŦāļĨāļēāļĒāļāļąāļ§āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļąāļ : CHLoadFromHiveOperator āđāļĨāļ° CHTableLoaderOperator āđāļāļĒāļāļ·āđāļāļāļēāļāđāļĨāđāļ§ āļāļąāļāļāļĩāļāļĩāđāđāļāļĢāđāļāđāļāļāđāđāļāđāđāļāđāļāļāļĩāđāļŠāļĢāđāļēāļāļāļēāļāļāļģāļŠāļąāđāļāļāļ·āđāļāļāļēāļāļāđāļāļĒāļāļĢāļąāđāļ āļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļķāļāļāļēāļĢāļŠāļĢāđāļēāļāļĄāļąāļāđāļŦāđāđāļāđāļāļāļģāļŠāļąāđāļāđāļŦāļĄāđāđāļāđ āļŠāļīāđāļāļāļĩāđāļāļ°āļāļģāđāļŦāđāļāļēāļĢāļāļąāļāļāļēāđāļāļīāđāļĄāđāļāļīāļĄāļāđāļēāļĒāļāļķāđāļ āđāļĨāļ°āļāļļāļāļāļ°āļāļĒāļēāļĒāđāļĨāļāļĢāļēāļĢāļĩāļāļāļāļāļđāđāļāļāļīāļāļąāļāļīāļāļēāļāđāļāđāļāļĢāļāļāļēāļĢ
āļāļąāļāđāļ āļāļīāļāļŠāđāļāļāļāđāļāļāļāļāļēāļāļāļąāđāļāļŦāļĄāļāđāļŦāļĨāđāļēāļāļĩāđāļāļģāđāļāđāļāļāđāļāļāđāļāđāļĢāļąāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢ āđāļĨāļ°āļāļāļāļāļĩāđāđāļĢāļēāļāļ°āļāļđāļāļāļķāļāļāļąāļ§āļāļģāļŦāļāļāļāļēāļĢāļēāļāđāļ§āļĨāļē
āļāļģāļŦāļāļāļāļēāļĢ
āļāļąāļ§āļāļģāļŦāļāļāđāļ§āļĨāļēāļāļēāļāļāļāļ Airflow āļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļ . Celery āđāļāđāļāđāļĨāļāļĢāļēāļĢāļĩ Python āļāļĩāđāđāļŦāđāļāļļāļāļāļąāļāļĢāļ°āđāļāļĩāļĒāļāļāļīāļ§āļĢāļ§āļĄāļāļķāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāđāļāļāļāļ°āļāļīāļāđāļāļĢāļāļąāļŠāđāļĨāļ°āđāļāļāļāļĢāļ°āļāļēāļĒ āđāļāļāđāļēāļ 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 āļŠāļēāļĄāļēāļĢāļāđāļāļāļāļĩāđāđāļāđāļāļĩāđāļĢāļ°āļāļąāļāļāļēāļ
āļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļĩāđāđāļĒāļāļāļēāļāļāļąāļāļāļ·āļ Scheduler āļĄāļĩāļŦāļāđāļēāļāļĩāđāļĢāļąāļāļāļīāļāļāļāļāđāļāļāļēāļĢāļāļģāļŦāļāļāđāļ§āļĨāļēāļāļēāļāļāļąāđāļāļŦāļĄāļāđāļ Airflow āļāļĢāļīāļāđ āđāļĨāđāļ§ Scheduler āđāļāļĩāđāļĒāļ§āļāđāļāļāļāļąāļāļāļĨāđāļāļāļąāđāļāļŦāļĄāļāđāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāļēāļāđāļāļ·āđāļāļāļģāđāļāļīāļāļāļēāļĢ āļāļēāļāļāđāļāļāļāđāļēāļāļŦāļĨāļēāļĒāļāļąāđāļāļāļāļāļāđāļāļāļāļĩāđāļāļ°āļāļģāđāļāļīāļāļāļēāļĢ:
- āļāļēāļāļāđāļāļāļŦāļāđāļēāļāļĩāđāđāļŠāļĢāđāļāļŠāļĄāļāļđāļĢāļāđāđāļ DAG āđāļĨāđāļ§ āļāļēāļāđāļŦāļĄāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļīāļ§āđāļāđ
- āļāļīāļ§āļāļ°āļāļđāļāļāļąāļāđāļĢāļĩāļĒāļāļāļķāđāļāļāļĒāļđāđāļāļąāļāļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāļāļāļāļāļēāļ (āļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāļŠāļēāļĄāļēāļĢāļāļāļ§āļāļāļļāļĄāđāļāđ) āđāļĨāļ°āļŦāļēāļāļĄāļĩāļāđāļāļāļ§āđāļēāļāđāļāļāļđāļĨ āļāļēāļāļāđāļŠāļēāļĄāļēāļĢāļāđāļĢāļīāđāļĄāļāļģāđāļāļīāļāļāļēāļĢāđāļāđ
- āļŦāļēāļāļĄāļĩāļāļ·āđāļāļāđāļēāļĒāļāļāļāļēāļāļāļīāļŠāļĢāļ°āļāļēāļāļāļ°āļāļđāļāļŠāđāļāđāļāļĒāļąāļāļāļēāļāļāļąāđāļ āļāļēāļāļāļĩāđāļāļļāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄāđāļ§āđāđāļāļāļąāļāļŦāļēāļāļ°āđāļĢāļīāđāļĄāļāđāļāļāļķāđāļāđāļāļĒāđāļāđāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļāļĒāđāļēāļāđāļāļāļĒāđāļēāļāļŦāļāļķāđāļ
āļāđāļēāļĒāļāļ
āļāļąāļ§āļāļģāļŦāļāļāđāļ§āļĨāļēāļāļģāļāļēāļāļāļāļāļļāļāļāļāļ 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 āļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļāļāļĢāđāļāļĄāļāļąāļāđāļāļ§āļąāļāļāļĩāđāļāļģāđāļāļīāļāļāļēāļĢāļŦāļĨāļēāļĒāđ āļ§āļąāļ āļāļĩāđāđāļŠāļāļāđāļŦāđāđāļŦāđāļāļāļĒāđāļēāļāļāļąāļāđāļāļāļāļĩāđāļāļĩāđ:

āļāđāļēāđāļŠāļĩāļĒāļāļēāļĒ (āļŦāļĢāļ·āļāļāļēāļāđāļāļāļāļĩ: āļāļķāđāļāļāļĒāļđāđāļāļąāļāļŠāļāļēāļāļāļēāļĢāļāđ) āļŦāļēāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļāđāļ 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 āļĄāļĩāļĨāļąāļāļĐāļāļ°āļāļąāļāļāļĩāđ:

āđāļāļāļĢāļāļĩāļāļĩāđ āļāļļāļāļŠāļēāļĄāļēāļĢāļāđāļāļīāđāļĄāļŦāļĢāļ·āļāļĨāļāļāļēāļĢāđāļāđāļāđāđāļāļĒāđāļāļĩāļĒāļāđāļāđāļāļĢāļąāļāļāļēāļĢāļāļąāđāļāļāđāļēāđāļĨāļ°āļāļąāļāđāļāļ DAG āļŠāļ°āļāļ§āļāļŠāļāļēāļĒ!
āļāļļāļāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļĢāļŠāļĢāđāļēāļāđāļāđāļāļāļĩāđāļāļąāļāļāđāļāļāļĄāļēāļāļāļķāđāļāđāļāđ āđāļāđāļ āļāļģāļāļēāļāļāļąāļāđāļŦāļĨāđāļāļāļĩāđāļĄāļēāđāļāļĢāļđāļāđāļāļāļāļāļāļāļēāļāļāđāļāļĄāļđāļĨāļŦāļĢāļ·āļāļāļāļīāļāļēāļĒāđāļāļĢāļāļŠāļĢāđāļēāļāļāļēāļĢāļēāļ āļāļąāļĨāļāļāļĢāļīāļāļķāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļąāļāļāļēāļĢāļēāļ āđāļĨāļ°āđāļĄāļ·āđāļāļāļģāļāļķāļāļāļķāļāļāļļāļāļŠāļĄāļāļąāļāļīāļāļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļ DWH āļāļ°āļŠāļĢāđāļēāļāļāļĢāļ°āļāļ§āļāļāļēāļĢ āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļŦāļĨāļ N āļāļēāļĢāļēāļāļĨāļāđāļāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāļāļāļāļāļļāļ āļŦāļĢāļ·āļ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāļēāļĢāļāļģāļāļēāļāļāļąāļ API āļāļĩāđāđāļĄāđāļĢāļāļāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļąāļāļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđāđāļāļĢāļđāļāđāļāļāļāļāļāļĢāļēāļĒāļāļēāļĢ āļāļļāļāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāļēāļ N āļāļēāļāđāļ DAG āļāļēāļāļĢāļēāļĒāļāļēāļĢāļāļĩāđ āļāļģāļāļąāļāļāļ§āļēāļĄāļāļāļēāļāļāļāļāļāļģāļāļāđāļ API āđāļ§āđāļāļĩāđāļāļđāļĨ āđāļĨāļ°āļāļđāļ āļāđāļāļĄāļđāļĨāļāļĩāđāļāļģāđāļāđāļāļāļēāļ API āļĒāļ·āļāļŦāļĒāļļāđāļāđāļāđ!
āļāļĩāđāđāļāđāļ
Airflow āļĄāļĩāļāļ·āđāļāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāđāļāđāļāđāļāļāļāđāļāļāļāļāļąāļ§āđāļāļ āļāļēāļāļāđāļāļĄāļđāļĨ (āļāļēāļāđāļāđāļ MySQL āļŦāļĢāļ·āļ Postgres āđāļĢāļēāļĄāļĩ Postgres) āļāļķāđāļāļāļąāļāđāļāđāļāļŠāļāļēāļāļ°āļāļāļāļāļēāļ, DAG, āļāļēāļĢāļāļąāđāļāļāđāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ, āļāļąāļ§āđāļāļĢāļŠāđāļ§āļāļāļĨāļēāļ āļŊāļĨāļŊ āļŊāļĨāļŊ āđāļāļāļĩāđāļāļĩāđ āļāļąāļāļāļĒāļēāļāļāļ°āļāļāļāļ§āđāļē āļāļ·āđāļāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāđāļ Airflow āļāļąāđāļāļāđāļēāļĒāļĄāļēāļ (āļāļĢāļ°āļĄāļēāļ 20 āļāļēāļĢāļēāļ) āđāļĨāļ°āļŠāļ°āļāļ§āļāļāđāļēāļāļļāļāļāđāļāļāļāļēāļĢāļŠāļĢāđāļēāļāļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļāļāļāļļāļāđāļāļāļāļāļāđāļŦāļāļ·āļāļāļēāļāļāļąāđāļ āļāļąāļāļāļģāļāļēāļĢāļēāļ 100500 āļāļēāļĢāļēāļāđāļāļāļĩāđāđāļāđāļ Informatica āđāļāđ āļāļķāđāļāļāđāļāļāļĻāļķāļāļĐāļēāđāļāđāļāđāļ§āļĨāļēāļāļēāļāļāđāļāļāļāļĩāđāļāļ°āđāļāđāļēāđāļāļ§āļīāļāļĩāļŠāļĢāđāļēāļāđāļāļāļŠāļāļāļāļēāļĄ
āļāļēāļĢāļāļĢāļ§āļāļŠāļāļ
āđāļāļ·āđāļāļāļāļēāļāļāļ§āļēāļĄāđāļĢāļĩāļĒāļāļāđāļēāļĒāļāļāļāļāļ·āđāļāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨ āļāļļāļāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļēāļāļāļĩāđāļŠāļ°āļāļ§āļāļŠāļģāļŦāļĢāļąāļāļāļļāļāđāļāđ āđāļĢāļēāđāļāđāđāļāđāļāļāļāļāļąāļāļāļķāļāđāļ Zeppelin āđāļāļĒāđāļĢāļēāļāļ°āļāļđāļŠāļāļēāļāļ°āļāļāļāļāļēāļ:

āļāļĩāđāļāļēāļāđāļāđāļāđāļ§āđāļāļāļīāļāđāļāļāļĢāđāđāļāļŠāļāļāļ 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
