我正在做一个Dockerized Python/Django项目,其中包括一个用于芹菜工人的容器,我一直在集成现成的气流docker容器。
我有气流成功运行预先存在的容器中的芹菜任务,通过实例化一个芹菜应用程序与redis代理和后端指定,并通过send_task远程调用;但是,芹菜任务执行的任何日志记录都不会返回到气流日志中。
最初,作为我对气流完全陌生的概念证明,我已经将其设置为通过将其暴露给气流容器并创建气流任务以在气流芹菜工作容器上运行它来运行相同的代码。这个确实会导致所有的日志记录被捕获,但这绝对不是我们想要的架构方式,因为这使得气流容器非常胖,因为django项目的依赖重复。
文档说"大多数任务处理程序在任务完成时发送日志";但我找不到更多的细节,可能会给我一个线索,如何在我的情况下启用相同的。
在远程运行芹菜任务时,是否有办法让这些日志回到气流中?
不是"将日志返回给Airflow",一个容易实现的替代方案(因为气流本身支持它)是激活远程日志记录。这样,来自所有worker的所有日志都将在S3上结束,并且web服务器将自动获取它们。
下面演示如何使用S3后端配置远程日志记录。其他选项(例如Google Cloud Storage, Elastic)也可以类似地实现。
- 将
airflow.cfg
中的 - 建立一个气流连接URI。这个来自官方文档的例子在我看来特别有用。最终应该是这样的:
remote_logging
设置为True
aws://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI%2FK7MDENG%2FbPxRfiCYEXAMPLEKEY@/?
endpoint_url=http%3A%2F%2Fs3%3A4566%2F
如果需要,也可以通过web服务器GUI创建连接。
- 使连接URI对气流可用。这样做的一种方法是确保环境变量
AIRFLOW_CONN_{YOUR_CONNECTION_NAME}
可用。连接名称REMOTE_LOGS_S3
的示例:
export AIRFLOW_CONN_REMOTE_LOGS_S3=aws://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI%2FK7MDENG%2FbPxRfiCYEXAMPLEKEY@/?endpoint_url=http%3A%2F%2Fs3%3A4566%2F
- 将
remote_log_conn_id
设置为airflow.cfg
中的连接名称(例如 - 将
airflow.cfg
中的remote_base_log_folder
设置为需要的桶/前缀。例子:
REMOTE_LOGS_S3
)remote_base_log_folder = s3://my_bucket_name/my/prefix
这个相关的SO更深入地讨论了远程日志。
如果需要调试,在本地(即在worker内部)查看任何worker日志应该会有所帮助。