ΠΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ Π½Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΌΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ. Π Π½Π° ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ Π½ΠΈΠΌΠΈ ΡΡΠ°Π»ΠΈΠΊΠ²Π°Π΅ΠΌΡΡ, Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΡΡΠ°ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π±Ρ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ.
Π’Π°ΠΊ Π±ΡΠ»ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² 2015 Π³ΠΎΠ΄Ρ ΠΈ ΠΌΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ βΠ‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ ΠΏΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌ Π΄Π°Π½Π½ΡΠΌβ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Hadoop-ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ ΡΠΎ Spark Π½Π° 35 ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ°ΠΊ Π΅Π³ΠΎ Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ΄ ΡΠ°ΠΊΠΎΠΉ ΡΠ·ΠΊΠ΅ΠΉΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ YARN, Π±ΡΠ»ΠΎ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ. Π ΠΈΡΠΎΠ³Π΅, ΡΠ°Π·ΠΎΠ±ΡΠ°Π²ΡΠΈΡΡ ΠΈ ΠΏΡΠΎΠΉΠ΄Ρ ΠΏΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, ΡΠ΄Π΅Π»Π°Π»ΠΈ
ΠΡΠ΅Π΄ΡΡΡΠΎΡΠΈΡ
Π ΡΡΠΎΡ ΡΠ°Π· ΡΠ΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ β
ΠΡΠ΅ Π² ΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ Ρ ΠΎΡΠΎΡΠΎ. ΠΡΡΡΡ ΡΡΡΠΎΡΡ ΡΠ²ΠΎΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ. ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΡΡ «Π½ΠΎ»: Π²ΡΠ΅ Π½Π°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ½Ρ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π»Π°Π± ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΠΊΠ΅ΡΡ: ΡΡΠ°ΡΡΠ½ΠΈΠΊΡ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΉΡΠΈ Π² Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ, Π½Π°ΠΆΠ°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ βΠΡΠΎΠ²Π΅ΡΠΈΡΡβ, ΠΈ ΡΠ΅ΡΠ΅Π· ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π». Π ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠΎΠΉ Π»Π°Π±Ρ ΡΡΡΡΠΎΠ΅Π½Π° ΡΠ°ΠΊ: ΠΌΡ ΠΏΠΎΡΡΠ»Π°Π΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΡΡ Π² Kafka ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°, Π΄Π°Π»Π΅Π΅ Gobblin ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΡΡ Π½Π° HDFS, Π΄Π°Π»Π΅Π΅ Airflow Π±Π΅ΡΠ΅Ρ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΊΠ»Π°Π΄Π΅Ρ Π² ClickHouse. Π€ΠΈΡΠΊΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Airflow Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π² ΡΠ΅Π°Π»-ΡΠ°ΠΉΠΌΠ΅, ΠΎΠ½ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ: ΡΠ°Π· Π² 15 ΠΌΠΈΠ½ΡΡ Π±Π΅ΡΠ΅Ρ ΠΏΠ°ΡΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π·Π°ΠΊΠΈΠ΄ΡΠ²Π°Π΅Ρ.
ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡΡ ΠΈΡ
DAG ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎ Π½Π°ΡΠ΅ΠΌΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΠΊΠ΅ΡΠ° Π·Π΄Π΅ΡΡ ΠΈ ΡΠ΅ΠΉΡΠ°Ρ. ΠΠΎΠ³ΡΠ³Π»ΠΈΠ², Π²ΡΡΡΠ½ΠΈΠ»ΠΈ, ΡΡΠΎ Π΄Π»Ρ ΠΏΠΎΠ·Π΄Π½ΠΈΡ
Π²Π΅ΡΡΠΈΠΉ Airflow ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ experimental
, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π·Π²ΡΡΠΈΡ ΠΏΡΠ³Π°ΡΡΠ΅, Π½ΠΎ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡβ¦ ΠΠ΄ΡΡΠ³ Π²Π·Π»Π΅ΡΠΈΡ.
ΠΠ°Π»Π΅Π΅ ΠΎΠΏΠΈΡΠ΅ΠΌ Π²Π΅ΡΡ ΠΏΡΡΡ: ΠΎΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Airflow Π΄ΠΎ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ POST-Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡ DAG, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Experimental API. Π Π°Π±ΠΎΡΠ°ΡΡ Π±ΡΠ΄Π΅ΠΌ Ρ Ubuntu 16.04.
1. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Airflow
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ ΡΡΠΎΠΈΡ Python 3 ΠΈ virtualenv.
$ python3 --version
Python 3.6.6
$ virtualenv --version
15.2.0
ΠΡΠ»ΠΈ ΡΠ΅Π³ΠΎ-ΡΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π½Π΅Ρ, ΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Airflow.
$ 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_HOME
:
$ tree
.
βββ airflow.cfg
βββ unittests.cfg
Π£ Airflow Π΅ΡΡΡ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
(venv) $ airflow webserver --port 8081
Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΠ°ΡΡΡ Π² Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Π½Π° ΠΏΠΎΡΡΡ 8081 Π½Π° Ρ
ΠΎΡΡΠ΅, Π³Π΄Π΅ Airflow Π±ΡΠ» Π·Π°ΠΏΡΡΠ΅Π½, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: <hostname:8081>
.
2. Π Π°Π±ΠΎΡΠ° Ρ Experimental API
ΠΠ° ΡΡΠΎΠΌ Airflow Π½Π°ΡΡΡΠΎΠ΅Π½ ΠΈ Π³ΠΎΡΠΎΠ² ΠΊ ΡΠ°Π±ΠΎΡΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅ΡΠ΅ ΠΈ Experimental API. ΠΠ°ΡΠΈ ΡΠ΅ΠΊΠ΅ΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Ρ Π½Π° Python, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π°Π»Π΅Π΅ Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π±ΡΠ΄ΡΡ Π½Π° Π½Π΅ΠΌ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ requests
.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ API ΡΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΏΡΠΎΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΡΠ΅ΡΡΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ:
>>> import requests
>>> host = <your hostname>
>>> airflow_port = 8081 #Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΊΠΎΠΉ, Π° ΠΏΠΎ Π΄Π΅ΡΠΎΠ»ΡΡ 8080
>>> requests.get('http://{}:{}/{}'.format(host, airflow_port, 'api/experimental/test').text
'OK'
ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΡΠ²Π΅Ρ, ΡΠΎ ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π·Π°Ρ ΠΎΡΠΈΠΌ Π·Π°ΡΡΠΈΠ³Π΅ΡΠΈΡΡ 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()
ΠΠ°ΡΠ΅ΠΌ, Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΠΏΡΠ°Π²Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΡΠΈΠ³Π³Π΅Ρ DAGβΠ°.
>>> 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-Π·Π°ΠΏΡΠΎΡΠ°
Π‘Π°ΠΌ 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, ΠΏΡΡΠ°ΡΡΡ ΠΏΠΎΠΉΠΌΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΡΡ .
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com