9.4 Testando tudo junto

Para integrar o Airflow com o Spark vamos utilizar o Apache Livy. O Apache Livy é uma aplicação que fornece uma API REST para interagir com o contexto de execução do Spark.

9.4.1 Preparando Apache Livy

Da mesma forma que fizemos para o Airflow e para o Spark, crie uma pasta serving-batch/livy para prepararmos a imagem do contêiner do Livy.

O Dockerfile do Livy é semelhante ao do Spark, mas inclui a instalação do Livy.

FROM python:3.10.11-slim

ENV SPARK_VERSION=3.5.1
ENV HADOOP_VERSION=3
ENV LIVY_VERSION=0.8.0
ENV SCALA_VERSION=2.12
ENV SPARK_VERSION_STRING=spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}
ENV LIVY_VERSION_STRING=apache-livy-${LIVY_VERSION}-incubating_${SCALA_VERSION}-bin
ENV SPARK_HOME=/spark
ENV LIVY_HOME=/livy

# Instalação do Spark
ADD http://dlcdn.apache.org/spark/spark-${SPARK_VERSION}/${SPARK_VERSION_STRING}.tgz /
RUN tar xzf ${SPARK_VERSION_STRING}.tgz \
    && mv ${SPARK_VERSION_STRING} ${SPARK_HOME} \
    && rm ${SPARK_VERSION_STRING}.tgz

ENV OPENJDK_VERSION=17

# Instalação do Java e dependências do SO
RUN apt-get -y update && \
    apt-get install --no-install-recommends -y \
    openjdk-${OPENJDK_VERSION}-jdk \
    procps zip libssl-dev libkrb5-dev libffi-dev libxml2-dev libxslt1-dev python-dev build-essential && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Instalação do Livy
ADD https://dlcdn.apache.org/incubator/livy/${LIVY_VERSION}-incubating/${LIVY_VERSION_STRING}.zip /
RUN unzip ${LIVY_VERSION_STRING}.zip \
    && mv ${LIVY_VERSION_STRING} ${LIVY_HOME} \
    && rm ${LIVY_VERSION_STRING}.zip \
    && mkdir ${LIVY_HOME}/logs    

# Atualização do pip e instalação de dependências Python
# Adicionado COPY do requirements.txt antes de usá-lo
COPY requirements.txt /tmp/ 
RUN python3 -m pip install --upgrade pip wheel setuptools && \
    python3 -m pip cache purge

# Instalação do PySpark e dependências do requirements.txt
RUN cd ${SPARK_HOME}/python && python3 setup.py install && \
    python3 -m pip install -r /tmp/requirements.txt && \
    python3 -m pip cache purge

ENV PATH=/usr/local/openjdk-${OPENJDK_VERSION}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${SPARK_HOME}/bin:${LIVY_HOME}/bin
# A linha ENV PYSPARK_PYTHON=/usr/bin/python3 é redundante se a próxima for usada.
# ENV PYSPARK_PYTHON=/usr/bin/python3 
# Esta deve prevalecer se python3 foi instalado via apt ou é o default do python:3.10.11-slim
ENV PYSPARK_PYTHON=/usr/local/bin/python3 
# Usar ${SPARK_HOME} para consistência
ENV SPARK_CONF_DIR=${SPARK_HOME}/conf 

COPY livy.conf ${LIVY_HOME}/conf
# Usar ${SPARK_HOME} para consistência
COPY spark-defaults.conf ${SPARK_HOME}/conf 

RUN ln -sf /usr/local/bin/python3 /usr/bin/python
# Porta padrão do Livy
EXPOSE 8998 

O Livy tem um arquivo de configuração chamado livy.conf, ele é copiado para a imagem do contêiner. Gere um arquivo na pasta de acordo com o exemplo:

Existem muitas outras opções de configurações, como mostra o exemplo.

O Livy também precisa dos arquivos requirements.txt e spark-defaults.conf (renomeado de spark.conf) mostrado na seção 9.2. Remova as dependências exclusivas do Jupyter para gerar o requirements.txt do Livy.

Agora no diretório serving-batch vamos gerar o docker-compose.yaml para fazer a integração entre os componentes:

Repare que os volumes apontam para os diretórios locais e precisamos copiar os dados e o modelo treinado para as pastas. Vamos rodar o Airflow junto para simular a integração, repare "airflow" dentro do docker-compose.yaml.

Agora sim podemos fazer o build do Livy através do comando do docker-compose.

9.4.2 Código da aplicação Spark

Copie o exemplo pi.py para a pasta /src. Ele será o primeiro teste com Spark e Livy.

9.4.3 Airflow Livy Operator

O Airflow tem um operador para implementar a integração com o Livy. Verifique a documentação do operador. O seguinte trecho é uma chamada de task para o operador do Livy:

Este operador utiliza a conexão default do Livy para obter configurações como endpoint e porta para conexão. Certifique-se de configurar esta conexão na UI do Airflow.

Execute sua DAG e veja o resultado.

9.4.4 Executando a inferência

Da mesma forma que executamos o pi.py podemos executar a inferência do modelo, assim como já vimos na seção 9.2.

Inclua essa nova task na sua DAG e verifique o resultado.

9.4.5 Kubernetes

Existem outras formas de integrar o Airflow com o Spark, uma delas é usando a execução nativa do Spark com Kubernetes e o operador de Airflow para Spark. Explore a documentação do Apache Spark e Apache Airflow para configuração em ambiente Kubernetes.

9.4.6 Cloud

Muitos provedores de cloud oferecem serviços gerenciados para Spark (ex: Databricks, AWS EMR, Google Dataproc) e Airflow (ex: AWS MWAA, Google Cloud Composer). A integração entre eles geralmente é facilitada por operadores específicos fornecidos pelos provedores ou pela comunidade Airflow.

Last updated