尝试使用systemd在ubuntu服务器上运行apache airflow

尝试使用systemd在ubuntu服务器上运行apache airflow,apache,ubuntu,airflow,systemd,Apache,Ubuntu,Airflow,Systemd,我正试图在ubuntu服务器上运行。我遵循了《快速入门指南》和气流文档中的教程,通过使用以下命令成功安装并运行了气流: airflow webserver -p 8080 在安装systemd和大量的尝试和错误之后,我成功地使用命令运行了airflow sudo systemctl start airflow sudo systemctl restart airflow 气流持续运行了一周,直到今天我用命令重新启动了它 sudo systemctl start airflow sudo

我正试图在ubuntu服务器上运行。我遵循了《快速入门指南》和气流文档中的教程,通过使用以下命令成功安装并运行了气流:

airflow webserver -p 8080
在安装systemd和大量的尝试和错误之后,我成功地使用命令运行了airflow

sudo systemctl start airflow
sudo systemctl restart airflow
气流持续运行了一周,直到今天我用命令重新启动了它

sudo systemctl start airflow
sudo systemctl restart airflow
现在运行
sudo systemctl status
会显示以下两条消息之一:

● airflow.service - Airflow webserver daemon
 Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled)
 Active: activating (auto-restart) (Result: exit-code) since Wed 2018-09-12 09:23:01 UTC; 1s ago
Process: 3115 ExecStart=/opt/miniconda3/bin/airflow webserver -p 8080 --pid /home/user/airflow/airflow-webserver.pid --daemon (code=exited, status=1/FAILURE)
Main PID: 3115 (code=exited, status=1/FAILURE)

Sep 12 09:23:01 server-service systemd[1]: airflow.service: Main process exited, code=exited, status=1/FAILURE
Sep 12 09:23:01 server-service systemd[1]: airflow.service: Unit entered failed state.
Sep 12 09:23:01 server-service systemd[1]: airflow.service: Failed with result 'exit-code'.

我认为第一条消息是在systemd无法启动气流时返回的,第二条消息是在systemd仍在启动气流过程中返回的

