ื•ื•ื™ ืฆื• ืžืึทื›ืŸ ืึท DAG ืฆื™ื ื’ืœ ืื™ืŸ ืึทื™ืจืคืœืึธื•ื• ื ื™ืฆืŸ ื“ื™ ืขืงืกืคึผืขืจื™ืžืขื ื˜ืึทืœ ืึทืคึผื™

ื•ื•ืขืŸ ืžื™ืจ ืฆื•ื’ืจื™ื™ื˜ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ืœื“ื•ื ื’ืงืจื™ื™ื– ืžื’ื™ืœื”, ืžื™ืจ ืคึผื™ืจื™ืึทื“ื™ืงืœื™ ื˜ืจืขืคืŸ ืฉื•ื•ืขืจื™ืงื™ื™ื˜ืŸ ืื™ืŸ ื˜ืขืจืžื™ื ืขืŸ ืคื•ืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื–ื™ื›ืขืจ ืžื›ืฉื™ืจื™ื. ืื•ืŸ ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ื•ื•ืขืŸ ืžื™ืจ ื˜ืจืขืคืŸ ื–ื™ื™, ืขืก ืื™ื– ื ื™ื˜ ืฉื˜ืขื ื“ื™ืง ื’ืขื ื•ื’ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืื•ืŸ ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ืึธืก ื•ื•ืึธืœื˜ ื”ืขืœืคึฟืŸ ืื•ื ื“ื– ืงืึธืคึผืข ืžื™ื˜ ื“ืขื ืคึผืจืึธื‘ืœืขื.

ื“ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ืคืึทืœ, ืœืžืฉืœ, ืื™ืŸ 2015, ืื•ืŸ ื‘ืขืฉืึทืก ื“ื™ "ื‘ื™ื’ ื“ืึทื˜ืึท ืžื•ืžื›ืข" ืคึผืจืึธื’ืจืึทื ืžื™ืจ ื’ืขื•ื•ื™ื™ื ื˜ ืึท Hadoop ืงื ื•ื™ืœ ืžื™ื˜ ืกืคึผืึทืจืง ืคึฟืึทืจ 35 ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืก ื ื™ืฆืขืจืก. ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื ื™ื˜ ืงืœืึธืจ ื•ื•ื™ ืฆื• ืฆื•ื’ืจื™ื™ื˜ืŸ ืขืก ืคึฟืึทืจ ืึทื–ืึท ืึท ืคืึทืœ ื ื™ืฆืŸ YARN. ืฆื•ื ืกื•ืฃ, ื•ื•ืขืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืขืก ืื•ื™ืกื’ืขืคื•ื ืขืŸ ืื•ืŸ ื’ืขื’ืื ื’ืขืŸ ื“ืขื ื•ื•ืขื’ ืื•ื™ืฃ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืŸ, ืžื™ืจ ื”ืื‘ืŸ ืคึผืึธืกื˜ืŸ ืื•ื™ืฃ Habrรฉ ืื•ืŸ ืื•ื™ืš ื’ืขื˜ืืŸ ื‘ื™ื™ึท ืžืึธืกืงื•ื•ืข ืกืคึผืึทืจืง ืžื™ื˜ืึทืคึผ.

ืคึผืจืขื”ื™ืกื˜ืึธืจื™

ื“ืึธืก ืžืึธืœ ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ืึท ืึทื ื“ืขืจืฉ ืคึผืจืึธื’ืจืึทื - ื“ืึทื˜ืึท ืขื ื’ื™ื ืขืขืจ. ืื•ื ื“ื–ืขืจ ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ ื‘ื•ื™ืขืŸ ืฆื•ื•ื™ื™ ื˜ื™ื™ืคึผืก ืคื•ืŸ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืื•ื™ืฃ ืื™ื: ืœืึทืžื‘ื“ืึท ืื•ืŸ ืงืึทืคึผืึท. ืื•ืŸ ืื™ืŸ ื“ื™ ืœืึทืžื“ื‘ืึท ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ, ื•ื•ื™ ืึท ื˜ื™ื™ืœ ืคื•ืŸ ืคึผืขืงืœ ืคึผืจืึทืกืขืกื™ื ื’, ืึทื™ืจืคืœืึธื•ื• ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืึทืจื™ื‘ืขืจืคื™ืจืŸ ืœืึธื’ืก ืคื•ืŸ HDFS ืฆื• ClickHouse.

