Docker部署apache/airflow:2.1.0从SQL Server取数报错如何解决
问题排查与解决步骤
本次报错截图如下:
已安装的provider列表:
原有连接配置:
1. 修正DAG代码中Hook的错误调用
你当前extract函数里的Hook初始化写法错误,MsSqlHook.get_connection返回的是Airflow的Connection对象,不能直接调用get_hook()获取MSSQL的Hook实例,正确写法如下:
def extract(**kwargs): # 直接实例化MsSqlHook,传入配置的连接ID即可 hook = MsSqlHook(mssql_conn_id="sqlconnection_reader") df = hook.get_pandas_df(sql="SELECT top 5 * FROM [dbo].[1_del_ListPO]") print(df)
2. 检查MSSQL相关依赖是否完整
官方apache/airflow基础镜像默认没有预装MSSQL的访问依赖和系统驱动,即使安装了apache-airflow-providers-microsoft-mssql provider,也需要额外安装以下依赖:
系统级依赖
- freetds-dev(pymssql依赖的底层库)
- unixodbc-dev(ODBC驱动依赖)
- Microsoft ODBC Driver for SQL Server(ODBC访问MSSQL必需的驱动)
Python依赖
- pymssql / pyodbc(二选一即可,pymssql更轻量)
如果是Docker部署,需要基于官方镜像构建自定义镜像,参考Dockerfile如下:
FROM apache/airflow:2.1.0 USER root # 安装系统依赖和ODBC驱动 RUN apt-get update && apt-get install -y --no-install-recommends \ freetds-dev \ unixodbc-dev \ curl \ && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list \ && apt-get update \ && ACCEPT_EULA=Y apt-get install -y msodbcsql17 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* USER airflow # 安装Python依赖 RUN pip install --no-cache-dir pymssql pyodbc
3. 校验Airflow连接配置
确认以下配置项正确:
- 连接类型:必须选择Microsoft SQL Server,不能选其他通用数据库类型
- Host:填写MSSQL数据库的可访问地址,注意如果是Docker部署,不要填localhost(会指向Airflow容器本身),要填宿主机IP或者数据库所在服务器的可访问IP
- Schema:填写要访问的数据库名称
- Login:数据库登录用户名
- Password:数据库登录密码
- Port:MSSQL默认端口为1433,未修改端口的情况下填1433即可
- Extra:如果使用ODBC驱动访问,需要填入
{"driver": "ODBC Driver 17 for SQL Server"},使用pymssql可以留空
配置完成后先进入Airflow的scheduler/worker容器,测试网络连通性:
# 进入容器命令示例,替换为你的scheduler容器名 docker exec -it airflow-scheduler bash # 测试端口连通性 telnet <你的MSSQL地址> 1433
4. 本地验证Hook可用性
进入Airflow容器后,执行Python命令手动测试Hook是否正常工作:
from airflow.providers.microsoft.mssql.hooks.mssql import MsSqlHook hook = MsSqlHook(mssql_conn_id="sqlconnection_reader") res = hook.get_first("SELECT @@VERSION") print(res)
如果能正常返回MSSQL的版本信息,说明依赖、配置、网络都正常,再运行DAG即可。
内容的提问来源于stack exchange,提问作者Woody Ngo
相关产品推荐
相关产品推荐