由于第一条错误消息包含
aiffort.service:service推迟时间结束,计划重新启动。
我想我可能有,但运行
sudo systemctl enable aiffort.service
并不能解决问题(我认为aiffort.service已启用,如下所示:
已加载:已加载(/lib/systemd/system/afflow.service;已启用;供应商预设:已启用)

在试图解决这个问题的过程中,我发现了一些我不理解的奇怪的事情:

  • 根据,手动运行airflow将在airflow home中创建一个名为
    airflow webserver.pid
    的文件,而使用systemd运行airflow将在
    /run/airflow
    目录中创建一个名为
    webserver.pid
    的文件。最初,当我尝试使用systemd运行airflow时,我注意到
    >/运行/airflow/webserver.pid
    未创建。设置
    PIDFile=/home/user/airflow/airflow webserver.pid
    解决了问题;系统使用
    airflow webserver.pid
    文件中提供的辅助pid运行airflow。但现在,我已经运行了
    sudo systemctl重新启动不再工作的airflow
    ;运行
    airflowlow webserver-p8080
    没有创建我所指向的
    气流webserver.pid

  • 由于运行气流不再自动创建
    /run/afflow/webserver.pid
    /home/user/afflow/afflow webserver.pid
    文件,因此我尝试在所需目录中手动创建它们。但是,如果在创建
    /run/afflow/webserver.pid
    文件后使用systemd运行气流,它将被删除(且未替换)如果在创建
    /run/afflow/webserver.pid
    文件后,我使用
    气流Web服务器-p8080
    手动运行气流,则该文件将被删除

我的
aiffort.service
文件如下所示:

[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
PIDFile=/home/user/airflow/airflow-webserver.pid
User=%i
Group=%i
Type=simple
ExecStart=/opt/miniconda3/bin/airflow webserver -p 8080 --pid /home/user/airflow/airflow-webserver.pid --daemon

Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[Unit]
Description=Airflow scheduler 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/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
问题:我如何解决这些问题,以便我可以使用systemd运行气流

编辑:再次重新启动systemd守护程序后,我已设法使气流运行(或者至少看起来是这样)。运行
systemctl status afflow
返回:

● airflow.service - Airflow webserver daemon
   Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-09-12 10:49:17 UTC; 6min ago
 Main PID: 30054
    Tasks: 0
   Memory: 388.0K
      CPU: 2.987s
   CGroup: /system.slice/airflow.service

Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
Sep 12 10:49:22 server-service airflow[30031]:     reraise(type(exception), exception, tb=exc_tb, cause=cause)
Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise
Sep 12 10:49:22 server-service airflow[30031]:     raise value.with_traceback(tb)
Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
Sep 12 10:49:22 server-service airflow[30031]:     context)
Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
Sep 12 10:49:22 server-service airflow[30031]:     cursor.execute(statement, parameters)
Sep 12 10:49:22 server-service airflow[30031]: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: connection [SQL: 'SELECT connection.conn_id AS connection_conn_id \nFROM connection G
Sep 12 10:49:23 server-service systemd[1]: airflow.service: Supervising process 30054 which is not our child. We'll most likely not notice when it exits.
lines 1-19/19 (END)
不幸的是,我无法在浏览器中访问airflow。此外,使用systemd启动airflow或手动启动airflow不会生成所需的文件
/run/airflow/webserver.pid
/home/user/airflow/airflow webserver.pid
。我已尝试使用
sudo find~/-type f-name“webserver.pid”检查它们是否存在于其他位置
但这不会返回任何内容

我认为消息
监控进程30054,它不是我们的孩子。我们很可能不会注意到它何时退出。
与我的问题有关,因为它在过去使用systemd成功运行airflow时没有收到此消息。是否
systemctl status airflow
指示airflow h因为systemd没有注意到pid 30054的工作进程不再处于活动状态,所以as已运行6分钟


编辑2:我已经找到了为什么气流“不创建”气流Web服务器.pid。当您运行气流Web服务器-p 8080时,气流确实创建了.pid文件,但当您停止Web服务器系统时,我会再次删除.pid文件(如果气流本身没有这样做)。这解释了为什么
airflow webserver.pid
不在那里,但它没有解释
webserver.pid
为什么不在
/run/airflow
目录中。

该错误
sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表:连接
表示您的Airflow进程无法访问已初始化的数据库。您确定在尝试设置Airflow Web服务器之前运行了
Airflow initdb

我一直在我的中的systemd下运行Airflow,您可以在其中找到配置参数。为了完整起见,我将在这里转录配置文件,但我无法通过查看您的配置为何无法工作来找出原因

我的配置是定制的,可以在
Amazon Linux 2
机器中的用户
ec2 user
下工作,但我相信它也应该适用于Ubuntu。注意,因为我在其他机器上运行数据库、redis和其他一切,所以我从
之后的
部分删除了它们

        /usr/bin/turbine:
            #!/bin/sh
            exec airflow scheduler

        /etc/sysconfig/airflow:
            AIRFLOW_HOME=/efs/airflow
            AIRFLOW__CELERY__DEFAULT_QUEUE=${queue}
            ... your environment configs
            AWS_DEFAULT_REGION=${AWS::Region}

        /usr/lib/systemd/system/airflow.service:
            [Unit]
            Description=Airflow daemon
            After=network.target
            [Service]
            EnvironmentFile=/etc/sysconfig/airflow
            User=ec2-user
            Group=ec2-user
            Type=simple
            ExecStart=/usr/bin/turbine
            Restart=always
            RestartSec=5s
            [Install]
            WantedBy=multi-user.target

        /usr/lib/tmpfiles.d/airflow.conf:
            D /run/airflow 0755 ec2-user ec2-user
除此之外,我还设置了一个watcher服务,以确保我们始终在systemd中使用最新的环境文件:

        /usr/lib/systemd/system/watcher.service:
            [Unit]
            Description=Airflow configuration watcher
            After=network.target
            [Service]
            Type=oneshot
            ExecStartPre=/usr/bin/systemctl daemon-reload
            ExecStart=/usr/bin/systemctl restart airflow
            [Install]
            WantedBy=multi-user.target

        /usr/lib/systemd/system/watcher.path:
            [Path]
            PathModified=/etc/sysconfig/airflow
            [Install]
            WantedBy=multi-user.target
一切都安排好了

systemctl enable airflow.service
systemctl enable watcher.path
systemctl start airflow.service
systemctl start watcher.path

我知道我正在挖掘一篇有点过时的帖子,但我也在试图弄清楚为什么在服务器运行时无法让调度程序自动运行

我确实在Ubuntu 18.04和18.10上找到了一个适合我的解决方案,希望这能有所帮助

我提供了一篇关于如何在后端链接的完整文章

**从我文章的后半部分开始 从本质上讲,它可以归结为对airflow-scheduler.system文件进行特定更改

这是在Ubuntu上实现的一个“陷阱”。创建Airflow的开发团队将其设计为在d
[Unit]
Description=Airflow scheduler 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
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
#airflow-webserver.service
[Unit]
Description=Airflow webserver 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
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target