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

Airflow DAG连接ClickHouse遇SocketTimeoutError问题求助

解决Airflow DAG连接ClickHouse的SocketTimeoutError问题

从你的描述和代码来看,这个超时问题的核心原因是连接类型与Hook的协议不匹配,结合你用HTTP类型配置连接的情况,我来一步步拆解原因和解决办法:

为什么会出现SocketTimeoutError?

你使用的ClickHouseHook(从airflow.hooks.clickhouse_hook导入的版本)底层依赖的是clickhouse-driver,这个驱动默认使用TCP协议连接ClickHouse的9000端口,而不是HTTP的8123端口。你在Airflow UI里配置的是HTTP类型连接,Hook读取到的端口是8123,然后尝试用TCP协议去连接这个端口——但ClickHouse在8123上运行的是HTTP服务,不会响应TCP请求,自然就超时了。

解决办法

方案1:改用支持HTTP协议的ClickHouseHttpHook(推荐)

如果你的Airflow版本是2.3及以上,官方提供了ClickHouseHttpHook,专门适配HTTP类型的连接,完美匹配你现在的配置:

  1. 修改代码中的Hook导入和使用:
from airflow import DAG
# 替换成HTTP版本的Hook
from airflow.providers.clickhouse.hooks.clickhouse_http import ClickHouseHttpHook
from airflow.operators.python_operator import PythonOperator
from datetime import datetime

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2020, 10, 18)
}

def _data_from_clickhouse():
    # 使用ClickHouseHttpHook替代原Hook
    ch_hook = ClickHouseHttpHook(clickhouse_conn_id='ClickHouse_rnd_conn')
    records = ch_hook.get_records('select * from cpa_traffic_costs')
    # 可以添加日志或打印,验证数据获取结果
    print(f"成功获取{len(records)}条数据")

with DAG(dag_id='data_to_clickhouse', default_args=default_args) as dag:
    get_data_from_clickhouse = PythonOperator(
        task_id='get_data_from_clickhouse',
        python_callable=_data_from_clickhouse,
    )

get_data_from_clickhouse
  1. 确认你在Airflow UI的ClickHouse_rnd_conn连接配置:
    • 类型选择HTTP
    • Host填ClickHouse的IP,Port填8123
    • 如果需要认证,在Login/Password字段填写对应的账号密码,Extra里可以补充{"database": "你的数据库名"}(如果不是默认库的话)

方案2:调整连接类型为Custom,适配TCP协议

如果你不想升级Airflow或者坚持用原ClickHouseHook,可以把连接改成TCP协议适配的配置:

  1. 在Airflow UI的连接配置中,把ClickHouse_rnd_conn的类型改成Custom
  2. 填写以下参数:
    • Host:ClickHouse的IP地址
    • Port:9000(ClickHouse默认TCP端口)
    • Extra字段添加JSON格式的参数,比如:
      {"user": "你的用户名", "password": "你的密码", "database": "你的数据库名"}
      
  3. 代码不需要修改,原ClickHouseHook会读取这些参数,用TCP协议正常连接。

额外排查点

  • 检查Airflow Worker所在服务器的防火墙/安全组,确保能访问ClickHouse对应的端口(HTTP用8123,TCP用9000)
  • 确认ClickHouse的配置文件(config.xml)中,对应端口的监听地址是0.0.0.0(允许远程连接),而不是仅本地127.0.0.1

内容的提问来源于stack exchange,提问作者Vlad Aleshin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:17:34