【问题标题】:Google Composer- How do I install Microsoft SQL Server ODBC drivers on environmentsGoogle Composer - 如何在环境中安装 Microsoft SQL Server ODBC 驱动程序
【发布时间】:2020-06-06 08:14:12
【问题描述】:

我是 GCP 和 Airflow 的新手,我正在尝试通过 python 3 的简单 PYODBC 连接运行我的 python 管道。但是,我相信我已经找到了需要在机器上安装的内容 [Microsoft doc]https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017,但我不确定在 GCP 中的何处运行这些命令。我已经钻了几个深洞寻找答案,但不知道如何解决问题

这是我在上传 DAG 时一直看到的错误:

Airflow Error

这里是 PYODBC 连接:

pyodbc.connect('DRIVER={Microsoft SQL Server};SERVER=servername;DATABASE=dbname;UID=username;PWD=password')

当我在环境中打开我的 gcloud shell 并运行 Microsoft 下载时,它会中止,当我下载 SDK 并从本地下载连接到项目时,它会自动中止或无法识别来自 Microsoft 的命令。任何人都可以就从哪里开始以及我做错了什么给出一些简单的指导吗?

【问题讨论】:

  • @rmesteves 感谢发帖,我也看到了。我认为我在此之前的几个步骤令人尴尬,我正在努力识别带有 GCP 的 cmd 行接口,它将安装气流驱动程序。我已通过 kubernetes 集群“连接”cmd 行访问,但它说当我运行命令时所有更改都是短暂的。所以我只是迷失在我需要去哪里进行必要的安装或运行命令

标签: sql-server google-cloud-platform airflow google-cloud-composer


【解决方案1】:

Cloud Composer 目前主要支持安装纯 Python 编写的 PyPI 包。目前不完全支持安装系统包,但有一些变通方法(例如设置LD_LIBRARY_PATH和上传共享库等)。您正在中止,因为您安装了包的 Python 部分,而不是 Python 包所依赖的系统依赖项。

正如您所读到的,Composer 中对 Airflow 工作器的更改是短暂的(或者至少应该这样处理),但解决此问题的一种方法是使用 BashOperator 安装软件包before需要库的任务运行。它并不漂亮,但它确保在调用需要它们的 Python 代码之前,在 worker 上安装了依赖项。

【讨论】:

  • 感谢您的回复。我认为我最关心的是此类事情的可扩展性以及执行时间。对于像连接到 SQL 服务器实例以推送/拉取数据这样简单的事情来说,这似乎过于复杂。必须有一个更好的解决方案,像气流这样功能丰富的大数据平台
【解决方案2】:

考虑到 Composer 是 Google 托管的 Apache Airflow 实现,因此,预计它的行为会有所不同。

考虑到这一点,custom Python dependincies and binary dependencies not available in the Cloud Composer worker image 可以使用KubernetesPodOperator 选项。

这实质上是允许您通过create a custom container image 满足您的所有要求,将其推送到容器映像存储库(Dockerhub、GCR)中,然后将其拉入您的 Composer 环境,从而满足您的所有依赖项。

这会更好地升级,因为您无需与机器交互(这种方法在您的原始问题中已说明),并且使用您需要的任何内容构建容器映像看起来更容易。

具体来说pyodbc,在使用 Composer 进行依赖项安装的上下文中,there is a feature request 来解决这个问题,这也概述了一种解决方法(基本上是这个答案中提到的)。您可能想检查一下。

【讨论】:

  • 我会支持这个答案,因为KubernetesPodOperator 更适合这种类型的用例。
【解决方案3】:

我也遇到了同样的问题。对我有用的第一个解决方案是构建一个 docker 映像,该映像将安装驱动程序然后运行代码。 最初我试图找到一种在集群上安装驱动程序的方法,但在多次失败后,我在文档中读到 composer 中的气流图像是由谷歌策划的,并且不允许任何影响图像的更改。所以这是我的 docker 文件:

