¿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 añadir 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 Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0 (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 la 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 de root, sigue estos pasos:

  1. Lanza una instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2) 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 que no sea de sudo:

    sudo usermod -a -G docker ec2-user

    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:

    \# Base for AWS Glue
    FROM amazonlinux
    RUN yum update -y
    RUN yum install shadow-utils.x86\_64 -y
    RUN yum install -y java-1.8.0-openjdk.x86\_64
    RUN yum install -y python3
    RUN yum install -y cython doxygen numpy scipy gcc autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++
    # Additional components needed for grpcio
    WORKDIR /root
    RUN yum install python3-devel -y
    RUN yum install python-devel -y
    RUN pip3 install wheel
    # Install grpcio and related modules
    RUN pip3 install Cython
    RUN pip3 install cmake scikit-build
    RUN pip3 install grpcio
    # Create a directory for the wheel
    RUN mkdir wheel\_dir
    # Create the wheel
    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 5 meses