Како Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΠΈ ДАГ ΠΎΠΊΠΈΠ΄Π°Ρ‡ Ρƒ Аирфлов-Ρƒ користСћи СкспСримСнтални АПИ

Π£ ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠΈ Π½Π°ΡˆΠΈΡ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π½ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ Π½Π°ΠΈΠ»Π°Π·ΠΈΠΌΠΎ Π½Π° Ρ‚Π΅ΡˆΠΊΠΎΡ›Π΅ Ρƒ Ρ€Π°Π΄Ρƒ са Π½Π΅ΠΊΠΈΠΌ Π°Π»Π°Ρ‚ΠΈΠΌΠ°. А Ρƒ Ρ‚Ρ€Π΅Π½ΡƒΡ‚ΠΊΡƒ ΠΊΠ°Π΄Π° ΠΈΡ… Π½Π°ΠΈΡ’Π΅ΠΌΠΎ, Π½Π΅ΠΌΠ° ΡƒΠ²Π΅ΠΊ Π΄ΠΎΠ²ΠΎΡ™Π½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ ΠΈ Ρ‡Π»Π°Π½Π°ΠΊΠ° који Π±ΠΈ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π΄Π° сС ΠΈΠ·Π±ΠΎΡ€ΠΈ са ΠΎΠ²ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΌ.

Π’Π°ΠΊΠΎ јС Π±ΠΈΠ»ΠΎ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 2015. Π³ΠΎΠ΄ΠΈΠ½Π΅, Π° користили смо Π₯Π°Π΄ΠΎΠΎΠΏ кластСр са Π‘ΠΏΠ°Ρ€ΠΊΠΎΠΌ Π·Π° 35 истоврСмСних корисника Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΡƒ Π‘ΠΈΠ³ Π”Π°Ρ‚Π° БпСциалист. НијС Π±ΠΈΠ»ΠΎ јасно ΠΊΠ°ΠΊΠΎ Π³Π° ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠΈΡ‚ΠΈ Π·Π° Ρ‚Π°ΠΊΠ°Π² кориснички ΡΠ»ΡƒΡ‡Π°Ρ˜ користСћи ИАРН. Као Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‚ΠΎΠ³Π°, Π½Π°ΠΊΠΎΠ½ ΡˆΡ‚ΠΎ су сами схватили ΠΈ ΠΏΡ€ΠΎΡˆΠ΅Ρ‚Π°Π»ΠΈ стазом, ΠΎΠ½ΠΈ су Ρ‚ΠΎ ΡƒΡ€Π°Π΄ΠΈΠ»ΠΈ пост Π½Π° Π₯Π°Π±Ρ€Π΅ Π° Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΈ ΠΈΠ·Π²ΠΎΡ’Π΅Π½Π° ΠœΠΎΡΡ†ΠΎΠ² Π‘ΠΏΠ°Ρ€ΠΊ ΠœΠ΅Π΅Ρ‚ΡƒΠΏ.

praistorija

Овај ΠΏΡƒΡ‚ Ρ›Π΅ΠΌΠΎ ΠΏΡ€ΠΈΡ‡Π°Ρ‚ΠΈ ΠΎ Π΄Ρ€ΡƒΠ³Π°Ρ‡ΠΈΡ˜Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΡƒ - Π”Π°Ρ‚Π° Π•Π½Π³ΠΈΠ½Π΅Π΅Ρ€. На ΡšΠ΅ΠΌΡƒ наши учСсници Π³Ρ€Π°Π΄Π΅ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅: Π»Π°ΠΌΠ±Π΄Π° ΠΈ ΠΊΠ°ΠΏΠ°. А Ρƒ Π»Π°ΠΌΠ΄Π±Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ, Аирфлов сС користи ΠΊΠ°ΠΎ Π΄Π΅ΠΎ Π³Ρ€ΡƒΠΏΠ½Π΅ ΠΎΠ±Ρ€Π°Π΄Π΅ Π·Π° прСнос Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π΅ са Π₯Π”Π€Π‘-Π° Π½Π° Π¦Π»ΠΈΡ†ΠΊΠ₯оусС.

