เช เชฎเชพเชฐเชพ เชถเซเชเซเชทเชฃเชฟเช เชเชพเชฐเซเชฏเชเซเชฐเชฎเซ เชคเซเชฏเชพเชฐ เชเชฐเชคเซ เชตเชเชคเซ, เช เชฎเซ เชธเชฎเชฏเชพเชเชคเชฐเซ เช เชฎเซเช เชธเชพเชงเชจเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพเชฎเชพเช เชฎเซเชถเซเชเซเชฒเซเชเชจเซ เชธเชพเชฎเชจเซ เชเชฐเซเช เชเซเช. เช เชจเซ เช เชเซเชทเชฃเซ เชเซเชฏเชพเชฐเซ เชเชชเชฃเซ เชคเซเชฎเชจเซ เชธเชพเชฎเชจเซ เชเชฐเซเช เชเซเช, เชคเซเชฏเชพเช เชนเชเชฎเซเชถเชพ เชชเซเชฐเชคเชพ เชฆเชธเซเชคเชพเชตเซเชเซ เช เชจเซ เชฒเซเชเซ เชจเชฅเซ เชเซ เชเซ เช เชฎเชจเซ เช เชธเชฎเชธเซเชฏเชพเชจเซ เชธเชพเชฎเชจเซ เชเชฐเชตเชพเชฎเชพเช เชฎเชฆเชฆ เชเชฐเซ.
เช เชเซเชธ เชนเชคเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, 2015 เชฎเชพเช, เช
เชจเซ โเชฌเชฟเช เชกเซเชเชพ เชธเซเชชเซเชถเชฟเชฏเชพเชฒเชฟเชธเซเชโ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช
เชฎเซ เชเช เชธเชพเชฅเซ 35 เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชธเซเชชเชพเชฐเซเช เชธเชพเชฅเซเชจเชพ เชนเชกเซเชช เชเซเชฒเชธเซเชเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ เชนเชคเซ. เชฏเชพเชฐเซเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชตเชพ เชเชชเชฏเซเช เชเซเชธ เชฎเชพเชเซ เชคเซเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชคเซเชฏเชพเชฐ เชเชฐเชตเซเช เชคเซ เชธเซเชชเชทเซเช เชจ เชนเชคเซเช. เช
เชเชคเซ, เชคเซ เชถเซเชงเซ เชเชพเชขเซเชฏเชพ เช
เชจเซ เช
เชฎเชพเชฐเซ เชเชพเชคเซ เช เชฎเชพเชฐเซเช เชชเชฐ เชเชพเชฒเซเชฏเชพ, เช
เชฎเซ เชเชฐเซเชฏเซเช
เชชเซเชฐเชพเชเซเชคเชฟเชนเชพเชธเชฟเช
เช เชตเชเชคเซ เชเชชเชฃเซ เชเช เช
เชฒเช เชชเซเชฐเซเชเซเชฐเชพเชฎ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซเชถเซเช -
เชฌเชงเซเช เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชธเชพเชฐเซเช เชเซ. เชคเซเชฎเชจเซ เชชเซเชคเชพเชจเซ เชชเชพเชเชชเชฒเชพเชเชจ เชฌเชจเชพเชตเชตเชพ เชฆเซ. เชเซ เชเซ, เชคเซเชฏเชพเช เชเช "เชชเชฐเชเชคเซ" เชเซ: เช เชฎเชพเชฐเชพ เชฌเชงเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชถเซเชเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเชพ เชฆเซเชทเซเชเชฟเชเซเชฃเชฅเซ เชคเชเชจเซเชเซ เชฐเซเชคเซ เช เชฆเซเชฏเชคเชจ เชเซ. เชฒเซเชฌ เชคเชชเชพเชธเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเซเชเชฐเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช: เชธเชนเชญเชพเชเซเชจเซ เชคเซเชจเชพ เชตเซเชฏเชเซเชคเชฟเชเชค เชเชพเชคเชพเชฎเชพเช เชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, "เชเซเช" เชฌเชเชจเชจเซ เชเซเชฒเชฟเช เชเชฐเซ, เช เชจเซ เชฅเซเชกเชพ เชธเชฎเชฏ เชชเชเซ เชคเซเชฃเซ เชเซ เชเชฐเซเชฏเซเช เชคเซเชจเชพ เชชเชฐ เชเซเช เชชเซเชฐเชเชพเชฐเชจเซ เชตเชฟเชธเซเชคเซเชค เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเซเช เชเซ. เช เชจเซ เชคเซ เช เชเซเชทเชฃเซ เชเซ เชเซ เชเชชเชฃเซ เชเชชเชฃเซ เชธเชฎเชธเซเชฏเชพเชจเซ เชธเชเชชเชฐเซเช เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเช เชเซเช.
เช เชฒเซเชฌเชจเซ เชเชเชพเชธเชฃเซ เช เชฐเซเชคเซ เชฐเชเชพเชฏเซเชฒ เชเซ: เช เชฎเซ เชธเชนเชญเชพเชเซเชจเชพ เชเชพเชซเซเชเชพเชจเซ เชเชเชเซเชฐเซเชฒ เชกเซเชเชพ เชชเซเชเซเช เชฎเซเชเชฒเซเช เชเซเช, เชชเชเซ เชเซเชฌเซเชฒเชฟเชจ เช เชกเซเชเชพ เชชเซเชเซเชเชจเซ HDFS เชชเชฐ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเซ เชเซ, เชชเชเซ เชเชฐเชซเซเชฒเซ เช เชกเซเชเชพ เชชเซเชเซเช เชฒเซ เชเซ เช เชจเซ เชคเซเชจเซ เชเซเชฒเชฟเชเชนเชพเชเชธเชฎเชพเช เชฎเซเชเซ เชเซ. เชฏเซเชเซเชคเชฟ เช เชเซ เชเซ เชเชฐเชซเซเชฒเซเชจเซ เชตเชพเชธเซเชคเชตเชฟเช เชธเชฎเชฏเชฎเชพเช เช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ, เชคเซ เชถเซเชกเซเชฏเซเชฒ เช เชจเซเชธเชพเชฐ เชเชฐเซ เชเซ: เชฆเชฐ 15 เชฎเชฟเชจเชฟเชเซ เชคเซ เชซเชพเชเชฒเซเชจเซ เชธเชฎเซเชน เชฒเซ เชเซ เช เชจเซ เชคเซเชจเซ เช เชชเชฒเซเชก เชเชฐเซ เชเซ.
เชคเซ เชคเชพเชฐเชฃ เชเชชเซ เชเซ เชเซ เช
เชฎเชพเชฐเซ เช
เชฎเชพเชฐเซ เชตเชฟเชจเชเชคเซ เชชเชฐ เชเซเชเช เชฐเซเชคเซ เชคเซเชฎเชจเชพ DAG เชจเซ เชเซเชฐเชฟเชเชฐ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซเชฏเชพเชฐเซ เชเซเชเชฐ เช
เชนเซเช เช
เชจเซ เช
เชคเซเชฏเชพเชฐเซ เชเชพเชฒเซ เชฐเชนเซเชฏเซเช เชเซ. เชเซเชเชฒเชฟเชเช เชเชฐเซเชฏเชพ เชชเชเซ, เช
เชฎเชจเซ เชเชพเชฃเชตเชพ เชฎเชณเซเชฏเซเช เชเซ เชเชฐเชซเซเชฒเซเชจเชพ เชชเชเซเชจเชพ เชธเชเชธเซเชเชฐเชฃเซ เชฎเชพเชเซ เชเชนเซเชตเชพเชคเชพ เชเซ experimental
, เช
เชฒเชฌเชคเซเชค, เชคเซ เชกเชฐเชพเชฎเชฃเซ เชฒเชพเชเซ เชเซ, เชชเชฐเชเชคเซ เชถเซเช เชเชฐเชตเซเช... เช
เชเชพเชจเช เชคเซ เชฌเชเชง เชฅเช เชเชพเชฏ เชเซ.
เชเชเชณ, เช เชฎเซ เชธเชฎเชเซเชฐ เชชเชพเชฅเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซเชถเซเช: เชเชฐเชซเซเชฒเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชฅเซ เชฒเชเชจเซ POST เชตเชฟเชจเชเชคเซ เชเชจเชฐเซเช เชเชฐเชตเชพ เชธเซเชงเซ เชเซ เชชเซเชฐเชพเชฏเซเชเชฟเช API เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ DAG เชจเซ เชเซเชฐเชฟเชเชฐ เชเชฐเซ เชเซ. เช เชฎเซ เชเชฌเซเชจเซเชเซ 16.04 เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซเชถเซเช.
1. เชเชฐเชซเซเชฒเซ เชเชจเซเชธเซเชเซเชฒเซเชถเชจ
เชเชพเชฒเซ เชคเชชเชพเชธ เชเชฐเซเช เชเซ เชเชชเชฃเซ เชชเชพเชธเซ Python 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) $
เชเชฐเชซเซเชฒเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ:
(venv) $ pip install airflow
เช เชฎเซ เชเซ เชธเชเชธเซเชเชฐเชฃ เชชเชฐ เชเชพเชฎ เชเชฐเซเชฏเซเช เชเซ: 1.10.
เชนเชตเซ เชเชชเชฃเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ airflow_home
, เชเซเชฏเชพเช DAG เชซเชพเชเชฒเซ เช
เชจเซ เชเชฐเชซเซเชฒเซ เชชเซเชฒเชเชเชจเซเชธ เชธเซเชฅเชฟเชค เชนเชถเซ. เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเซเชฏเชพ เชชเชเซ, เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒ เชธเซเช เชเชฐเซ 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 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. เชชเซเชฐเชพเชฏเซเชเชฟเช API เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช
เช เชฌเชฟเชเชฆเซเช, เชเชฐเชซเซเชฒเซ เชเซเช เชตเซเชฒ เชเซ เช
เชจเซ เชเชตเชพ เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เชเซ. เชเซ เชเซ, เช
เชฎเชพเชฐเซ เชชเซเชฐเชพเชฏเซเชเชฟเช API เชเชฒเชพเชตเชตเชพเชจเซ เชชเชฃ เชเชฐเซเชฐ เชเซ. เช
เชฎเชพเชฐเชพ เชเซเชเชฐเซเชธ เชชเชพเชฏเชฅเซเชจเชฎเชพเช เชฒเชเซเชฒเชพ เชเซ, เชคเซเชฅเซ เชเชเชณ เชฌเชงเซ เชตเชฟเชจเชเชคเซเช เชฒเชพเชเชฌเซเชฐเซเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชฎเชพเช เชนเชถเซ 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 เชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เช เชจเซ เชเซเชฒเชฟเชเชนเชพเชเชธ เชเซเชฌเชฒเชจเซ เชตเชฟเชจเชเชคเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชฅเซเชกเซ เชธเชฎเชฏ เชเชชเซเช เชเซเช, เชจเชฟเชฏเชเชคเซเชฐเชฃ เชกเซเชเชพ เชชเซเชเซเชเชจเซ เชชเชเชกเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช เชเซเช.
เชคเชชเชพเชธ เชชเซเชฐเซเชฃ.
เชธเซเชฐเซเชธ: www.habr.com