рдЕрдкрдиреЗ рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреБрдЫ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрд╕ рдХреНрд╖рдг рдЬрдм рд╣рдо рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрд╢рд╛ рдкрд░реНрдпрд╛рдкреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдорд╛рдорд▓рд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2015 рдореЗрдВ, рдФрд░ рд╣рдо, рдмрд┐рдЧ рдбреЗрдЯрд╛ рд╕реНрдкреЗрд╢рд▓рд┐рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░, 35 рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╣рдбреЛрдк рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред YARN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдорд▓реЗ рдХреЗ рддрд╣рдд рдЗрд╕реЗ рдХреИрд╕реЗ рдкрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рдирддреАрдЬрддрди, рдкрддрд╛ рд▓рдЧрд╛ рдФрд░ рдЕрдкрдиреЗ рджрдо рдкрд░ рд░рд╛рд╕реНрддрд╛ рдЪрд▓ рджрд┐рдпрд╛, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣реИрдмреЗ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдФрд░ рдореЙрд╕реНрдХреЛ рд╕реНрдкрд╛рд░реНрдХ рдореАрдЯрдЕрдк рдореЗрдВ рднреА рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдЗрд╕ рдмрд╛рд░ рд╣рдо рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо - рдбрд╛рдЯрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдкреНрд░рддрд┐рднрд╛рдЧреА рдЗрд╕ рдкрд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ: рд▓рдВрдмреЛрджрд╛ рдФрд░ рдХрдкреНрдкрд╛ред рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рдмреИрдЪ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдЪрдбреАрдПрдлрдПрд╕ рд╕реЗ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ рд▓реЙрдЧреНрд╕ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдпрд░рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рджреЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ "рд▓реЗрдХрд┐рди" рд╣реИ: рд╣рдорд╛рд░реЗ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рддрдХрдиреАрдХреА рд╣реИрдВред рд▓реИрдм рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЪреЗрдХрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЛ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддреЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, "рдЪреЗрдХ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рдЙрд╕рдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЦрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЗрд╕ рд╕рдордп рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВред
рдЗрд╕ рд▓реИрдм рдХреА рдЬрд╛рдБрдЪ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ: рд╣рдо рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЗ рдХрд╛рдлрд╝реНрдХрд╛ рдХреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЧреЛрдмрд▓рд┐рди рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдХреЛ рдПрдЪрдбреАрдПрдлрдПрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдпрд░рдлрд╝реНрд▓реЛ рдЗрд╕ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдПрдпрд░рдлреНрд▓реЛ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЗрд╕реЗ рдПрдХ рд╕рдордп рдкрд░ рдХрд░рддрд╛ рд╣реИ: 15 рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдВрджрд░ рдлреЗрдВрдХрддрд╛ рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдФрд░ рдЕрдм рдХреЗ рдЪреЗрдХрд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреАрдПрдЬреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Googling, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ Airflow рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдПрдкреАрдЖрдИ рд╣реИ ред рд╢рдмреНрдж experimental
, рдмреЗрд╢рдХ, рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ ... рдЕрдЪрд╛рдирдХ рдпрд╣ рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛ред
рдЕрдЧрд▓рд╛, рд╣рдо рдкреВрд░реЗ рддрд░реАрдХреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ: рдПрдпрд░рдлреНрд▓реЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд▓реЗрдХрд░ POST рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ DAG рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИред рд╣рдо Ubuntu 16.04 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
1. Airflow рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рдпрдерди 3 рдФрд░ virtualenv рд╣реИред
$ python3 --version Python 3.6.6 $ virtualenv --version 15.2.0
рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред
рдЕрдм рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдпрд░рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред
$ mkdir <your name of directory> $ cd /path/to/your/new/directory $ virtualenv -p which python3 venv $ source venv/bin/activate (venv) $
Airflow рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
(venv) $ pip install airflow
рдЬрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣рдордиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ: 1.10ред
рдЕрдм рд╣рдореЗрдВ airflow_home
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ DAG рдлрд╛рдЗрд▓реЗрдВ рдФрд░ Airflow рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ AIRFLOW_HOME
рд╕реЗрдЯ рдХрд░реЗрдВред
(venv) $ cd /path/to/my/airflow/workspace (venv) $ mkdir airflow_home (venv) $ export AIRFLOW_HOME=<path to airflow_home>
рдЕрдЧрд▓рд╛ рдХрджрдо SQLite рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ:
(venv) $ airflow initdb
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ airflow.db
рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ Airflow рд╕реНрдерд╛рдкрд┐рдд рд╣реИ:
$ airflow version [2018-11-26 19:38:19,607] {__init__.py:57} INFO - Using executor SequentialExecutor [2018-11-26 19:38:19,745] {driver.py:123} INFO - Generating grammar tables from /usr/lib/python3.6/lib2to3/Grammar.txt [2018-11-26 19:38:19,771] {driver.py:123} INFO - Generating grammar tables from /usr/lib/python3.6/lib2to3/PatternGrammar.txt ____________ _____________ ____ |__( )_________ __/__ /________ __ ____ /| |_ /__ ___/_ /_ __ /_ __ \_ | /| / / ___ ___ | / _ / _ __/ _ / / /_/ /_ |/ |/ / _/_/ |_/_/ /_/ /_/ /_/ \____/____/|__/ v1.10.0
рдпрджрд┐ рдХрдорд╛рдВрдб рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ Airflow рдиреЗ airflow.cfg
рдореЗрдВ рдЕрдкрдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ airflow.cfg
рдмрдирд╛рдИ:
$ tree . тФЬтФАтФА airflow.cfg тФФтФАтФА unittests.cfg
рдПрдпрд░рдлреНрд▓реЛ рдореЗрдВ рдПрдХ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИред рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
(venv) $ airflow webserver --port 8081
рдЕрдм рдЖрдк рд╣реЛрд╕реНрдЯ 80 рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдпрд░рдлреНрд▓реЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: <hostname:8081>
ред
2. рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
рдЗрд╕ рдкрд░, Airflow рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рднреА рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЪреЗрдХрд░реНрд╕ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдз requests
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрд╕ рдкрд░ рд╣реЛрдВрдЧреЗред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдкреАрдЖрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд░рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдЕрдиреБрд░реЛрдз рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
>>> import requests >>> host = <your hostname> >>> airflow_port = 8081
рдпрджрд┐ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдРрд╕рд╛ рд╕рдВрджреЗрд╢ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рд╣рдо DAG рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
[api] auth_backend = airflow.contrib.auth.backends.password_auth
рдлрд┐рд░, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛:
>>> import airflow >>> from airflow import models, settings >>> from airflow.contrib.auth.backends.password_auth import PasswordUser >>> user = PasswordUser(models.Admin()) >>> user.username = 'new_user_name' >>> user.password = 'set_the_password' >>> session = settings.Session() >>> session.add(user) >>> session.commit() >>> session.close() >>> exit()
рдлрд┐рд░, рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдбреАрдПрдЬреА рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреАред
>>> import airflow >>> from airflow import models, settings >>> from airflow.contrib.auth.backends.password_auth import PasswordUser >>> user = PasswordUser(models.User()) >>> user.username = 'newprolab' >>> user.password = 'Newprolab2019!' >>> session = settings.Session() >>> session.add(user) >>> session.commit() >>> session.close() >>> exit()
рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред
3. рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рд╢реБрд░реВ рдХрд░рдирд╛
POST рдЕрдиреБрд░реЛрдз рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
>>> dag_id = newprolab >>> url = 'http://{}:{}/{}/{}/{}'.format(host, airflow_port, 'api/experimental/dags', dag_id, 'dag_runs') >>> data = {"conf":"{\"key\":\"value\"}"} >>> headers = {'Content-type': 'application/json'} >>> auth = ('newprolab', 'Newprolab2019!') >>> uri = requests.post(url, data=json.dumps(data), headers=headers, auth=auth) >>> uri.text '{\n "message": "Created <DagRun newprolab @ 2019-03-27 10:24:25+00:00: manual__2019-03-27T10:24:25+00:00, externally triggered: True>"\n}\n'
рдЕрдиреБрд░реЛрдз рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рддрджрдиреБрд╕рд╛рд░, рдлрд┐рд░ рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП DAG рдХреЛ рдХреБрдЫ рд╕рдордп рджреЗрддреЗ рд╣реИрдВ рдФрд░ ClickHouse рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреИрдХреЗрдЯ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╕рддреНрдпрд╛рдкрди рдкреВрд░рд╛ рд╣реБрдЖред