FROM python:3.7-slim-buster
#FROM gcr.io/data-development-254912/gcp_bi_baseimage 
#FROM gcp_bi_baseimage
LABEL maintainer = " " 
ENV APP_HOME /app 
WORKDIR $APP_HOME
COPY / ./
# install nano 
RUN apt-get update \
    && apt-get install --yes --no-install-recommends \
        apt-utils \
        apt-transport-https \
        curl \
        gnupg \
        unixodbc-dev \ 
        gcc \
        g++ \ 
        nano \
    && 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 --yes --no-install-recommends msodbcsql17 \
    && apt-get install libgssapi-krb5-2 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /tmp/*
 RUN pip install -r requirements.txt
 CMD ["python","app.py"]

requirements.txt:

pyodbc==4.0.28
google-cloud-bigquery==1.24.0    
google-cloud-storage==1.26.0

从现在开始你应该很好。

从那时起,我设法建立了一个 Airflow 命名连接到我们的 sql 服务器,并且正在使用 mssql_operator 或 mssql_hook。我曾与一位云工程师合作,将网络设置得恰到好处。我发现命名连接更容易使用,但 kubernetesPodOperator 仍然更可靠。

【讨论】:

    【解决方案4】:

    这很简单!不需要 DockerFile、KubernetesPodOperator、LD_LIBRARY_PATH 等,只需一个基本的 python 运算符就可以了

    需要考虑的要点

    • GCP Composer Worker 的 Pod 映像是 ubuntu 1604(只需使用命令 os.system('cat /etc/os-release') 运行基本的 python 操作符来检查)
    • 它已经在 worker 的 pod 映像上安装了 unixodbc-dev
    • Composer 创建存储桶并通过气流安装它
    • 那么为什么不直接从 pypi 包中安装 pyodbc,并在 pyodbc 连接方法中提供 mssql odbc 驱动程序作为参数

    这里 'gs://bucket_created_by_composer' == '/home/airflow/gcs'

    gcs bucket created by composer ->
              -> data/
              -> dags/
    

    循序渐进的方法

    第 1 步: 在任何 ubuntu 实例上安装 pyodbc、mssql odbc 以获取驱动程序文件

    考虑到让我们在 GCP VM Intance 上使用 ubuntu 1804 映像进行操作

    #update the packages
    sudo apt update
    sudo apt-get update -y
    curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
    curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
    sudo apt-get update -y
    echo Installing mssql-tools and unixODBC developer...
    sudo ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev
    sudo apt-get update -y
    sudo apt-get install  -y mssql-tools #it includes sql_cmd and bcp (we dont need those)
    sudo apt install python3-pip #installing pip3
    pip3 install pyodbc 
    

    第二步:获取Driver Files并上传到composer创建的gcs_bucket的data文件夹中

    cd /opt/microsoft
    #now you can see there is one directory 'msodbcsql17', version may change
    #we need to upload this directory to the data folder of gcs_bucket
    
    #for this you may choose which ever approach suits you
    #copying the directory to /<home/user> for proper zipping/uploading to gcs
    cp -r msodbcsql17 /home/<user> #you may need to use sudo 
    #upload this /home/<user>/msodbcsql17 to any gcs_bucket 
    gsutil cp -r /home/<user>/msodbcsql17 gs://<your-gcs-bucket>
    

    将此文件夹从gcs存储桶下载到本地,并将此文件夹上传到composer创建的gcs存储桶的数据文件夹中

    选择任何方法/方法,主要目的是获取composer创建的gcs存储桶的data文件夹中的msodbcsql17文件夹

    最终结构:

    gcs bucket created by composer ->
              -> data/msodbcsql17/
              -> dags/<your_dags.py>
    

    第 3 步:使用此 msodbcsql17 驱动程序进行 pyodbc 连接

    示例 DAG:

    import os
    import time
    import datetime
    import argparse
    import json
    from airflow import DAG
    import airflow
    
    from airflow.operators import python_operator
    
    
    default_dag_args = {
        'start_date': airflow.utils.dates.days_ago(0), #
        'provide_context': True
    }
    
    
    
    dag = DAG(
            'pyodbc_test',
            schedule_interval=None, #change for composer
            default_args=default_dag_args
            )
    
    
    def check_connection(**kwargs):
        print('hello')
        driver='/home/airflow/gcs/data/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1'
        #this is the main driver file, the exact location can be found on gcs_bucket/data folder or check the /etc/odbcinst.in file of ubuntu instance in which you installed the pyodbc earlier
    
        def tconnection(ServerIp,LoginName,Password,mssql_portno):
            """ A method which return connection object"""
            import pyodbc
            pyodbc.pooling = False 
            try:   
                sql_conn = pyodbc.connect("DRIVER={4};SERVER={0},{1};UID={2};PWD={3}".format(ServerIp,mssql_portno,LoginName,Password,driver)) 
            except pyodbc.Error as ex:
                sqlstate = ex.args[1]
                raise
    
    
            return sql_conn
    
        con=tconnection('<your-server-ip>','<your-login-name>','<your-password>','1433')
        #recommendation is to take the password and login from airflow connections
        import pandas as pd
        q='select * from <your-db-name>.<your-schema-name>.<your-table-name>'
        df=pd.read_sql(q,con)
        print(df)
    
    Tcheck_connection= python_operator.PythonOperator(
            task_id='Tcheck_connection',
            python_callable=check_connection,
            dag=dag ) 
    
    
    #calling the task sequence
    Tcheck_connection 
    

    PYPI 包

    pyodbc
    pandas
    

    最近在 Composer 上测试过

    【讨论】:

    • 在 composer image-version=composer-1.10.4-airflow-1.10.6 上测试,我可以通过 pypi 包安装 pyodbc,所以它有 unixodbc-dev
    • 您没有找到或创建 Ubuntu 18.04 虚拟机。您可以在 DAG 的 BashOperator 中运行命令的第 1 步和第 2 步。在 composer-1.15.2-airflow-1.10.14 上测试
    猜你喜欢
    • 1970-01-01
    • 2022-09-24
    • 2016-04-23
    • 1970-01-01
    • 2014-12-30
    • 2023-01-13
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多