แแแแแ แฏแแแ, แฐแแแ ! แแ แกแขแแขแแแจแ แแแแแ แแแกแแฃแแ แ แแ แ แแแ แแแกแขแ แฃแแแแขแแ แกแแ แแฃแแ แแแแแชแแแแ แแแแฃแจแแแแแแก แแ แแชแแกแแแแก แแแแแแแแ แแแแกแแแแก, แแแแแแแแแ, แแแ แแแ แแขแแฃแแ DWH-แแก แแ แแฅแแแแ DataLake-แแก แแแคแ แแกแขแ แฃแฅแขแฃแ แแจแ. แฉแแแ แแแกแแฃแแ แแแ Apache Airflow-แแ (แจแแแแแแแจแ Airflow). แแก แฃแกแแแแ แแแแ แแแแแแแฃแแแ แงแฃแ แแแฆแแแแก Habrรฉ-แแ แแ แซแแ แแแแ แแแฌแแแจแ แแแชแแแแ แแแแแ แฌแแฃแแแ, แ แแ แแแแแแฃแ Airflow แฆแแ แก แงแฃแ แแแ แแฅแแแแ ETL/ELT แแ แแชแแกแแแแก แแแแ แแแแก แแ แฉแแแแกแแก.
แแแ แ แแแแฌแแ แ แกแขแแขแแแแแก แกแแ แแ DWH-แแก แแแแแแ, แ แแแแกแแช แแแฃแจแแแแแ Tinkoff Bank-แจแ. แแฎแแ แแ แแแแฎแแ Mail.Ru แฏแแฃแคแแก แแฃแแแแก แฌแแแ แ แแ แแแแแแแ แแ แแแแขแคแแ แแแก แแแแแชแแแแ แแแแแแแแกแแแแก แกแแแแแแจแ แแแแแจแ. แ แแแแฃแ แแ, แ แแแแ แช แแฎแแแ แแแแแแ แแ แกแแแแขแแ แแกแ แแแแแฌแงแแแขแแแแแแแ แแแแแฉแแแแแ, แแ แแ แฉแแแ แแฃแแแ แแฅ แแแกแแฃแแ แแแ แแแแแชแแแแ แแแแแแขแแแแก แฉแแแแก แแแแขแคแแ แแแแ.
แแ แแแแแ
แแแจ แแกแ, แแแแแฌแงแแ. แ แ แแ แแก แฐแแแ แแก แแแแแแ? แแก แแ แแก แแแแแแแแแแ (แแ
แแฎแแ แแแแแ แแแแแแฎแแแแ Airflow-แแก แซแแ แแแแ แแ แแแฃแแแแก. แแแแ แแ แกแแก แแ แแแแแแก แแแแแแแ, แแฅแแแ แจแแแแซแแแแ แแแขแแแแแฃแ แแ แแแแฌแงแแ แแฅแแแแ แแ แแชแแกแแก แแ แฅแแขแแฅแขแฃแ แ. แจแแกแแซแแแ, แแแแแแ แ แแ แแแฃแแ แแ แแก แแแแแ แแฃแแ แแชแแแแฃแ แ แแ แแคแแแ (แจแแแแแแแจแ DAG).
DAG
DAG แแ แแก แแฅแแแแ แแแแชแแแแแแก แแแ แแแแฃแแ แแแแจแแแแแแแแแ แแกแแชแแแชแแ, แ แแแแแแช แแกแฃแ แ แจแแแกแ แฃแแแ แแแแชแ แแ แแแแกแแแฆแแ แฃแแ แแแแแแแแแแ แแแแ แแแแแ แแขแฃแแ แแ แแคแแแแก แแแฎแแแแแ. Airflow แฃแแ แฃแแแแแงแแคแก แแแกแแฎแแ แฎแแแแ แแแ แแแขแแ แคแแแกแก DAG-แแแแแ แแ แกแฎแแ แแแแแฅแขแแแแแ แแฃแจแแแแแกแแแแก:
DAG แจแแแซแแแแ แแกแ แแแแแแงแฃแ แแแแแแก:
แแแแแแแแแ แ, DAG-แแก แแแแแแแแก แจแแฅแแแแกแแก, แแงแแแแแแแก แแแแ แแขแแ แแแแก แแ แแแแแแแแแก, แ แแแแแแแแช แแจแแแแแแ แแแแแแแแแแ DAG-แแก แคแแ แแแแแจแ. แแฅ แแแแแแแ แแแแแ แแ แ แแแแจแแแแแแแแ แแ แกแแแแแแ: แฐแแแ แแก แแแแแแแก แแแแ แแขแแ แ.
แแแแ แแขแแ แแแ
แแแแ แแขแแ แ แแ แแก แแ แแแฃแแ, แ แแแแแก แกแแคแฃแซแแแแแแช แแฅแแแแแ แกแแแฃแจแแ แแแกแขแแแชแแแแ, แ แแแแแแช แแฆแฌแแ แก แ แ แแแฎแแแแ แกแแแฃแจแแ แแแกแขแแแชแแแก แจแแกแ แฃแแแแแก แแ แแก.
- BashOperator - แแแแ แแขแแ แ bash แแ แซแแแแแแก แจแแกแแกแ แฃแแแแแแ.
- PythonOperator - แแแแ แแขแแ แ Python แแแแแก แแแแแซแแฎแแแแกแแแแก.
- EmailOperator โ แแแแ แแขแแ แ แแแแฅแขแ แแแฃแแ แคแแกแขแแก แแแแแแแแแกแแแแก.
- HTTPOoperator - แแแแ แแขแแ แ http แแแแฎแแแแแแแแ แแฃแจแแแแแกแแแแก.
- SqlOperator - SQL แแแแแก แจแแแกแ แฃแแแแแแ แแแแ แแขแแ แ.
- แกแแแกแแ แ แแ แแก แแแแแแแแก แแแแแแแแแก แแแแ แแขแแ แ (แกแแญแแ แ แแ แแแก แแแแแแแ, แกแแญแแ แ แคแแแแแก แแแแแฉแแแ, แฎแแแ แแแแแชแแแแ แแแแแจแ, แแแกแฃแฎแ API-แแแ แแ แ.แจ. แแ แ.แจ.).
แแ แกแแแแแก แฃแคแ แ แแแแแ แแขแฃแแ แแแแ แแขแแ แแแ: DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator.
แแฅแแแ แแกแแแ แจแแแแซแแแแ แแแแแแแแแ แแ แแแแ แแขแแ แแแ แกแแแฃแแแ แ แแแฎแแกแแแแแแแแแแก แกแแคแฃแซแแแแแ แแ แแแแแแงแแแแ แแกแแแ แแฅแแแแก แแ แแแฅแขแจแ. แแแแแแแแแ, แฉแแแ แจแแแฅแแแแแ MongoDBToHiveViaHdfsTransfer, แแแแ แแขแแ แ MongoDB-แแแ Hive-แจแ แแแแฃแแแแขแแแแก แแฅแกแแแ แขแแกแแแแก แแ แ แแแแแแแแ แแแแ แแขแแ แ, แ แแแแแแแแแช แแฃแจแแแแก.
แจแแแแแแ, แแแแแแแแแแแก แงแแแแ แแก แจแแแแฎแแแแ แฃแแแ แจแแกแ แฃแแแแก แแ แแฎแแ แฉแแแ แแแกแแฃแแ แแแ แแแแ แแแแก แจแแกแแฎแแ.
แแแแ แแแ
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 แแฎแแแ แจแแกแ แฃแแแแแกแแแแก แแแแชแแแแแแก แแแงแแแแแแก แงแแแแ แแแฅแแแแแแก. แแแแแแแแ แจแแกแ แฃแแแแแแแ แแแแแก แ แแแแแแแแ แแขแแแก:
- แฌแแแ แแแแแแแแแแ แจแแกแ แฃแแแแฃแแแ DAG-แจแ, แแฎแแแ แจแแแซแแแแ แแแแแแก แ แแแจแ.
- แ แแแ แแแแแแแแฃแแแ แแแแชแแแแแแก แแ แแแ แแขแแขแแก แแแฎแแแแแ (แแ แแแ แแขแแขแแแแก แแแแขแ แแแแช แจแแกแแซแแแแแแแ), แฎแแแ แแฃ แแฃแแจแ แแแแแกแฃแคแแแ แกแแแขแแ, แแแแแแแแ แจแแแซแแแแ แแแแฅแแแแแแก.
- แแฃ แแ แแก แแแแแกแฃแคแแแ แแฃแจแ แแแแฎแฃแ แ, แแแแแแแแ แแแแแแแแแ แแแก; แแฃแจแแแแ, แ แแแแแแช แแฅแแแ แแแแ แแแ แแแแ แแ แแแแแแแจแ, แแฌแงแแแ แแแ แแฃ แแ แแแแ แแขแแ แแก แแแแแงแแแแแแ.
แกแแแแแ แแกแแ แแแ แขแแแ.
Scheduler แแฃแจแแแแก แงแแแแ 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 * * * *')
แแฆแกแ แฃแแแแแก แแแ แแฆแ
แแแแก แแแกแแแแแแ, แแฃ แ แแแแ แแฃแจแแแแก แฐแแแ แแก แแแแแแ, แแแแจแแแแแแแแแแ แแแแกแแแแแก, แแฃ แ แ แแ แแก แจแแกแ แฃแแแแแก แแแ แแฆแ 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-แก แแฅแแก แกแแแฃแแแ แ backend แกแแชแแแ, แแแแแชแแแแ แแแแ (แจแแแซแแแแ แแงแแก MySQL แแ Postgres, แฉแแแ แแแแฅแแก Postgres), แ แแแแแแช แแแแฎแแแก แแแแชแแแแแแก แแแแแแแ แแแแแก, DAG-แแแก, แแแแจแแ แแก แแแ แแแแขแ แแแก, แแแแแแแฃแ แชแแแแแแแก แแ แ.แจ. แแ แ.แจ. แแฅ แแแแแ แแแฅแแ, แ แแ Airflow-แแก แกแแชแแแ แซแแแแแ แแแ แขแแแแ (แแแแฎแแแแแแ 20 แชแฎแ แแแ) แแ แแแกแแฎแแ แฎแแแแแแ, แแฃ แแกแฃแ แ แแแกแแ แกแแแฃแแแ แ แแ แแชแแกแแก แจแแฅแแแ. แแแฎแกแแแก 100500 แชแฎแ แแแ Informatica-แก แกแแชแแแจแ, แ แแแแแแแช แแแแ แฎแแแก แแแแแแแแแแแจแ แฃแแแ แจแแกแฌแแแแแแแงแ, แกแแแแ แแแแแแแแแ, แแฃ แ แแแแ แฃแแแ แแแฌแงแ แจแแแแแฎแแ.
แแแแแขแแ แแแแ
แกแแชแแแแก แกแแแแ แขแแแแก แแแแแแแแกแฌแแแแแแ, แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ แแแแชแแแแแแก แแแแแขแแ แแแแแก แแ แแชแแกแ, แ แแแแแแช แแฅแแแแแแแก แแแกแแฎแแ แฎแแแแแแ. แฉแแแ แแแงแแแแแ แ แแแฃแแก Zeppelin-แจแ, แกแแแแช แแแแแแแแแ แแแ แแแแแแแแแแแก แกแขแแขแฃแกแก:
แแก แแกแแแ แจแแแซแแแแ แแงแแก แแแแแ Airflow-แแก แแแ แแแขแแ แคแแแกแ:
Airflow แแแแ แฆแแ แฌแงแแ แแ, แแแแขแแ แฉแแแ แแแแแแแขแแ แแแคแ แแฎแแแแแ Telegram-แจแ. แแแแแแแแแก แงแแแแแ แแแจแแแแฃแแ แแแแแแแแ, แจแแชแแแแแก แจแแแแฎแแแแแจแ, แแแแแแแแก แฏแแฃแคแก Telegram-แจแ, แกแแแแช แจแแแแแแ แแแแแแแแ แแแแกแ แแ แแฎแแ แแแญแแ แแก แแแแแ แแฃแแแ.
แฉแแแ แแแฆแแแ แกแฌแ แแค แแแกแฃแฎแก Telegram-แแก แกแแจแฃแแแแแแ (แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ) แแ Zeppelin-แแก แแแจแแแแแแ แแแฆแแแ แแแแชแแแแแแก แกแแแ แแ แกแฃแ แแแก Airflow-แจแ.
แกแแแ แแ แฏแแแจแ
แฐแแแ แแก แแแแแแ, แแแ แแแ แ แแแจแ, แฆแแ แฌแงแแ แแ แแ แแแกแแแ แกแแกแฌแแฃแแแแก แแ แฃแแแ แแแแแแ. แแแแ แแงแแแแ แแแฎแแ แฏแแ แแ แ แแ แซแแแแกแฎแแแแ แแคแแฅแขแฃแ แ แแแแแฌแงแแแขแแก แจแแกแแฅแแแแแแ. แแแแแแ แแแฆแฌแแแแแแ, แแแแแฏแแ แ, แฆแแ แก. แแแแแแแแ แแแแก แกแแฉแฅแแ แ, แแแฅแแแแแแ, แแฎแแแ แแ แแชแแกแแแแก แแแแแขแแแแก แกแแแแ แขแแแ - แแแแแฌแแแแแแ. แ แ แแฅแแ แฃแแแ, แแแแ แงแฃแ แแแฆแแแ แฃแแแ แแแแฅแชแแแ แแ แแแฅแขแแก แแ แแแแแแแแแก, แแแแแ แกแแฐแแแ แ แแแแแแแก แกแขแแแแแฃแ แแแแก: แกแแกแฌแแฃแแแแ แแ แฎแแแแ.
แแฎแแ แฉแแแ แงแแแแแแฆแแฃแ แแ แแฃแจแแแแก Airflow แแแแฎแแแแแแ 6,5 แแแแกแ แแแแแแแแ. แแกแแแ แกแแแแแแ แแแแกแฎแแแแแแแแแ แฎแแกแแแแแ. แแ แกแแแแแก แซแแ แแแแแ DWH-แจแ แแแแแชแแแแแแก แฉแแขแแแ แแแ แแ แแแแแ แแแแกแฎแแแแแแฃแแ แแ แซแแแแแ แแแแแ แแขแฃแแ แฌแงแแ แแแแ, แแ แแก แแแขแ แแแแแแก แแแแแแแแแก แแแแชแแแแแ แแแแแแ แ DWH-แจแ, แแ แแก แแแแแชแแแแ แแแแแฅแแแงแแแแแก แแแแชแแแแแ แกแฌแ แแค DWH-แจแ, แแ แแก แแแแ แ, แแแแ แ แแแแกแฎแแแแแแฃแแ แแแแแแแแ - แแ Airflow แฆแแญแแแก แแแ แแฆแแแ แแฆแ. แชแแคแ แแแแ แ แแ แแแฅแแแ, แแก แแ แแก 2,3 แแแแกแ แกแฎแแแแแกแฎแแ แกแแ แแฃแแแก ELT แแแแชแแแแแ DWH (Hadoop) แคแแ แแแแแจแ, แแแแฎแ. 2,5 แแกแแฃแแ แแแแแชแแแแ แแแแ แฌแงแแ แแแแ, แแก แแ แแก แแฃแแแ 4 ETL แแแแแแแแแ แ, แ แแแแแแแช แแงแแคแ ETL แแแแแชแแแแ แแแแฃแจแแแแแแ DWH-แจแ แแ ELT แแแแแชแแแแ แแแแฃแจแแแแแแ DWH-แจแ แแ แ แ แแฅแแ แฃแแแ แกแฎแแ แแ แแ แแแแแแ, แ แแแแแแช แแฎแแแ แกแแ แแแกแแก แแแคแ แแกแขแ แฃแฅแขแฃแ แแก.
แกแแแแแแแแ แแแแแแแ
แแ แแชแแกแแแแก แ แแแแแแแแ แแฃแชแแแแแแแ แแแ แแแแ แแ แแแแแแ แ, แ แแกแแช Airflow แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแฃแแฎแแ แแแแแแแแแแ, แแ แแก แแแกแจแขแแแแ แแแ. แฉแแแ แแแแแแ แแแแจแแแแ Airflow แแแแกแขแแ แ, แแแแแแงแแ แฌแงแแแแ แคแแฎแ แกแแแแ แแแก แแฃแจแแแแแแกแแแแก แแ แจแแแฅแแแแ แแแแแแแแ แแแแแแแแ แแแแ แกแแแฃแจแแแก แแแแแแแแแก แแ แแชแแกแแแแ แแ แกแแชแแแ.
แแแแแแแ
แแก, แ แ แแฅแแ แฃแแแ, แแ แแ แแก แงแแแแแคแแ แ, แ แแกแ แแฅแแแช แแกแฃแ แก Airflow-แแก แจแแกแแฎแแ, แแแแ แแ แจแแแแชแแแ แแแแแแงแ แซแแ แแแแแ แแฃแแฅแขแแแ. แแแแ แญแแแแกแแแ แแ แแแ แแแแแก, แกแชแแแแ แแ แแแแแฌแแแแแแ :)
แฌแงแแ แ: www.habr.com