Π‘Π²Π΅ јС Π³Π΅Π½Π΅Ρ€Π°Π»Π½ΠΎ Π΄ΠΎΠ±Ρ€ΠΎ. НСка Π³Ρ€Π°Π΄Π΅ својС Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π΅. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ β€žΠ°Π»ΠΈβ€œ: сви наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ су Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΡˆΠΊΠΈ Π½Π°ΠΏΡ€Π΅Π΄Π½ΠΈ Ρƒ смислу самог процСса ΡƒΡ‡Π΅ΡšΠ°. Π”Π° бисмо ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΈΡ˜Ρƒ, користимо аутоматскС ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅: учСсник Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΠ΄Π΅ Π½Π° свој Π»ΠΈΡ‡Π½ΠΈ Π½Π°Π»ΠΎΠ³, ΠΊΠ»ΠΈΠΊΠ½Π΅ Π½Π° Π΄ΡƒΠ³ΠΌΠ΅ β€žΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈβ€œ ΠΈ Π½Π°ΠΊΠΎΠ½ Π½Π΅ΠΊΠΎΠ³ Π²Ρ€Π΅ΠΌΠ΅Π½Π° Π²ΠΈΠ΄ΠΈ Π½Π΅ΠΊΡƒ врсту ΠΏΡ€ΠΎΡˆΠΈΡ€Π΅Π½Π΅ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ ΠΎ Ρ‚ΠΎΠΌΠ΅ ΡˆΡ‚Π° јС ΡƒΡ€Π°Π΄ΠΈΠΎ. И Ρƒ ΠΎΠ²ΠΎΠΌ Ρ‚Ρ€Π΅Π½ΡƒΡ‚ΠΊΡƒ ΠΏΠΎΡ‡ΠΈΡšΠ΅ΠΌΠΎ Π΄Π° приступамо нашСм ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€Π° ΠΎΠ²Π΅ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΈΡ˜Π΅ јС ΡƒΡ€Π΅Ρ’Π΅Π½Π° Π½Π° слСдСћи Π½Π°Ρ‡ΠΈΠ½: ΡˆΠ°Ρ™Π΅ΠΌΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈΡ… ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠšΠ°Ρ„ΠΊΠΈ учСсника, Π·Π°Ρ‚ΠΈΠΌ Π“ΠΎΠ±Π»ΠΈΠ½ прСноси овај ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ Π₯Π”Π€Π‘, Π·Π°Ρ‚ΠΈΠΌ Аирфлов ΡƒΠ·ΠΈΠΌΠ° овај ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈ ставља Π³Π° Ρƒ Π¦Π»ΠΈΡ†ΠΊΠ₯оусС. Π’Ρ€ΠΈΠΊ јС Ρƒ Ρ‚ΠΎΠΌΠ΅ ΡˆΡ‚ΠΎ Аирфлов Π½Π΅ ΠΌΠΎΡ€Π° Ρ‚ΠΎ Π΄Π° Ρ€Π°Π΄ΠΈ Ρƒ Ρ€Π΅Π°Π»Π½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Ρƒ, Π²Π΅Ρ› ΠΏΠΎ распорСду: јСдном сваких 15 ΠΌΠΈΠ½ΡƒΡ‚Π° ΡƒΠ·ΠΈΠΌΠ° Π³ΠΎΠΌΠΈΠ»Ρƒ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ поставља ΠΈΡ….

