āĻāĻŽāĻžāĻĻā§āĻ° āĻļāĻŋāĻā§āĻˇāĻžāĻŽā§āĻ˛āĻ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ¸āĻ°āĻā§āĻāĻžāĻŽāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽā§āĻŽā§āĻā§āĻ¨ āĻšāĻāĨ¤ āĻāĻŦāĻ āĻāĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§ āĻ¯āĻāĻ¨ āĻāĻŽāĻ°āĻž āĻ¤āĻžāĻĻā§āĻ° āĻŽā§āĻā§āĻŽā§āĻāĻŋ āĻšāĻ, āĻ¸ā§āĻāĻžāĻ¨ā§ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻ¯āĻĨā§āĻˇā§āĻ āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻāĻŦāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻĨāĻžāĻā§ āĻ¨āĻž āĻ¯āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻāĻŋ āĻŽā§āĻāĻžāĻŦā§āĻ˛āĻž āĻāĻ°āĻ¤ā§ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°āĻŦā§āĨ¤
āĻāĻāĻŋ āĻāĻŋāĻ˛, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, 2015 āĻ¸āĻžāĻ˛ā§, āĻāĻŦāĻ "āĻŦāĻŋāĻ āĻĄā§āĻāĻž āĻ¸ā§āĻĒā§āĻļāĻžāĻ˛āĻŋāĻ¸ā§āĻ" āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŽāĻ°āĻž 35 āĻāĻ¨ āĻāĻāĻ¯ā§āĻā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ āĻ¸āĻš āĻāĻāĻāĻŋ āĻšā§āĻ¯āĻžāĻĄā§āĻĒ āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻāĻŋāĨ¤ āĻāĻ¯āĻŧāĻžāĻ°ā§āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¤āĻž āĻĒāĻ°āĻŋāĻˇā§āĻāĻžāĻ° āĻāĻŋāĻ˛ āĻ¨āĻžāĨ¤ āĻļā§āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤, āĻāĻāĻŋ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻĒāĻĨā§ āĻšāĻžāĻāĻāĻž, āĻāĻŽāĻ°āĻž āĻ¤āĻž āĻāĻ°ā§āĻāĻŋ
āĻĒā§āĻ°āĻžāĻāĻāĻ¤āĻŋāĻšāĻžāĻ¸āĻŋāĻ
āĻāĻŦāĻžāĻ° āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ°ā§āĻŽāĻ¸ā§āĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻĨāĻž āĻŦāĻ˛āĻŦ-
āĻ¸āĻŦāĻāĻŋāĻā§āĻ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻžāĻ˛ā§āĨ¤ āĻ¤āĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻĒāĻžāĻāĻĒāĻ˛āĻžāĻāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĻāĻŋāĻ¨āĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻāĻāĻŋ "āĻāĻŋāĻ¨ā§āĻ¤ā§" āĻāĻā§: āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻļā§āĻāĻžāĻ° āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§ āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§ āĻāĻ¨ā§āĻ¨āĻ¤āĨ¤ āĻ˛ā§āĻ¯āĻžāĻŦ āĻā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧ āĻā§āĻāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋ: āĻ āĻāĻļāĻā§āĻ°āĻšāĻŖāĻāĻžāĻ°ā§āĻā§ āĻ¤āĻžāĻ° āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤ āĻ ā§āĻ¯āĻžāĻāĻžāĻāĻ¨ā§āĻā§ āĻ¯ā§āĻ¤ā§ āĻšāĻŦā§, "āĻā§āĻ" āĻŦā§āĻ¤āĻžāĻŽā§ āĻā§āĻ˛āĻŋāĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻŋāĻā§ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻĒāĻ°ā§ āĻ¸ā§ āĻ¯āĻž āĻāĻ°ā§āĻā§ āĻ¤āĻžāĻ° āĻāĻĒāĻ° āĻāĻŋāĻā§ āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻŦā§āĨ¤ āĻāĻŦāĻ āĻāĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§ āĻāĻŽāĻ°āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻāĻžāĻā§ āĻ¯ā§āĻ¤ā§ āĻļā§āĻ°ā§ āĻāĻ°āĻŋāĨ¤
āĻāĻ āĻ˛ā§āĻ¯āĻžāĻŦā§āĻ° āĻ¯āĻžāĻāĻžāĻāĻāĻ°āĻŖāĻāĻŋ āĻāĻāĻāĻžāĻŦā§ āĻāĻ āĻŋāĻ¤: āĻāĻŽāĻ°āĻž āĻ āĻāĻļāĻā§āĻ°āĻšāĻŖāĻāĻžāĻ°ā§āĻ° āĻāĻžāĻĢāĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛ āĻĄā§āĻāĻž āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ, āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻŦāĻ˛āĻŋāĻ¨ āĻāĻ āĻĄā§āĻāĻž āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ HDFS-āĻ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§, āĻ¤āĻžāĻ°āĻĒāĻ° Airflow āĻāĻ āĻĄā§āĻāĻž āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧā§ āĻā§āĻ˛āĻŋāĻ āĻšāĻžāĻāĻ¸ā§ āĻ°āĻžāĻā§āĨ¤ āĻā§āĻļāĻ˛āĻāĻŋ āĻšāĻ˛ āĻ¯ā§ āĻāĻ¯āĻŧāĻžāĻ°āĻĢā§āĻ˛ā§āĻā§ āĻ°āĻŋāĻ¯āĻŧā§āĻ˛ āĻāĻžāĻāĻŽā§ āĻāĻāĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¨āĻž, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§āĻā§ āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§ āĻāĻāĻŋ āĻāĻ°ā§: āĻĒā§āĻ°āĻ¤āĻŋ 15 āĻŽāĻŋāĻ¨āĻŋāĻā§ āĻāĻāĻŋ āĻāĻāĻā§āĻā§āĻ āĻĢāĻžāĻāĻ˛ āĻ¨ā§āĻ¯āĻŧ āĻāĻŦāĻ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻāĻĒāĻ˛ā§āĻĄ āĻāĻ°ā§āĨ¤
āĻĻā§āĻāĻž āĻ¯āĻžāĻā§āĻā§ āĻ¯ā§ āĻā§āĻāĻžāĻ° āĻāĻāĻžāĻ¨ā§ āĻāĻŦāĻ āĻāĻāĻ¨ āĻāĻ˛āĻā§ āĻ¤āĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻ
āĻ¨ā§āĻ°ā§āĻ§ā§ āĻ¤āĻžāĻĻā§āĻ° āĻĄāĻŋāĻāĻāĻŋāĻā§ āĻ¨āĻŋāĻā§āĻĻā§āĻ°āĻā§ āĻā§āĻ°āĻŋāĻāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻā§āĻāĻ˛āĻŋāĻāĻ¯āĻŧā§āĻ° āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž āĻā§āĻāĻā§ āĻĒā§āĻ¯āĻŧā§āĻāĻŋ āĻ¯ā§ āĻāĻ¯āĻŧāĻžāĻ°āĻĢā§āĻ˛ā§ āĻāĻ° āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¤āĻĨāĻžāĻāĻĨāĻŋāĻ¤ āĻ°āĻ¯āĻŧā§āĻā§ 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-āĻ āĻāĻāĻāĻŋ āĻŦā§āĻ°āĻžāĻāĻāĻžāĻ°ā§ āĻāĻ¯āĻŧā§āĻŦ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§ āĻāĻāĻžāĻ¤ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻ¯ā§āĻāĻžāĻ¨ā§ 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 āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻāĻžāĻ˛ā§ āĻāĻ°ā§āĻ¨ā§ˇ
āĻĒā§āĻ¸ā§āĻ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻ¨āĻŋāĻā§āĻ āĻāĻ āĻŽāĻ¤ āĻĻā§āĻāĻžāĻŦā§:
>>> 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'
āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻ¸āĻĢāĻ˛āĻāĻžāĻŦā§ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§.
āĻ¤āĻĻāĻ¨ā§āĻ¸āĻžāĻ°ā§, āĻāĻŽāĻ°āĻž āĻĄāĻŋāĻāĻāĻŋāĻā§ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŋāĻā§ āĻ¸āĻŽāĻ¯āĻŧ āĻĻāĻŋāĻ āĻāĻŦāĻ āĻā§āĻ˛āĻŋāĻāĻšāĻžāĻāĻ¸ āĻā§āĻŦāĻŋāĻ˛ā§ āĻāĻāĻāĻŋ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻāĻ°āĻŋ, āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻĄā§āĻāĻž āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻ§āĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻŋāĨ¤
āĻā§āĻ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com