Google Composer - Как установить драйверы ODBC для Microsoft SQL Server в среде

Я новичок в GCP и Airflow и пытаюсь запустить свои конвейеры python через простое соединение PYODBC через python 3. Однако я считаю, что нашел то, что мне нужно установить на машинах [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:

Ошибка воздушного потока

Вот соединение PYODBC:

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

Когда я открываю свою оболочку gcloud в средах и запускаю загрузку Microsoft, она просто прерывается, когда я загружаю SDK и подключаюсь к проекту из локальной загрузки, он автоматически прерывается или не распознает команды от Microsoft. Может кто-нибудь дать простую инструкцию, с чего начать и что я делаю не так?


person Justin McKelvy    schedule 21.02.2020    source источник
comment
Вы смотрели эту страницу? airflow.readthedocs.io/en/latest/howto/connection/odbc. html   -  person rmesteves    schedule 25.02.2020
comment
@rmesteves Спасибо за публикацию, я тоже это видел. Я думаю, что мне неудобно сделать несколько шагов до этого, где я изо всех сил пытаюсь определить интерфейс строки cmd с GCP, который установит драйверы для воздушного потока. Я получил доступ через строку cmd подключения кластера kubernetes, но в ней говорится, что все изменения эфемерны, когда я запускаю команды. Так что я просто не понимаю, куда мне нужно идти, чтобы выполнить необходимые установки или запустить команды.   -  person Justin McKelvy    schedule 25.02.2020


Ответы (4)


Это просто ! Нет необходимости в DockerFile, KubernetesPodOperator, LD_LIBRARY_PATH и т. Д. Достаточно простого оператора python.

Что следует учитывать

  • Образ GCP Composer Worker's Pod - это ubuntu 1604 (для проверки просто запустите базовый оператор Python с помощью команды os.system ('cat / etc / os-release'))
  • У него уже установлен unixodbc-dev в образе пода рабочего.
  • Композитор создает ковш и устанавливает его с помощью воздушного потока
  • Так почему бы просто не установить pyodbc из пакетов pypi и предоставить драйвер mssql odbc в качестве параметра в методе подключения pyodbc

здесь 'gs: // bucket_created_by_composer' == '/ home / airflow / gcs'

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

Пошаговый подход

Шаг 1. Установите pyodbc, mssql odbc на все экземпляры ubuntu, чтобы получить файлы драйверов.

для рассмотрения, давайте сделаем это на 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 

Шаг 2: получите файлы драйвера и загрузите их в папку данных gcs_bucket, созданную композитором.

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 на локальный компьютер и загрузите эту папку в папку данных ведра gcs, созданного композитором

выберите любой подход / метод, основная цель - получить папку msodbcsql17 в папке данных ведра gcs, созданного композитором

Окончательная структура:

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

person D.C    schedule 30.06.2020
comment
Протестировано на composer image-version = composer-1.10.4-airflow-1.10.6, мне удалось установить pyodbc через пакеты pypi, поэтому у него был unixodbc-dev - person D.C; 01.07.2020
comment
У вас нет находки или создания Ubuntu 18.04 vm. Вы можете выполнить шаги 1 и 2 команд в BashOperator в группе доступности базы данных. Проверено на composer-1.15.2-airflow-1.10.14 - person Steven Ensslen; 15.04.2021

Учтите, что Composer - это управляемая Google реализация Apache Airflow, поэтому ожидайте, что он будет вести себя иначе.

Имея это в виду, пользовательские зависимости Python а для двоичных зависимостей, недоступных в образе рабочего стола Cloud Composer, можно использовать параметр KubernetesPodOperator.

По сути, это позволяет вам создать собственный образ контейнера со всеми ваши требования, поместите его в репозиторий образов контейнера (Dockerhub, GCR), а затем перетащите в свою среду Composer, чтобы все ваши зависимости были соблюдены.

Это усиливается лучше, поскольку вам не нужно взаимодействовать с машинами (этот подход изложен в вашем исходном вопросе), и кажется, что проще просто создать образ контейнера с тем, что вам нужно.

В частности, говоря о pyodbc и в этом контексте установки зависимости с использованием Composer, есть запрос функции для решить эту проблему, в которой также описывается обходной путь (в основном то, что упоминается в этом ответе). Возможно, вы захотите это проверить.

person yyyyahir    schedule 27.02.2020
comment
Я собираюсь поддержать этот ответ, поскольку KubernetesPodOperator больше подходит для этого типа использования. - person Marcel Gongora; 13.03.2020

Cloud Composer в настоящее время в основном поддерживает установку пакетов PyPI, написанных на чистом Python. В настоящее время установка системных пакетов не поддерживается полностью, но есть некоторые обходные пути (например, установка LD_LIBRARY_PATH, загрузка разделяемых библиотек и т. Д.). Вы получаете прерывание, потому что вы установили часть пакета Python, но не системные зависимости, от которых зависит пакет Python.

Как вы читаете, изменения рабочих процессов Airflow в Composer эфемерны (или, по крайней мере, должны рассматриваться как таковые), но один из способов обойти это - установить пакеты, используя BashOperator перед задачей, которая требует библиотека работает. Это некрасиво, но гарантирует, что зависимости установлены на работнике до того, как будет вызван код Python, который в них нуждается.

person hexacyanide    schedule 26.02.2020
comment
Спасибо за ответ. Я думаю, что меня больше всего беспокоит масштабируемость чего-то вроде этого, а также время выполнения. Это кажется слишком сложным для чего-то столь же простого, как подключение к экземпляру SQL-сервера для передачи / извлечения данных. Должно быть лучшее решение с многофункциональной платформой для обработки больших данных, такой как воздушный поток. - person Justin McKelvy; 26.02.2020

Я столкнулся с той же проблемой. Первым решением, которое сработало для меня, было создание образа докера, который установил бы драйверы, а затем запустил код. Первоначально я пытался найти способ установки драйверов в кластере, но после многих неудач я прочитал в документации, что изображение воздушного потока в composer курируется Google, и никакие изменения, влияющие на изображение, недопустимы. Итак, вот мой файл докеров:

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 по-прежнему намного надежнее.

person Krystian    schedule 12.06.2020