Π˜ΡΠΏΠΎΡΡ‚Π°Π²ΠΈΠ»ΠΎ сС Π΄Π° ΠΌΠΎΡ€Π°ΠΌΠΎ Π½Π΅ΠΊΠ°ΠΊΠΎ сами Π΄Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ ΡšΠΈΡ…ΠΎΠ² ДАГ Π½Π° наш Π·Π°Ρ…Ρ‚Π΅Π² Π΄ΠΎΠΊ Ρ‡Π΅ΠΊΠΊΠ΅Ρ€ Ρ€Π°Π΄ΠΈ ΠΎΠ²Π΄Π΅ ΠΈ сада. Π“ΡƒΠ³Π»Π°Ρ˜ΡƒΡ›ΠΈ, сазнали смо Π΄Π° Π·Π° каснијС Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Аирфлов-Π° ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ Ρ‚Π·Π² ЕкспСримСнтални АПИ. Π Π΅Ρ‡ experimental, Π½Π°Ρ€Π°Π²Π½ΠΎ, Π·Π²ΡƒΡ‡ΠΈ Π·Π°ΡΡ‚Ρ€Π°ΡˆΡƒΡ˜ΡƒΡ›Π΅, Π°Π»ΠΈ ΡˆΡ‚Π° Π΄Π° сС Ρ€Π°Π΄ΠΈ ... ОдјСдном сС ΡƒΠ·Π»Π΅Ρ‚ΠΈ.

Π—Π°Ρ‚ΠΈΠΌ Ρ›Π΅ΠΌΠΎ описати Ρ†Π΅ΠΎ ΠΏΡƒΡ‚: ΠΎΠ΄ ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ° Аирфлов-Π° Π΄ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡΠ°ΡšΠ° ПОБВ Π·Π°Ρ…Ρ‚Π΅Π²Π° који ΠΏΠΎΠΊΡ€Π΅Ρ›Π΅ ДАГ користСћи СкспСримСнтални АПИ. Π Π°Π΄ΠΈΡ›Π΅ΠΌΠΎ са Π£Π±ΡƒΠ½Ρ‚Ρƒ 16.04.

1. Π˜Π½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠ° Π²Π°Π·Π΄ΡƒΡ…Π°

Π₯ајдС Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠΎ Π΄Π° Π»ΠΈ ΠΈΠΌΠ°ΠΌΠΎ ΠŸΠΈΡ‚Ρ…ΠΎΠ½ 3 ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½Π².

$ 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) $

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊ Π²Π°Π·Π΄ΡƒΡ…Π°:

(venv) $ pip install airflow

Π’Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° којој смо Ρ€Π°Π΄ΠΈΠ»ΠΈ: 1.10.

Π‘Π°Π΄Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ˜ΡƒΠΌ airflow_home, Π³Π΄Π΅ Ρ›Π΅ сС Π½Π°Π»Π°Π·ΠΈΡ‚ΠΈ ДАГ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅ ΠΈ Π΄ΠΎΠ΄Π°Ρ†ΠΈ Аирфлов. Након ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ˜ΡƒΠΌΠ°, подСситС ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Ρƒ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ° AIRFLOW_HOME.

(venv) $ cd /path/to/my/airflow/workspace
(venv) $ mkdir airflow_home
(venv) $ export AIRFLOW_HOME=<path to airflow_home>

Π‘Π»Π΅Π΄Π΅Ρ›ΠΈ ΠΊΠΎΡ€Π°ΠΊ јС Π΄Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ која Ρ›Π΅ ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚ΠΈ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΠΈ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρ‚ΠΎΠΊΠ° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ Π‘ΠšΠ›ΠΈΡ‚Π΅-Ρƒ:

(venv) $ airflow initdb

Π‘Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρ›Π΅ Π±ΠΈΡ‚ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°Π½Π° Ρƒ airflow.db Π£ΠΎΠ±ΠΈΡ‡Π°Ρ˜Π΅Π½ΠΎ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π΄Π° Π»ΠΈ јС Аирфлов инсталиран:

$ 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.cfg Π² AIRFLOW_HOME:

$ tree
.
β”œβ”€β”€ airflow.cfg
└── unittests.cfg

Аирфлов ΠΈΠΌΠ° Π²Π΅Π± ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ. МоТС сС ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π΅:

(venv) $ airflow webserver --port 8081

Π‘Π°Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° приступитС Π²Π΅Π± ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΡƒ Ρƒ ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‡Ρƒ Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 8081 Π½Π° хосту Π³Π΄Π΅ јС Аирфлов Π±ΠΈΠΎ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚, ΠΎΠ²Π°ΠΊΠΎ: <hostname:8081>.

