我在一个虚拟环境中运行Airflow 1.9,使用Celery和Redis进行设置,效果很好。但是,我希望对设置进行守护,并使用说明here。它适用于Webserver,Scheduler和Flower,但对于Worker来说却失败了,这当然是它的核心。我的airflow-worker.service
文件如下所示:
[Unit]
Description=Airflow celery worker daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
EnvironmentFile=/etc/default/airflow
User=root
Group=root
Type=simple
ExecStart=/bin/bash -c 'source /home/codingincircles/airflow-master/bin/activate ; airflow worker'
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
奇怪的是,如果我按原样在CLI上运行ExecStart
命令,它会完美运行并且任务运行并且一切都是光荣的。但是,当我执行sudo service airflow-worker start
时,返回提示需要一段时间,并且没有任何内容显示在Flower UI中。当我journalctl -u airflow-worker.service -e
时,这就是我所看到的:
systemd[1]: Started Airflow celery worker daemon.
bash[12392]: [2018-04-09 21:52:41,202] {driver.py:120} INFO - Generating grammar tables from /usr/lib/python3.5/lib2to3/Grammar.txt
bash[12392]: [2018-04-09 21:52:41,252] {driver.py:120} INFO - Generating grammar tables from /usr/lib/python3.5/lib2to3/PatternGrammar.txt
bash[12392]: [2018-04-09 21:52:41,578] {configuration.py:206} WARNING - section/key [celery/celery_ssl_active] not found in config
bash[12392]: [2018-04-09 21:52:41,578] {default_celery.py:41} WARNING - Celery Executor will run without SSL
bash[12392]: [2018-04-09 21:52:41,579] {__init__.py:45} INFO - Using executor CeleryExecutor
systemd[1]: airflow-worker.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: airflow-worker.service: Unit entered failed state.
systemd[1]: airflow-worker.service: Failed with result 'exit-code'.
我做错了什么?任何其他使用Airflow的方法都有效,除非我尝试守护它。甚至在-D
命令工作后使用airflow
标志(如airflow worker -D
),除了我不确定这是否是在生产中使用它的正确/安全/推荐方式,并且而是使它成为一种服务并使用它。请帮忙。
答案 0 :(得分:4)
您的airflow-worker.service
正在尝试以root
用户身份运行气流工作者。要以root身份运行气流工作程序,必须在气流环境文件(C_FORCE_ROOT="true"
)中设置/etc/default/airflow
。但是,不建议这样做,我怀疑这不是最好的解决方法。
尝试以root身份手动运行气流工作程序时,您应该看到有关此问题的警告。因为您没有看到此警告,所以我怀疑您可以手动启动工作人员,因为您将其作为正确配置的airflow
用户而不是root
运行。因此,建议的解决方案是更改airflow-worker.service
文件中的以下行:
User=airflow
Group=airflow