แฉแแแแ แกแแแแแแแแแแแแแแ แแ แแแ แแแแแแก แแแแแแแแแแกแแก แแแ แแแแฃแแแ แแแฌแงแแแแแ แกแแ แแฃแแแแแก แแแ แแแแฃแ แแแกแขแ แฃแแแแขแแแแแ แแฃแจแแแแแก แแฃแแฎแแ. แแ แแ แแแแแแขแจแ, แ แแแแกแแช แแแ แแฎแแแแแแ, แงแแแแแแแแก แแ แแ แแก แกแแแแแ แแกแ แแแแฃแแแแขแแชแแ แแ แกแขแแขแแแแ, แ แแแแแแแช แแแแแฎแแแ แแแแ แแ แแ แแแแแแแก แแแแแแ แแแแจแ.
แแกแ แแงแ, แแแแแแแแแ, 2015 แฌแแแก แแ แฉแแแ แแแแแแแงแแแแ Hadoop แแแแกแขแแ แ Spark-แแแ แแ แแแ 35 แแ แแแ แแฃแแ แแแแฎแแแ แแแแแกแแแแก Big Data Specialist แแ แแแ แแแแแ. แแแฃแแแแแ แ แแงแ, แ แแแแ แฃแแแ แแแแแแแแแก แแก แแกแแแ แแแแฎแแแ แแแแแก แจแแแแฎแแแแแกแแแแก YARN-แแก แแแแแงแแแแแแ. แจแแแแแแ, แแแ แแแแ แแแแแก แแ แกแแแฃแแแ แ แแแแ แแแแแ แแก แแแ
แฌแแแแแกแขแแ แแ
แแแฏแแ แแ แแแแกแฎแแแแแแฃแ แแ แแแ แแแแแ แแแกแแฃแแ แแแ -
แแแแแแแ แงแแแแแคแแ แ แแแ แแแ. แแแ, แแแจแแแแ แแแแแแแแ แแแแกแแแแแแแ. แแฃแแชแ, แแ แแก แแ แแ โแแแแ แแโ: แงแแแแ แฉแแแแ แแ แแแ แแแ แขแแฅแแแแแแแฃแ แแ แแแแแแแแ แแแฃแแแ แแแแแ แกแแกแฌแแแแ แแ แแชแแกแแก แแแแแกแแแ แแกแแ. แแแแแ แแขแแ แแแก แจแแกแแแแฌแแแแแแ, แฉแแแ แแแงแแแแแ แแแขแแแแขแฃแ แฅแแแ แแแก: แแแแแฌแแแแก แฃแแแ แแแแแแแแแก แแแก แแแ แแ แแแแแ แแจแแ, แแแแฌแแแแฃแแแ แฆแแแแแแ โแจแแแแฌแแแแโ แแ แแแ แแแแฃแแ แแแ แแแแแก แจแแแแแ แแก แฎแแแแแก แแ แแแแแ แแแคแแ แแแแแฃแ แแแแแฎแแแฃแ แแแแก แแแแก แจแแกแแฎแแ, แ แแช แแแแแแแ. แแ แกแฌแแ แแ แแ แแ แแก แแแฌแงแแแ แฉแแแแก แแ แแแแแแแก.
แแ แแแแแ แแขแแ แแแก แจแแแแฌแแแแ แฎแแแแ แจแแแแแแแแแ แแ: แฉแแแ แแฃแแแแแแแ แกแแแแแขแ แแแ แแแแแชแแแแ แแแแแขแก แแแแแฌแแแแก แแแคแแแก, แจแแแแแ Gobblin แแแแแกแชแแแก แแ แแแแแชแแแแ แแแแแขแก HDFS-แจแ, แจแแแแแ Airflow แแฆแแแก แแ แแแแแชแแแแ แแแแแขแก แแ แแแแก แแแก ClickHouse-แจแ. แฎแ แแแ แแแแจแแ, แ แแ Airflow-แก แแ แกแญแแ แแแแ แแแแก แแแแแแแแ แ แแแแฃแ แแ แแจแ, แแก แแแแก แแแแแแแก แแ แแคแแแแ: แงแแแแ 15 แฌแฃแแจแ แแ แแฎแแ แกแญแแ แแแแ แคแแแแแแแก แแแแแฃแแก แแ แแขแแแ แแแแก แแแ.
แแแแแแแก, แ แแ แฉแแแ แแแญแแ แแแแ แ แแแแ แแ แแแแแแฅแขแแฃแ แแ แแแแ DAG แฉแแแแ แแแแฎแแแแแ, แกแแแแ แจแแแแฌแแแแ แแฃแจแแแแก แแฅ แแ แแฎแแ. แแฃแแแจแ แแแแแ แแแแแ, แ แแ Airflow-แแก แจแแแแแแแ แแแ แกแแแแแกแแแแก แแ แกแแแแแก แ.แฌ experimental
แ แ แแฅแแ แฃแแแ, แกแแจแแแแแ แแฆแแ แก, แแแแ แแ แ แ แแฅแแ... แฃแชแแ แแคแ แแแแแแ.
แจแแแแแแ, แฉแแแ แแฆแแฌแแ แ แแแแ แแแแก: Airflow-แแก แแแงแแแแแแแแ POST แแแแฎแแแแแก แแแแแ แแ แแแแแแ, แ แแแแแแช แแฌแแแแก DAG-แก แแฅแกแแแ แแแแแขแฃแแ API-แแก แแแแแงแแแแแแ. แฉแแแ แแแแฃแจแแแแแ 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) $
แฐแแแ แแก แแแแแแแก แแแงแแแแแ:
(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 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. แแฅแกแแแ แแแแแขแฃแ 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-แก แแแ แแแแฃแแ แแ แแแก แแแกแแแฃแจแแแแแแแ แแ แแแแฎแแแแแก แแแแแแแแแก ClickHouse แชแฎแ แแแแ, แแชแแแแแแ แแแแญแแ แแ แกแแแแแขแ แแแ แแแแแชแแแแ แแแแแขแ.
แแแแแกแขแฃแ แแแ แแแกแ แฃแแแ.
แฌแงแแ แ: www.habr.com