M1 macOS下Airflow 2.6.1调用API超时故障求助
问题诊断与解决方案
核心问题分析
你遇到的情况是M1芯片macOS上Airflow 2.6.1的Worker进程无法发起外部HTTP请求——本地直接用Python环境能正常跑,但Airflow任务就超时。核心原因大概率是Airflow运行环境的网络配置问题(比如Docker容器网络隔离、DNS解析失败),同时你的SimpleHttpOperator代码还存在参数配置错误。
一、修正SimpleHttpOperator的参数错误
你当前代码把GET请求的查询参数放到了headers里,这是错误的,GET参数应该通过params字段传递:
import requests from datetime import datetime, timedelta from airflow import DAG from airflow.providers.http.operators.http import SimpleHttpOperator dag = DAG( dag_id='weatherapi', start_date=datetime(2023, 6, 17), schedule=None, catchup=False, ) t1 = SimpleHttpOperator( task_id='weather_api_dag', http_conn_id='weather_api', endpoint='/direct', # 把查询参数放到params里,而非headers params={ 'q': 'Rugby', 'appid': 'APP_TOKEN' # 也可以在HTTP连接的Extra里配置appid,避免硬编码 }, method='GET', # 先简化response_filter,确保请求成功再处理数据 response_filter=lambda response: response.json(), log_response=True, dag=dag, # 添加超时时间,避免无限等待 timeout=30 ) t1
另外,建议把appid配置到Airflow HTTP连接的Extra字段里(格式:{"appid": "你的token"}),这样代码里不用硬编码敏感信息。
二、排查PythonOperator的网络超时问题
在PythonCallable里添加超时设置和异常捕获,打印更多调试信息,定位具体问题:
import requests import sys import socket from datetime import datetime, timedelta from airflow import DAG from airflow.operators.python import PythonOperator def extract_data(): print('Starting GET request') url = "https://jsonplaceholder.typicode.com/users" try: # 添加超时时间,避免无限等待 response = requests.get(url, timeout=10) # 打印响应状态码和头部,确认请求是否到达服务器 print(f"Response status code: {response.status_code}") print(f"Response headers: {response.headers}") data = response.json() return data except Exception as e: print(f"Request failed: {str(e)}") print(f"Exception details: {sys.exc_info()}") # 尝试DNS解析测试,判断是否是域名解析问题 try: ip = socket.gethostbyname("jsonplaceholder.typicode.com") print(f"DNS resolved: {ip}") except socket.gaierror: print("DNS resolution failed") raise # 重新抛出异常让Airflow标记任务失败 dag = DAG( dag_id="api_check", start_date=datetime(2023, 6, 16), schedule=None, catchup=False, tags=["example"], ) t1 = PythonOperator( task_id='test', python_callable=extract_data, dag=dag ) t1
运行任务后查看日志,如果打印DNS resolution failed,说明是DNS解析问题;如果是连接超时,说明网络链路不通。
三、M1 macOS Airflow网络问题针对性解决
1. 如果你用Docker Compose部署Airflow
M1芯片的Docker Desktop默认网络配置可能存在兼容性问题,尝试以下操作:
- 打开Docker Desktop设置 → Features in Development,开启
Use the new Virtualization framework - 进入Docker Desktop设置 → Network,将DNS服务器改为
8.8.8.8或1.1.1.1 - 修改
docker-compose.yml,给worker容器添加网络配置,比如使用host网络(注意端口冲突):services: airflow-worker: network_mode: "host"
2. 如果你用brew本地安装Airflow
- 确保Airflow进程继承了系统代理设置,在启动Airflow前设置环境变量:
export HTTP_PROXY=http://你的代理地址:端口 export HTTPS_PROXY=http://你的代理地址:端口 airflow webserver --port 8080 & airflow scheduler & - 检查系统防火墙是否阻止了Airflow进程的网络请求,暂时关闭防火墙测试。
内容的提问来源于stack exchange,提问作者MMJ
相关产品推荐
相关产品推荐