ืืœืขืก ืื™ื– ื‘ื›ืœืœ ื’ื•ื˜. ื–ืืœ ื–ื™ื™ ื‘ื•ื™ืขืŸ ื–ื™ื™ืขืจ ืื™ื™ื’ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื–. ืึธื‘ืขืจ, ืขืก ืื™ื– ืึท "ืึธื‘ืขืจ": ืึทืœืข ืื•ื ื“ื–ืขืจ ืžื’ื™ืœื” ื–ืขื ืขืŸ ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ืงืึทืœื™ ืึทื•ื•ืึทื ืกื™ืจื˜ืข ืคึฟื•ืŸ ื“ื™ ืคื•ื ื˜ ืคื•ืŸ ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ื“ื™ ืœืขืจื ืขืŸ ืคึผืจืึธืฆืขืก ื–ื™ืš. ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืœืึทื‘ืึธืจืึทื˜ืึธืจื™ืข, ืžื™ืจ ื ื•ืฆืŸ ืึธื˜ืึทืžืึทื˜ื™ืง ื˜ืฉืขืงืงืขืจืก: ื“ืขืจ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ื“ืึทืจืฃ ื’ื™ื™ืŸ ืฆื• ื–ื™ื™ืŸ ืคืขืจื–ืขื ืœืขื›ืข ื—ืฉื‘ื•ืŸ, ื’ื™ื˜ ื“ื™ "ื˜ืฉืขืง" ืงื ืขืคึผืœ, ืื•ืŸ ื ืึธืš ืขื˜ืœืขื›ืข ืžืึธืœ ืขืจ ื–ืขื˜ ืขื˜ืœืขื›ืข ืขืงืกื˜ืขื ื“ืขื“ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืื•ื™ืฃ ื•ื•ืึธืก ืขืจ ื”ืื˜ ื’ืขื˜ืืŸ. ืื•ืŸ ืขืก ืื™ื– ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ืึทื– ืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ืฆื• ืฆื•ื’ืึทื ื’ ืื•ื ื“ื–ืขืจ ืคึผืจืึธื‘ืœืขื.

ื“ื™ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ืขื ืœืึทื‘ ืื™ื– ืกื˜ืจืึทืงื˜ืฉืขืจื“ ื•ื•ื™ ื“ืึธืก: ืžื™ืจ ืฉื™ืงืŸ ืึท ืงืึธื ื˜ืจืึธืœ ื“ืึทื˜ืŸ ืคึผืึทืงืึทื˜ ืฆื• ื“ื™ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ืก ืงืึทืคืงืึท, ื“ืขืžืึธืœื˜ ื’ืึธื‘ืœื™ืŸ ื˜ืจืึทื ืกืคืขืจืก ื“ืขื ื“ืึทื˜ืŸ ืคึผืึทืงืึทื˜ ืฆื• HDFS, ืื•ืŸ ืึทื™ืจืคืœืึธื•ื• ื ืขืžื˜ ื“ืขื ื“ืึทื˜ืŸ ืคึผืึทืงืึทื˜ ืื•ืŸ ืœื™ื™ื’ื˜ ืขืก ืื™ืŸ ืงืœื™ืงื›ืึธื•ืกืข. ื“ืขืจ ืงื•ื ืฅ ืื™ื– ืึทื– ืึทื™ืจืคืœืึธื•ื• ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืฆื™ื™ื˜, ืขืก ื˜ื•ื˜ ืขืก ืœื•ื™ื˜ ืึท ืคึผืœืึทืŸ: ื™ืขื“ืขืจ 15 ืžื™ื ื•ื˜ ืขืก ื ืขืžื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื˜ืขืงืขืก ืื•ืŸ ื•ืคึผืœืึธืึทื“ืก ื–ื™ื™.

