我利用Airflow v1.7.1.3提供对airflow.cfg
的访问权限,以便在那里放置一些配置值而不是嵌入代码中。我们将以下内容添加为airflow.cfg
文件的第一行:
[foo]
bar = foo
bar
在代表DAG的foobarDAG.py
类中,我执行以下操作:
from airflow.configuration import conf
…
def fooBar():
pass
foobarList = conf['foo']['bar'].split('\n')
foobarOperator = PythonOperator(
task_id='fooBar',
provide_context=True,
python_callable=fooBar,
op_args=[foobarList],
dag=dag)
从Python提示手动测试这个很容易:
>>> from foobarDAG import foobarList
…
>>> foobarList
['foo', 'bar']
这正是我对上述airflow.cfg
中信息的期望。
我们还直接对DAG进行了测试:
airflow test foobarDAG fooBar 10-19-2016
这并没有报告任何问题。
当我们尝试使用调度程序来安排一个DAG时,问题就出现了:
airflow scheduler -d foobarDAG >& foobar_log.txt
在网络用户界面中,我们在" DAGS"的顶部看到以下内容:部分:
Broken DAG: [/path/to/…/foobarDAG.py] 'foo'
在foobar_log.txt
中,这是错误消息:
[2016-10-19 14:56:09,028] {models.py:250} ERROR - Failed to import: /path/to/foobarDAG.py
Traceback (most recent call last):
File "/path/to/airflow/models.py", line 247, in process_file
m = imp.load_source(mod_name, filepath)
File "/path/to/anaconda3/envs/foobarenv/lib/python3.5/imp.py", line 172, in load_source
module = _load(spec)
File "<frozen importlib._bootstrap>", line 693, in _load
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 662, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "/path/to/foobarDAG.py", line 67, in <module>
foobarList = conf['foo']['bar'].split('\n')
File "/path/to/anaconda3/envs/foobarenv/lib/python3.5/configparser.py", line 956, in __getitem__
raise KeyError(key)
KeyError: 'foo'
奇怪的是,调度程序似乎没有从['foo']
检索airflow.cfg
部分并将其提供给DAG。知道为什么吗?
答案 0 :(得分:0)
事实证明一切正常,但调度程序尚未重启。调度程序显然仍在使用没有添加部分的旧airflow.cfg
。