Como criar um plugin personalizado com a Oracle - Amazon Managed Workflows for Apache Airflow

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como criar um plugin personalizado com a Oracle

O exemplo a seguir mostra as etapas para criar um plug-in personalizado usando a Oracle para Amazon MWAA e pode ser combinado com outros plug-ins e binários personalizados em seu arquivo plugins.zip.

Versão

  • O código de amostra nesta página pode ser usado com o Apache Airflow v1 em Python 3.7.

  • Você pode usar o exemplo de código nesta página com o Apache Airflow v2 e superior no Python 3.10.

Pré-requisitos

Para usar o código de amostra nesta página, você precisará do seguinte:

Permissões

  • Nenhuma permissão adicional é necessária para usar o exemplo de código nesta página.

Requisitos

Para usar o código de amostra nesta página, adicione as seguintes dependências ao seu requirements.txt. Para saber mais, consulte Como instalar dependências do Python.

Apache Airflow v2
-c https://raw.githubusercontent.com/apache/airflow/constraints-2.0.2/constraints-3.7.txt cx_Oracle apache-airflow-providers-oracle
Apache Airflow v1
cx_Oracle==8.1.0 apache-airflow[oracle]==1.10.12

Exemplo de código

As etapas a seguir descrevem como criar o código do DAG que testará o plugin personalizado.

  1. No prompt de comando, navegue até o diretório em que o código do DAG está armazenado. Por exemplo:

    cd dags
  2. Copie o conteúdo da amostra de código a seguir e salve localmente como oracle.py.

    from airflow import DAG from airflow.operators.python_operator import PythonOperator from airflow.utils.dates import days_ago import os import cx_Oracle DAG_ID = os.path.basename(__file__).replace(".py", "") def testHook(**kwargs): cx_Oracle.init_oracle_client() version = cx_Oracle.clientversion() print("cx_Oracle.clientversion",version) return version with DAG(dag_id=DAG_ID, schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: hook_test = PythonOperator( task_id="hook_test", python_callable=testHook, provide_context=True )

Criar o plugin personalizado

Esta seção descreve como baixar as dependências, criar o plug-in personalizado e o plugins.zip.

Download de dependências

O Amazon MWAA extrairá o conteúdo do plugins.zip em /usr/local/airflow/plugins sobre cada contêiner de agendador e trabalho do Amazon MWAA. Isso é usado para adicionar binários ao seu ambiente. As etapas a seguir descrevem como montar os arquivos necessários para o plugin personalizado.

Extraia a imagem de contêiner do Amazon Linux
  1. Em seu prompt de comando, extraia a imagem do contêiner Amazon Linux e execute o contêiner localmente. Por exemplo:

    docker pull amazonlinux docker run -it amazonlinux:latest /bin/bash

    Seu prompt de comando deve invocar uma linha de comando bash. Por exemplo:

    bash-4.2#
  2. Instale o recurso de I/O assíncrono nativo do Linux (libaio).

    yum -y install libaio
  3. Mantenha essa janela aberta para as etapas subsequentes. Copiaremos os seguintes arquivos localmente: lib64/libaio.so.1, lib64/libaio.so.1.0.0, lib64/libaio.so.1.0.1.

Baixe a pasta do cliente
  1. Instale o pacote de descompactação localmente. Por exemplo:

    sudo yum install unzip
  2. Crie um diretório oracle_plugin. Por exemplo:

    mkdir oracle_plugin cd oracle_plugin
  3. Use o comando cURL a seguir para baixar o instantclient-basic-linux.x64-18.5.0.0.0dbru.zip do Oracle Instant Client Downloads for Linux x86-64 (64-bit).

    curl https://download.oracle.com/otn_software/linux/instantclient/185000/instantclient-basic-linux.x64-18.5.0.0.0dbru.zip > client.zip
  4. Descompacte o arquivo client.zip. Por exemplo:

    unzip *.zip
Extrair arquivos do Docker
  1. Em um novo prompt de comando, exiba e grave o ID do contêiner do Docker. Por exemplo:

    docker container ls

    Seu prompt de comando deve retornar todos os contêineres e seus IDs. Por exemplo:

    debc16fd6970
  2. Em seu diretório oracle_plugin, extraia os arquivos lib64/libaio.so.1, lib64/libaio.so.1.0.0, lib64/libaio.so.1.0.1 para a pasta local instantclient_18_5. Por exemplo:

    docker cp debc16fd6970:/lib64/libaio.so.1 instantclient_18_5/ docker cp debc16fd6970:/lib64/libaio.so.1.0.0 instantclient_18_5/ docker cp debc16fd6970:/lib64/libaio.so.1.0.1 instantclient_18_5/

Plug-in personalizado

O Apache Airflow executará o conteúdo dos arquivos Python na pasta de plugins na inicialização. Isto é usado para definir e modificar variáveis de ambiente. As seguintes etapas descrevem o código de exemplo para o plugin personalizado.

  • Copie o conteúdo da amostra de código a seguir e salve localmente como env_var_plugin_oracle.py.

    from airflow.plugins_manager import AirflowPlugin import os os.environ["LD_LIBRARY_PATH"]='/usr/local/airflow/plugins/instantclient_18_5' os.environ["DPI_DEBUG_LEVEL"]="64" class EnvVarPlugin(AirflowPlugin): name = 'env_var_plugin'

Plugins.zip

As etapas a seguir mostram como criar plugins.zip. O conteúdo deste exemplo pode ser combinado com seus outros plug-ins e binários em um único arquivo plugins.zip.

Compacte o conteúdo do diretório do plug-in
  1. Em um prompt de comando, navegue até o diretório oracle_plugin. Por exemplo:

    cd oracle_plugin
  2. Compacte o diretório instantclient_18_5 em plugins.zip. Por exemplo:

    zip -r ../plugins.zip ./
  3. Você deve ver o seguinte em seu prompt de comando:

    oracle_plugin$ ls client.zip instantclient_18_5
  4. Remova o arquivo client.zip. Por exemplo:

    rm client.zip
Compacte o arquivo env_var_plugin_oracle.py
  1. Adicione o arquivo env_var_plugin_oracle.py à raiz do plugins.zip. Por exemplo:

    zip plugins.zip env_var_plugin_oracle.py
  2. Agora seu arquivo plugins.zip deve incluir o seguinte:

    env_var_plugin_oracle.py instantclient_18_5/

Opções de configuração Airflow

Se você estiver usando o Apache Airflow v2, adicione core.lazy_load_plugins : False como uma opção de configuração do Apache Airflow. Para saber mais, consulte Usando opções de configuração para carregar plug-ins em 2.

Próximas etapas