You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:32:54