Fix Airflow 2.8.0 LocalExecutor Crashes on macOS: 3 Essential Solutions 2025
El escenario de pesadilla
Acabas de desplegar tu DAG de Airflow en macOS. Todo luce perfecto en la interfaz. Pulsas Run y luego no pasa nada.
Síntomas frecuentes
La tarea arranca y se queda colgada durante minutos hasta que el scheduler la marca como zombie o failed. En el log del scheduler aparecen pistas como return code -4 y Detected zombie job. Nada se imprime después de la primera llamada HTTP con requests.get y en SecuentialExecutor funciona pero con LocalExecutor o Celery se cae.
Tras semanas depurando problemas del LocalExecutor en macOS, identifiqué tres asesinos silenciosos que saboteaban mis flujos. Este checklist de tres pasos convirtió mi DAG de roto a veloz en menos de 30 segundos.
1. El fantasma del proxy en macOS
El problema
macOS enruta tráfico HTTP mediante networkserviceproxy. Si ese proxy se bloquea o no responde, requests.get no devuelve nunca y las tareas quedan colgadas indefinidamente. En Linux todo bien, en macOS todo se congela sin errores visibles.
La solución
En la shell que lanza Airflow exporta NO_PROXY con valor global y hazlo permanente en tu perfil zsh
export NO_PROXY=* y añade la línea anterior a tu archivo de inicio con echo export NO_PROXY=* >> ~/.zshrc
Por qué funciona
Evita por completo el proxy del sistema y permite conexiones directas.
2. La bomba de fork en Objective C
El problema
LocalExecutor y Celery crean procesos hijo mediante fork. En macOS 14 con Python 3.11 libdispatch puede fallar dentro del hijo con un SIGILL y mensajes como BUG IN CLIENT OF LIBDISPATCH. El resultado es que las tareas terminan con return code -4 y se marcan como zombie.
La solución
Exporta la variable de entorno que desactiva la comprobación de seguridad de inicialización tras fork
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES y persístela con echo export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES >> ~/.zshrc. Luego reinicia Airflow por completo para que todos los workers hereden el entorno.
Por qué funciona
Desactiva comprobaciones de seguridad de Objective C que chocan con multiprocessing de Python en versiones recientes de macOS.
3. Bombas de tiempo de memoria y red
El problema
Consumir endpoints masivos sin filtro por símbolo como el de Binance ticker 24hr provoca cargas enormes. Si no configuras timeouts la lectura puede colgarse para siempre. Si además transformas JSON grandes con pandas puedes disparar la memoria y terminar con SIGKILL.
La solución
Haz tus llamadas pequeñas, específicas y con streaming
Define timeouts de conexión y lectura por ejemplo 10 y 30. Usa stream True para no cargar todo en memoria. Filtra pronto y filtra a menudo mediante parámetros como symbol BTCUSDT en lugar de traer todos los tickers. Si recibes listas muy grandes procesa por lotes o limita a los primeros registros que realmente necesitas.
Checklist completo para arreglarlo
1 Fija el proxy del sistema con export NO_PROXY=* y persiste en ~/.zshrc. 2 Desactiva la seguridad de fork con export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES y persiste en ~/.zshrc. 3 Recarga el entorno con source ~/.zshrc. 4 Reinicia Airflow por completo con pkill -f airflow y vuelve a lanzar airflow scheduler y airflow webserver en segundo plano.
Por qué estos problemas son tan escurridizos
Son específicos de macOS, fallan en silencio, se reproducen de forma intermitente y dependen de la combinación de versión de macOS y Python, por lo que es fácil culpar al código cuando en realidad es el entorno.
Cómo validar los arreglos
Crea un DAG de prueba con un PythonOperator que haga una petición HTTP sencilla a un servicio público tipo httpbin con timeout 10 y que imprima el código de estado. Si se ejecuta con LocalExecutor sin colgarse y devuelve estado 200, estás listo.
Resultados antes y después
Tras aplicar el checklist, pasé de encadenar varios fallos consecutivos a series de ejecuciones exitosas. Las tareas dejaron de durar eternidades y se completan en tiempos cortos y estables. Las capturas mostraban seis fallos consecutivos frente a cinco éxitos seguidos y una reducción clara en la duración de las ejecuciones.
Consejos adicionales de robustez
Define siempre retries con backoff exponencial, registra métricas de tiempo de respuesta y memoria, usa pools para limitar concurrencia, añade límites en tamaño de payload y reemplaza transformaciones monolíticas por pasos más pequeños que puedas reintentar de forma idempotente.
Q2BSTUDIO tu socio para llevar Airflow y tus datos al siguiente nivel
En Q2BSTUDIO somos una empresa de desarrollo de software con foco en aplicaciones a medida y software a medida, especialistas en inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio y power bi, automatización de procesos, agentes IA e ia para empresas. Si necesitas diseñar pipelines resilientes, observables y escalables, podemos ayudarte con arquitectura, despliegue y operación en la nube. Conoce cómo optimizamos plataformas de datos y orquestación en nuestro servicio de servicios cloud aws y azure y descubre cómo aplicamos modelos y agentes de inteligencia artificial para acelerar tus procesos analíticos y operativos.
Palabras clave que impulsan valor para tu negocio
aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi
Comparte la victoria
Si esta guía te ha salvado horas, compártela con tu equipo, guárdala en tus marcadores y ayuda a esa persona que sigue sufriendo con macOS y Airflow. Cada profesional que arregla su entorno es una persona menos maldiciendo su terminal a las dos de la madrugada.
Comparte tu experiencia
Has lidiado con otros demonios específicos de macOS en Airflow, con chips M1 o M2, en Docker, con integraciones de VS Code o con conexiones a PostgreSQL. Cuéntanos tus aprendizajes y trucos. Entre todos construiremos el mejor arsenal de troubleshooting para que tus DAGs vuelen y tus tareas no vuelvan a convertirse en zombies.
Que tus DAGs fluyan sin fricción y tus workers nunca más vean zombis