Desarrollo y prueba de ETL Pipelines para AWS a nivel local

Nodo de origen: 997665

Desarrollo y prueba de ETL Pipelines para AWS a nivel local

Por lo general, el desarrollo y la prueba de las canalizaciones ETL se realizan en entornos / clústeres reales, lo que requiere mucho tiempo de configuración y mantenimiento. Este artículo se centra en el desarrollo y la prueba de canalizaciones ETL a nivel local con la ayuda de Docker y LocalStack. La solución brinda flexibilidad para realizar pruebas en un entorno local sin configurar ningún servicio en la nube.


By Subhash Sreenivasachar, Ingeniero de software líder técnico en Epsilon

Introducción

 
 
AWS desempeña un papel fundamental a la hora de ayudar a los ingenieros y científicos de datos a centrarse en la creación de soluciones y la resolución de problemas sin preocuparse por la necesidad de configurar la infraestructura. Con el enfoque de precios sin servidor y de pago por uso, AWS facilita la creación de servicios sobre la marcha.

Los ingenieros de datos utilizan ampliamente AWS Glue para crear canalizaciones ETL sin servidor. PySpark es una de las tecnologías comunes que se utilizan para el desarrollo. Sin embargo, a pesar de la disponibilidad de servicios, existen ciertos desafíos que deben abordarse.

La depuración del código en el entorno de AWS, ya sea para el script ETL (PySpark) o cualquier otro servicio, es un desafío.

  • El monitoreo continuo del uso del servicio de AWS es clave para mantener el factor de costo bajo control
  • AWS ofrece Dev Endpoint con todas las bibliotecas Spark instaladas, pero teniendo en cuenta el precio, no es viable para su uso en grandes equipos de desarrollo.
  • La accesibilidad de los servicios de AWS puede ser limitado para ciertos usuarios

Solución

 
 
Las soluciones para AWS se pueden desarrollar y probar en un entorno local sin preocuparse por la accesibilidad o el factor de costo. A través de este artículo, abordamos dos problemas:

  1. Depurar el código de PySpark de forma local sin utilizar puntos de enlace de desarrollo de AWS.
  2. Interactuar con los servicios de AWS de forma local

Ambos problemas se pueden resolver con el uso de imágenes de Docker.

  1. Primero, eliminamos la necesidad de un servidor en el entorno de AWS y, en su lugar, una imagen de la ventana acoplable que se ejecuta en la máquina actúa como el entorno para ejecutar el código.

AWS proporciona una imagen de espacio aislado que se puede utilizar para scripts de PySpark. La imagen de Docker se puede configurar para ejecutar PySpark Code. https://aws.amazon.com/blogs/big-data/developing-aws-glue-etl-jobs-locally-using-a-container/
 

  1. Con la máquina acoplable disponible para ejecutar el código, existe la necesidad de un servicio como S3 para almacenar (leer / escribir) archivos mientras se construye una canalización ETL.

Las interacciones con S3 se pueden reemplazar con pila local que proporciona un marco de prueba / simulación fácil de usar para desarrollar aplicaciones en la nube. Genera un entorno de prueba en su máquina local que proporciona la misma funcionalidad y API que el entorno real en la nube de AWS.

Encabezamiento

Hasta ahora, el artículo trata sobre la construcción de una canalización ETL y el uso de los servicios disponibles. Sin embargo, un enfoque similar se puede adaptar a cualquier caso de uso mientras se trabaja con servicios de AWS como SNS, SQS, CloudFormation, funciones Lambda, etc.

Enfoque

  • Utilice contenedores de Docker como intérprete remoto
  • Ejecute la sesión de PySpark en los contenedores
  • Acelere el servicio S3 localmente usando LocalStack
  • Use el código PySpark para leer y escribir desde el bucket de S3 que se ejecuta en LocalStack

Pre-requisitos

 
Las siguientes herramientas deben estar instaladas en su máquina

  • Docker
  • PyCharm Professional / Código VisualStudio

Preparar

  • Descargar o extraer imágenes de la ventana acoplable (docker pull )
    • libs: glue_libs_1.0.0_image_01
    • localstack / localstack
  • Los contenedores Docker se pueden utilizar como intérpretes remotos en la versión profesional de PyCharm.

Implementación

 
Con Docker instalado y las imágenes extraídas de su máquina local, comience a configurar PyCharm con configuraciones para iniciar los contenedores.

  • Crea un archivo docker-compose.yml

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-docker-compose-yml

  • Crear un DockerFile

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-dockerfile

  • Utilice el archivo de requisitos con los paquetes que se instalarán

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-requirements-txt
 

  • Configurar el intérprete remoto de Python
    • Configure el intérprete de Python utilizando el archivo docker-compose.
    • Seleccione "servicio de pegamento" en la configuración de PyCharm Docker Compose.
    • El archivo Docker-compose crea y ejecuta los contenedores para ambas imágenes.
    • LocalStack se ejecuta de forma predeterminada en el puerto 4566 y el servicio S3 está habilitado en él

Código

  • Bibliotecas necesarias para importar

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-imports

  • Agregar un archivo al bucket de S3 que se ejecuta en LocalStack

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-add_to_bucket
http://host.docker.internal:4566 ¿El S3 se ejecuta localmente dentro del contenedor de la ventana acoplable?

  • Configurar la sesión de PySpark para leer desde S3

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-create_pyspark_session

  • La sesión de PySpark se conecta a S3 a través de credenciales simuladas proporcionadas
  • Puede leer desde S3 directamente usando la sesión de PySpark creada

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-read_from_s3

  • Finalmente, es posible escribir en S3 en cualquier formato preferido

https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-write_to_s3

Una vez que se hayan seguido los pasos mencionados anteriormente, podemos crear un archivo csv ficticio con datos simulados para probar y debería ser bueno para

  • Agregar archivo a S3 (que se ejecuta en LocalStack)
  • Leer de S3
  • Escribir de nuevo a S3 como parquet

Debería poder ejecutar el archivo .py para ejecutar y se creará una sesión de PySpark que pueda leer desde el depósito S3 que se ejecuta localmente mediante la API de LocalStack.

Además, también puede comprobar si LocalStack se está ejecutando con http://localhost:4566/health

LocalStack también le brinda la posibilidad de ejecutar comandos mediante la AWS CLI.

Conclusión

 
 
El uso de Docker y Localstack proporciona una forma rápida y sencilla de ejecutar el código Pyspark, depurar contenedores y escribir en S3 que se ejecuta localmente. Todo esto sin tener que conectarse a ningún servicio de AWS.

 
Referencias:

 
Bio: Subhash Sreenivasachar es ingeniero de software líder en el equipo de experiencia digital de Epsilon, que crea soluciones de ingeniería para resolver problemas de ciencia de datos, específicamente la personalización, y ayuda a impulsar el retorno de la inversión para los clientes.

Relacionado:

Fuente: https://www.kdnuggets.com/2021/08/development-testing-etl-pipelines-aws-locally.html

Sello de tiempo:

Mas de nuggets