¿Cómo puedo utilizar bibliotecas de Python externas en mi trabajo de ETL de AWS Glue?

6 minutos de lectura
0

Quiero usar bibliotecas de Python externas en un trabajo de extracción, transformación y carga (ETL) de AWS Glue.

Descripción corta

Cuando usas las versiones 2.0, 3.0 y 4.0 de AWS Glue, puedes instalar módulos de Python adicionales o diferentes versiones de módulos a nivel de trabajo. Para agregar un módulo nuevo o cambiar la versión de un módulo existente, usa la clave de parámetro de trabajo --additional-python-modules. El valor de la clave es una lista de nombres de módulos de Python separados por comas. Cuando usas este parámetro, el trabajo de ETL de AWS Glue instala los módulos adicionales mediante el instalador de paquetes de Python (pip3).

También puedes usar el parámetro --additional-python-modules para instalar bibliotecas de Python que estén escritas en lenguajes basados en C.

Resolución

Instalación o actualización de los módulos de Python

Para instalar un módulo de Python adicional para el trabajo de AWS Glue, sigue estos pasos:

  1. Abre la consola de AWS Glue.
  2. En el panel de navegación, elige Trabajos.
  3. Selecciona el trabajo en el que desees agregar el módulo de Python.
  4. Elige Acciones y, a continuación, Editar trabajo.
  5. Amplía la sección Configuración de seguridad, bibliotecas de scripts y parámetros del trabajo (opcional).
  6. En Parámetros del trabajo, sigue estos pasos:
    En Clave, escribe --additional-python-modules.
    En Valor, introduce una lista separada por comas de los módulos que deseas añadir.
  7. Selecciona Guardar.

Por ejemplo, supongamos que quieres añadir dos módulos nuevos, la versión 1.0.2 de PyMySQL y la versión 3.6.2 del Natural Language Toolkit (NLTK). El módulo PyMySQL se instala desde Internet y el módulo NLTK desde un bucket de Amazon Simple Storage Service (Amazon S3). En ese caso, la clave de parámetro --additional-python-modules tiene el valor pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl.

Algunos módulos tienen dependencias en otros módulos. Si instalas o actualizas un módulo de este tipo, también debes descargar los demás módulos de los que depende. Esto significa que debes tener acceso a Internet para instalar o actualizar el módulo. Si no tienes acceso a Internet, consulta Creación de módulos de Python a partir de un archivo wheel para cargas de trabajo de ETL de Spark mediante AWS Glue 2.0.

Para obtener una lista de los módulos de Python que se incluyen en cada versión de AWS Glue de forma predeterminada, consulta los módulos de Python que ya se proporcionan en AWS Glue.

Instalación de módulos de Python basados en C

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

AWS Glue también admite bibliotecas y extensiones escritas en C con el parámetro --additional-python-modules. Sin embargo, para instalar algunos módulos de Python, como spacy y grpc, se requieren permisos raíz. AWS Glue no proporciona acceso raíz durante la instalación del paquete. Para resolver el problema, precompila los binarios en un archivo wheel compatible con AWS Glue e instala ese archivo wheel.

Para compilar una biblioteca en un lenguaje basado en C, el compilador debe ser compatible con la arquitectura del procesador y el sistema operativo de destino. Si la biblioteca se compila con un sistema operativo o una arquitectura de procesador diferente, el archivo wheel no se instala en AWS Glue. Dado que AWS Glue es un servicio administrado, el acceso al clúster no está disponible para desarrollar estas dependencias.

Para precompilar un módulo de Python basado en C que requiere permisos raíz, sigue estos pasos:

  1. Inicia una instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2) (AMI de Amazon Linux 2) con suficiente espacio de volumen para tus bibliotecas.

  2. Instala Docker en la instancia de EC2, configura el acceso que no sea de sudo y, a continuación, inicia Docker. Para ello, ejecuta los siguientes comandos:

    Instala Docker:

    sudo yum install docker -y

    Configura el acceso a sudo:

    sudo su

    Inicia Docker:

    sudo service docker start
  3. Crea un archivo Dockerfile para el módulo. Por ejemplo, para instalar el módulo grpcio, crea un archivo denominado dockerfile_grpcio y copia el siguiente contenido en el archivo:

    FROM amazonlinux:2  
    \# Install required repositories and tools  
    RUN yum update -y  
    RUN yum install shadow-utils.x86\_64 -y  
    \# Install Java 8 (corrected package name)  
    RUN yum install -y java-1.8.0-openjdk.x86\_64  
    \# Install Python 3.7  
    WORKDIR /opt  
    RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget tar make  
    \# Install Python 3.7  
    RUN wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz  
    RUN tar xzf Python-3.7.12.tgz  
    WORKDIR /opt/Python-3.7.12  
    RUN ./configure --enable-optimizations  
    RUN make altinstall  
    RUN ln -sf /usr/local/bin/python3.7 /usr/bin/python3  
    RUN ln -sf /usr/local/bin/pip3.7 /usr/bin/pip3  
    \# Verify Python version  
    RUN python3 --version  
    RUN pip3 --version  
    \# Install other dependencies  
    RUN yum install -y doxygen autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++  
    RUN yum install -y python3-devel  
    \# Install Python packages  
    RUN pip3 install --upgrade pip  
    RUN pip3 install wheel  
    RUN pip3 install cython numpy scipy  
    RUN pip3 install cmake scikit-build  
    \# Create wheel directory and install grpcio  
    WORKDIR /root  
    RUN mkdir wheel\_dir  
    RUN pip3 install Cython  
    RUN pip3 install grpcio  
    RUN pip3 wheel grpcio -w wheel\_dir
  4. Ejecuta el comando docker build para crear el Dockerfile:

    docker build -f dockerfile\_grpcio .
  5. Reinicia el daemon de Docker:

    sudo service docker restart

    Cuando se complete el comando docker build, recibirás un mensaje de éxito que contiene tu ID de imagen de Docker. Por ejemplo, «Successfully built 1111222233334444». Anota el identificador de la imagen de Docker para utilizarlo en el siguiente paso.

  6. Extrae el archivo wheel .whl del contenedor de Docker. Para ello, ejecuta los siguientes comandos:

    Obtén el identificador de la imagen de Docker:

    docker image ls

    Ejecuta el contenedor, pero reemplaza 1111222233334444 por tu ID de imagen de Docker:

    docker run -dit 111122223334444

    Comprueba la ubicación del archivo wheel y recupera el nombre del archivo wheel, pero sustituye 5555666677778888 por tu ID de contenedor:

    docker exec -t -i 5555666677778888 ls /root/wheel\_dir/

    Copia el archivo wheel del contenedor de Docker en Amazon EC2:

    docker cp 5555666677778888:/root/wheel\_dir/doc-example-wheel .

    Nota: Sustituye doc-example-wheel por el nombre del archivo wheel generado.

  7. Para cargar el archivo wheel en Amazon S3, ejecuta los siguientes comandos:

    aws s3 cp doc-example-wheel s3://path/to/wheel/
    aws s3 cp grpcio-1.32.0-cp37-cp37m-linux\_x86\_64.whl s3://aws-glue-add-modules/grpcio/

    Nota: Sustituye grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl por el nombre del archivo de paquete Python.

  8. Abre la consola de AWS Glue.

  9. Para el trabajo de ETL de AWS Glue, en Parámetros del trabajo, introduce lo siguiente:
    En Clave, escribe --additional-python-modules.
    En Valor, introduce s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl.

Información relacionada

Using Python libraries with AWS Glue

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 meses