我正在使用Docker Apache airflow VERSION 1.9.0-2(https://github.com/puckel/docker-airflow)。
调度程序生成大量日志,文件系统将快速耗尽空间,因此我尝试以编程方式删除由(/ usr / local / airflow /中的调度程序容器中的airflow创建的调度程序日志)日志/调度器)
我已经设置了所有这些维护任务: https://github.com/teamclairvoyant/airflow-maintenance-dags
但是,这些任务仅删除worker上的日志,并且调度程序日志位于调度程序容器中。
我还设置了远程日志记录,将日志发送到S3,但正如本帖子Removing Airflow task logs中所述,此设置不会阻止气流写入本地计算机。
此外,我还尝试在worker和scheduler之间创建一个共享命名卷,如Docker Compose - Share named volume between multiple containers所述。但是,我在worker中遇到以下错误:
ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler'
以及调度程序中的以下错误:
ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler/2018-04-11'
所以,人们如何删除调度程序日志?
答案 0 :(得分:2)
以下可能是解决此问题的一种方法。
使用以下机制登录docker容器
#>docker exec -it <name-or-id-of-container> sh
在命令运行时确保 - 容器正在运行。
然后使用cron作业在这些日志文件上配置预定的rm命令。
答案 1 :(得分:2)
受到this回复的启发,我在here添加了airflow-log-cleanup.py
DAG(对其参数进行了一些更改)以删除所有旧气流日志,包括调度程序日志。
我的更改很小,只是考虑到我的EC2的磁盘大小(/dev/xvda1
为7.7G),DEFAULT_MAX_LOG_AGE_IN_DAYS
的30天默认值似乎太大(我有4个DAG)我将其更改为14几天,但可以根据您的环境随意调整:
DEFAULT_MAX_LOG_AGE_IN_DAYS = Variable.get("max_log_age_in_days", 30)
改为
DEFAULT_MAX_LOG_AGE_IN_DAYS = Variable.get("max_log_age_in_days", 14)
答案 2 :(得分:0)
This answer to "Removing Airflow Task logs"也适合您在Airflow 1.10中的用例。
基本上,您需要实现自定义日志处理程序并将Airflow日志配置为使用该处理程序而不是默认处理程序(请参阅insertAtTop
,不是 UPDATING.md
或文档!! ,在气流源仓库中
一个警告:由于日志记录,多处理和Airflow默认处理程序之间的交互方式,重写处理程序方法比通过在派生的处理程序类中调用super()扩展它们更安全。因为Airflow默认处理程序不使用锁
答案 3 :(得分:-1)
我花了很多时间尝试添加“维护”DAG,以清除作为 Docker 容器 启动的不同气流组件生成的日志。
问题实际上更多出现在 Docker 级别,每个进程都负责处理大量日志,默认情况下,这些日志由 Docker 存储在 json
文件中。解决方案是更改 logging drivers 以便日志不再存储在 Docker 托管实例上;但在我的情况下直接发送到 AWS CloudWatch Logs。
我只需将以下内容添加到 docker-compose.yml
文件 (https://github.com/puckel/docker-airflow) 中的每个服务:
logging:
driver: awslogs
options:
awslogs-group: myAWSLogsGroupID
请注意,运行我的“docker-composed”Airflow 应用程序的 EC2 实例具有一个 AWS 角色,该角色允许她创建日志流并添加日志事件(CreateLogStream
和 PutLogEvents
AWS IAM 服务)。
如果您在 AWS 生态系统之外的机器上运行它,则需要确保它具有 access to AWS through credentials。