ืขืก ื•ื•ืฒึทื–ื˜ ื–ื™ืš ืื•ื™ืก, ืึทื– ืžื™ืจ ื“ืึทืจืคึฟืŸ ื–ื™ืš ืึทืœื™ื™ืŸ ืื•ื™ืคึฟืŸ ืคึฟืึทืจืœืึทื ื’ ืฆื• ืฆื™ื ื’ืœ ื–ื™ื™ืขืจ DAG ื‘ืฉืขืช ื“ืขืจ ื˜ืฉืขืงืขืจ ืœื•ื™ืคึฟื˜ ื“ืึธ ืื•ืŸ ืื™ืฆื˜. ื ืึธืš ื’ืึธืึธื’ืœื™ื ื’, ืžื™ืจ ื’ืขืคึฟื•ื ืขืŸ ืึทื– ืคึฟืึทืจ ืฉืคึผืขื˜ืขืจ ื•ื•ืขืจืกื™ืขืก ืคื•ืŸ ืึทื™ืจืคืœืึธื•ื• ืขืก ืื™ื– ืึท ืึทื–ื•ื™ ื’ืขืจื•ืคืขื ืข ืขืงืกืคึผืขืจื™ืžืขื ื˜ืึทืœ ืึทืคึผื™. ื“ื™ ื•ื•ืึธืจื˜ experimental, ืคื•ืŸ ืงื•ืจืก, ืขืก ืกืึธื•ื ื“ืก ืกืงืขืจื™, ืึธื‘ืขืจ ื•ื•ืึธืก ืฆื• ื˜ืึธืŸ ... ืคึผืœื•ืฆืœื™ื ื’ ืขืก ื ืขืžื˜ ืึทื•ื•ืขืง.

ื•ื•ื™ื™ึทื˜ืขืจ, ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ื’ืื ืฆืข ื“ืจืš: ืคื•ืŸ ื™ื ืกื˜ืึธืœื™ื ื’ ืึทื™ืจืคืœืึธื•ื• ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ืึท POST ื‘ืขื˜ืŸ ื•ื•ืึธืก ื˜ืจื™ื’ืขืจื– ื“ื™ DAG ื ื™ืฆืŸ ื“ื™ ืขืงืกืคึผืขืจื™ืžืขื ื˜ืึทืœ ืึทืคึผื™. ืžื™ืจ ื•ื•ืขืœืŸ ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ Ubuntu 16.04.

1. ืึทื™ืจืคืœืึธื•ื• ื™ื ืกื˜ืึทืœื™ืจื•ื ื’

ืœืึธืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืึทื– ืžื™ืจ ื”ืึธื‘ืŸ 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 default.

ืœืึธืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืื•ื™ื‘ 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 ืื•ื™ืฃ ื“ืขืจ ื‘ืึทืœืขื‘ืึธืก ื•ื•ื• ืึทื™ืจืคืœืึธื•ื• ืื™ื– ืคืœื™ืกื ื“ื™ืง, ืœืžืฉืœ: <hostname:8081>.

2. ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืขืงืกืคึผืขืจื™ืžืขื ื˜ืึทืœ ืึทืคึผื™

ืื™ืŸ ื“ืขื ืคื•ื ื˜, Airflow ืื™ื– ืงืึทื ืคื™ื’ื™ืขืจื“ ืื•ืŸ ื’ืจื™ื™ื˜ ืฆื• ื’ื™ื™ืŸ. ืึธื‘ืขืจ, ืžื™ืจ ืื•ื™ืš ื“ืึทืจืคึฟืŸ ืฆื• ืœื•ื™ืคืŸ ื“ื™ ืขืงืกืคึผืขืจื™ืžืขื ื˜ืึทืœ ืึทืคึผื™. ืื•ื ื“ื–ืขืจ ื˜ืฉืขืงืงืขืจืก ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืคึผื™ื˜ื”ืึธืŸ, ืึทื–ื•ื™ ืึทืœืข ืจื™ืงื•ื•ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื™ืŸ ืขืก ืžื™ื˜ ื“ื™ ื‘ื™ื‘ืœื™ืึธื˜ืขืง requests.

ืื™ืŸ ืคืึทืงื˜, ื“ื™ ืึทืคึผื™ ืฉื•ื™ืŸ ืึทืจื‘ืขื˜ ืคึฟืึทืจ ืคึผืฉื•ื˜ ืจื™ืงื•ื•ืขืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืขื ื‘ืงืฉื” ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ื–ื™ื™ึทืŸ ืึธืคึผืขืจืึทืฆื™ืข:

>>> 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 ื‘ืขื˜ืŸ ื–ื™ืš ื•ื•ืขื˜ ืงื•ืงืŸ ื•ื•ื™ ื“ืึธืก:

>>> 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 ื˜ื™ืฉ, ื˜ืจื™ื™ื ื’ ืฆื• ื›ืึทืคึผืŸ ื“ื™ ืงืึธื ื˜ืจืึธืœ ื“ืึทื˜ืŸ ืคึผืึทืงืึทื˜.

ื˜ืฉืขืง ื’ืขืขื ื“ื™ืงื˜.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’