Configurando e utilizando o oracle-client no airflow
O Airflow é uma ferramenta desenvolvida no Airbnb para resolver seus problemas de fluxos de trabalho. Tem a característica de ser aberto, e permite agendar e monitorar as tarefas de forma simples.
Ele pode ser instalado diretamente em um sistema operacional linux pelo gerenciador de pacotes ou usando o docker. O exemplo apresentado aqui será baseado em uma instalação feita com o docker e utilizando o ubuntu.
Preparando o oracle-client
Vamos iniciar baixando o oracle-client para linux aqui. Baixe o pacote básico em formato zip.
Após o download, mova o arquivo para a máquina/servidor que será utilizado para a instalação do airflow.
Extraia os arquivos com:
unzip instantclient-<versao>.zip
Preparando o arquivo do docker
Faça o clone do repositório do puckel/docker-airflow.
No Dockerfile adicione a biblioteca libaio, como mostra a última linha.
&& apt-get install -yqq --no-install-recommends \
$buildDeps \
freetds-bin \
build-essential \
default-libmysqlclient-dev \
apt-utils \
curl \
rsync \
netcat \
locales \
libaio1 \
Na parte do arquivo em que é feita instalação das bibliotecas do python adicione a seguinte linha:
&& pip install cx_Oracle
Agora vamos adicionar os arquivos do oracle-client no docker, na parte em que há o COPY adicionamos a linha em negrito:
COPY script/entrypoint.sh /entrypoint.sh
COPY oracle-client /opt/oracle
Onde estamos copiando os arquivos presentes na pasta oracle-client para o pasta /opt/oracle. Dentro da pasta oracle-cliente tem outra pasta, a pasta que se obtém ao fazer o unzip de nome instantclient mais a versão:
/instantclient_19_5
No docker o caminho será:
/opt/oracle/instantclient_19_5
Para finalizar no Dockerfile, adicionar as seguintes linhas depois desse RUN específico:
RUN chown -R airflow: ${AIRFLOW_USER_HOME}ENV LD_LIBRARY_PATH /opt/otacle/instantclient_19_5:${LD_LIBRARY_PATH}
ENV PATH /opt/otacle/instantclient_19_5:${PATH}
Pronto, agora podemos fazer o build na imagem. Após gerar a imagem e iniciar o container, pegamos o id do container ou nome do container e executamos:
docker exec -it nome_container bash
Após estar no container executamos:
sudo sh -c "echo /opt/oracle/instantclient_19_3 > \
/etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig
Agora é só escrever o script python que se conecta a um banco oracle:
import pandas as pd
from sqlalchemy import create_engineengine = create_engine = ("oracle+cx_oracle://usuario:senha@nome_dominio_ip:1521/nome_servico")sql = "SELECT * FROM SCHEMA.TBL_TABELA"
df_tabela = pd.read_sql(sql, engine)
Referências