Airflow 2.8.1中Spotify ETL任务持续运行无法完成求助
解决Airflow任务因内存不足被SIGKILL的方案
1. 调整Airflow Worker的内存限制
找到Airflow配置文件airflow.cfg(默认路径~/airflow/airflow.cfg),根据你使用的Executor类型调整参数:
- 若用CeleryExecutor:修改
worker_concurrency(比如从默认4改为2,减少并发任务数),同时设置worker_max_memory_per_child = 2000MB限制单个子进程的内存上限 - 若用SequentialExecutor:关闭其他后台高内存占用进程,或直接在配置中限制Airflow进程的资源分配
2. 优化ETL函数的内存占用
既然单独运行函数正常,重点优化函数在Airflow环境下的内存使用:
- 检查
get_played_track_etl_2是否一次性加载全量Spotify数据,改成分批处理,每次处理小批量数据后及时释放内存 - 用生成器替代列表存储中间数据,减少内存占用;处理完无用变量后用
del关键字主动删除 - 若用pandas处理数据,指定数据类型(如
dtype参数)、将字符串转为category类型,降低内存消耗
3. 切换Executor类型
默认的SequentialExecutor是单进程运行,可换成LocalExecutor控制并发:
- 修改
airflow.cfg中executor = LocalExecutor - 同时调整
parallelism(全局并发数)和dag_concurrency(单DAG并发数)为2,减少同时运行的任务数量
4. 释放系统可用内存
macOS环境下临时释放内存:
- 关闭浏览器、大型IDE等高内存占用应用
- 终止后台的Spotify、iCloud同步等非必要进程
- 短期可启用虚拟内存(系统偏好设置-通用-存储-管理-优化存储),但长期建议升级物理内存
5. 监控任务内存变化
在ETL函数中加入内存监控代码,定位内存激增节点:
import psutil import os def get_played_track_etl_2(): process = psutil.Process(os.getpid()) print(f"当前内存使用: {process.memory_info().rss / 1024 ** 2} MB") # 原有ETL逻辑
内容的提问来源于stack exchange,提问作者Coreycryalong
相关产品推荐
相关产品推荐

