Airflowを使用して単純なタスクpythonを実行しようとしています。
_from __future__ import print_function
from airflow.operators.python_operator import PythonOperator
from airflow.models import DAG
from datetime import datetime, timedelta
from pprint import pprint
seven_days_ago = datetime.combine(datetime.today() - timedelta(7),
datetime.min.time())
args = {
'owner': 'airflow',
'start_date': seven_days_ago,
}
dag = DAG(dag_id='python_test', default_args=args)
def print_context(ds, **kwargs):
pprint(kwargs)
print(ds)
return 'Whatever you return gets printed in the logs'
run_this = PythonOperator(
task_id='print',
provide_context=True,
python_callable=print_context,
dag=dag)
_
たとえば、私が試した場合:
エアフローテストpython_test print 2015-01-01
できます!
ここで、他のpythonファイルにdef print_context(ds, **kwargs)
関数を追加します。そのため、simple_test.pyという名前の別のファイルを作成し、次のように変更します。
_run_this = PythonOperator(
task_id='print',
provide_context=True,
python_callable=simple_test.print_context,
dag=dag)
_
今、私は再び走ろうとします:
エアフローテストpython_test print 2015-01-01
そしてOK!それでも動作します!
しかし、ファイル_SimplePython.py
_を含むワーカーモジュールなどのモジュールを作成する場合は、(_from worker import SimplePython
_)をインポートして、次のことを試してください。
エアフローテストpython_test print 2015-01-01
それはメッセージを与えます:
ImportError:workerという名前のモジュールはありません
質問:
次のように、DAGの依存関係をパッケージ化できます。
https://airflow.Apache.org/concepts.html#packaged-dags
これを可能にするには、ZipファイルのルートにDAGを含むZipファイルを作成し、追加のモジュールをディレクトリに解凍します。たとえば、次のようなZipファイルを作成できます。
my_dag1.py
my_dag2.py
package1/__init__.py
package1/functions.py
AirflowはZipファイルをスキャンして、my_dag1.pyとmy_dag2.pyをロードしようとします。これらは潜在的なパッケージと見なされているため、サブディレクトリには移動しません。
CeleryExecutorを使用する場合は、DAGディレクトリを手動で同期する必要があります。Airflowはそれを処理しません。
ワーカーはそのDAGS_FOLDERにアクセスできる必要があり、独自の方法でファイルシステムを同期する必要があります
ドキュメントでカバーされているようにDAGをZipにパッケージ化することは、私が見た唯一のサポートされているソリューションですが、Dagsフォルダー内にあるモジュールのインポートを行うこともできます。これは、puppetやgitなどの他のツールを使用してdagsフォルダーを自動的に同期する場合に便利です。
私はあなたのディレクトリ構造を質問から明確にしていないので、典型的なpythonプロジェクト構造に基づくdagsフォルダーの例を以下に示します:
└── airflow/dags # root airflow dags folder where all dags live
└── my_dags # git repo project root
├── my_dags # python src root (usually named same as project)
│ ├── my_test_globals.py # file I want to import
│ ├── dag_in_package.py
│ └── dags
│ └── dag_in_subpackage.py
├── README.md # also setup.py, LICENSE, etc here
└── dag_in_project_root.py
(必須[ 1 ])__init__.py
ファイルを省略しました。 3つの例のくぼみの場所に注意してください。ほとんどの場合、これらの場所の1つだけをすべてのダグに使用します。インポートには関係ないので、例としてすべてをここに含めます。それらのいずれかからmy_test_globals
をインポートするには:
from my_dags.my_dags import my_test_globals
これは、airflowがpythonパスをdagsディレクトリに設定して実行されるため、dagsフォルダーの各サブディレクトリをpythonパッケージとして処理できることを意味します。私の場合、それは追加の中間プロジェクトのルートディレクトリが、典型的なパッケージ内の絶対インポートの邪魔になるものでした。したがって、このエアフロープロジェクトを次のように再構築できます。
└── airflow/dags # root airflow dags folder where all dags live
└── my_dags # git repo project root & python src root
├── my_test_globals.py # file I want to import
├── dag_in_package.py
├── dags
│ └── dag_in_subpackage.py
├── README.md # also setup.py, LICENSE, etc here
└── dag_in_project_root.py
したがって、インポートは期待どおりに見えます。
from my_dags import my_test_globals
最初の質問は可能です。
そして、__init__.py
と同じディレクトリの下にSimplePython.py
という名前の空のファイルを作成する必要があると思います(この場合はworker
ディレクトリです)。そうすることで、worker
ディレクトリはpythonモジュールと見なされます。
次に、DAG定義でfrom worker.SimplePython import print_context
を試してください。
あなたの場合、カスタマイズされた関数を削除せずにairflowコアプロジェクトをアップグレードしたい場合があるので、airflowのプラグインを作成する方が良いと思います。
2番目の質問:Airflow + Celeryは必要なすべてのpython sourcesファイルをワーカーノード全体にどのように配布するのですか?
ドキュメントから:ワーカーはDAGS_FOLDERにアクセスできる必要があり、独自の方法でファイルシステムを同期する必要があります。一般的な設定は、DAGS_FOLDERをGitリポジトリーに保管し、Chef、Puppet、Ansibleなどの環境でマシンの構成に使用するものを使用してマシン間で同期することです。すべてのボックスに共通のマウントポイントがある場合は、そこでパイプラインファイルを共有しても同様に機能するはずです。
http://pythonhosted.org/airflow/installation.html?highlight=chef