2. Π Π°Π΄ са СкспСримСнталним АПИ-јСм

На ΠΎΠ²ΠΎΠΌ Аирфлов јС конфигурисан ΠΈ спрСман Π·Π° Ρ€Π°Π΄. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ СкспСримСнтални АПИ. Наши Ρ‡Π΅ΠΊΠ΅Ρ€ΠΈ су написани Π½Π° ΠŸΠΈΡ‚Ρ…ΠΎΠ½-Ρƒ, Ρ‚Π°ΠΊΠΎ Π΄Π° Ρ›Π΅ Π΄Π°Ρ™Π΅ сви Π·Π°Ρ…Ρ‚Π΅Π²ΠΈ Π±ΠΈΡ‚ΠΈ Π½Π° ΡšΠ΅ΠΌΡƒ користСћи Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ requests.

Π£ ствари, АПИ Π²Π΅Ρ› Ρ€Π°Π΄ΠΈ Π·Π° Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Π΅ Π·Π°Ρ…Ρ‚Π΅Π²Π΅. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠ°Π² Π·Π°Ρ…Ρ‚Π΅Π² Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π΄Π° тСстиратС њСгов Ρ€Π°Π΄:

>>> import requests
>>> host = <your hostname>
>>> airflow_port = 8081 #Π² нашСм случаС Ρ‚Π°ΠΊΠΎΠΉ, Π° ΠΏΠΎ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Ρƒ 8080
>>> requests.get('http://{}:{}/{}'.format(host, airflow_port, 'api/experimental/test').text
'OK'

Ако стС Π΄ΠΎΠ±ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠ²Ρƒ ΠΏΠΎΡ€ΡƒΠΊΡƒ ΠΊΠ°ΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€, Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π° свС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΠ΅.

ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, ΠΊΠ°Π΄Π° ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ ДАГ, Π½Π°ΠΈΠ»Π°Π·ΠΈΠΌΠΎ Π½Π° Ρ‡ΠΈΡšΠ΅Π½ΠΈΡ†Ρƒ Π΄Π° сС ΠΎΠ²Π° врста Π·Π°Ρ…Ρ‚Π΅Π²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ ΡƒΠΏΡƒΡ‚ΠΈΡ‚ΠΈ Π±Π΅Π· Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅.

Π”Π° бистС Ρ‚ΠΎ ΡƒΡ€Π°Π΄ΠΈΠ»ΠΈ, ΠΌΠΎΡ€Π°Ρ›Π΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ Π½ΠΈΠ· Ρ€Π°Π΄ΡšΠΈ.

ΠŸΡ€Π²ΠΎ, ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ ΠΎΠ²ΠΎ Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Ρƒ:

[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. ΠŸΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ ПОБВ Π·Π°Ρ…Ρ‚Π΅Π²Π°

Π‘Π°ΠΌ ПОБВ Π·Π°Ρ…Ρ‚Π΅Π² Ρ›Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π°Ρ‚ΠΈ ΠΎΠ²Π°ΠΊΠΎ:

>>> 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'

Π—Π°Ρ…Ρ‚Π΅Π² јС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ’Π΅Π½.

Π‘Ρ…ΠΎΠ΄Π½ΠΎ Ρ‚ΠΎΠΌΠ΅, ΠΎΠ½Π΄Π° дајСмо ДАГ-Ρƒ ΠΌΠ°Π»ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π° Π΄Π° ΠΎΠ±Ρ€Π°Π΄ΠΈ ΠΈ ΡƒΠΏΡƒΡ‚ΠΈ Π·Π°Ρ…Ρ‚Π΅Π² Ρ‚Π°Π±Π΅Π»ΠΈ Π¦Π»ΠΈΡ†ΠΊΠ₯оусС, ΠΏΠΎΠΊΡƒΡˆΠ°Π²Π°Ρ˜ΡƒΡ›ΠΈ Π΄Π° ΡƒΡ…Π²Π°Ρ‚ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

Π’Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° јС Π·Π°Π²Ρ€ΡˆΠ΅Π½Π°.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€