M4E4 — Proyecto #3

TLC Pipeline - Parte 3: Construyendo un Data Lake

Este proyecto es la continuación directa de los proyectos anteriores de la TLC.

El objetivo principal de este proyecto es:

📌 Construir un Data Lake end-to-end implementando las capas raw y structured, registrando los datos en Glue Catalog y consultándolos desde AWS Athena.

Descripción del proyecto

Tu tarea en este proyecto es completar la arquitectura del Data Lake que hemos venido construyendo a lo largo del curso.

En el primer proyecto construimos la ingesta inicial de datos desde la página web de la TLC hacia la capa de landing en S3.

En el segundo proyecto automatizamos esa ingesta utilizando Apache Airflow como orquestador.

Ahora, en este proyecto, vamos a completar el pipeline implementando las capas de raw y structured, añadiendo chequeos de calidad de datos, manejando archivos inválidos en una capa de quarantine, y haciendo que los datos sean consultables desde Athena.

La idea es que al final de este proyecto tengas tu primer pipeline de datos end-to-end:

Consideraciones:

  • Se recomienda enfocarse inicialmente solo en el dataset de Yellow Trips. Luego se recomienda extender la solución a Green Trips u otros datasets.
  • La capa landing debe ser tratada como una capa transitoria.
  • La capa raw debe almacenar los datos válidos con mínima transformación.
  • La capa structured debe dejar los datos organizados, tipados, particionados y listos para consulta.
  • Los archivos que no cumplan los chequeos de calidad deben enviarse a quarantine.

Outcome final

La solución final debe:

  • Ingestar los datos del dataset de Yellow Trips.
  • Procesar, como mínimo, los archivos de Yellow Trips para el año 2025.
  • Procesar algunos archivos de 2024 para evidenciar diferencias de esquema y probar la lógica de quarantine.
  • Mover los archivos válidos desde landing hacia raw.
  • Enviar los archivos inválidos hacia quarantine.
  • Transformar los datos desde raw hacia structured.
  • Particionar los datos en la capa structured.
  • Mapear los datos en Glue Catalog.
  • Hacer los datos consultables a través de AWS Athena.
  • Orquestar todo el pipeline utilizando Apache Airflow.

Instrucciones

1. Revisar la arquitectura del Data Lake

Antes de implementar el proyecto, asegúrate de entender el propósito de cada capa del Data Lake.

Vamos a trabajar con las siguientes capas:

  • Landing: capa transitoria donde llegan los archivos desde la fuente.
  • Raw: capa donde se almacenan los datos válidos con mínima transformación.
  • Structured: capa consultable del Data Lake. Aquí los datos deben estar organizados, tipados y particionados.
  • Quarantine: capa donde se almacenan los archivos que no cumplen los chequeos de calidad.

La estructura sugerida en S3 puede lucir así:

s3://<your-bucket>/landing/yellow-trips/
s3://<your-bucket>/raw/yellow-trips/
s3://<your-bucket>/structured/yellow-trips/
s3://<your-bucket>/quarantine/yellow-trips/

2. Implementar el proceso de landing a raw

Implementa un proceso encargado de leer los archivos desde la capa landing y decidir si deben enviarse a raw o a quarantine.

Este proceso puede implementarse de dos maneras:

  1. Usando AWS Lambda + Python.
  2. Usando AWS Glue + Spark.
📌 Si todavía estás empezando, te recomiendo hacerlo con Lambda.
📌 Si quieres retarte técnicamente, puedes hacerlo con Glue.

Este proceso debe:

  1. Leer el archivo desde landing.
  2. Ejecutar chequeos básicos de calidad de datos.
  3. Validar que el archivo contiene las columnas esperadas. Por ejemplo:
    1. Validar que el archivo tenga todas las columnas esperadas.
    2. Validar que el esquema corresponda al formato definido para 2025.
    3. Validar que el archivo pueda ser leído correctamente.
  4. Usar como esquema estándar el formato de los archivos de 2025.
  5. Si el archivo no cumple los chequeos:
    • mover el archivo a quarantine;
    • registrar el error;
    • opcionalmente, enviar una alerta a un correo.
  1. Si el archivo cumple los chequeos:
    • añadir una columna ds en formato YYYY-MM-DD;
    • añadir una columna file_name con el nombre original del archivo;
    • escribir el archivo en raw;
    • eliminar el archivo de landing.

La estructura esperada en raw puede lucir así:

s3://<your-bucket>/raw/yellow-trips/yellow_tripdata_2025-01.parquet
s3://<your-bucket>/raw/yellow-trips/yellow_tripdata_2025-02.parquet
s3://<your-bucket>/raw/yellow-trips/yellow_tripdata_2025-03.parquet

O, si decides particionar desde esta capa:

s3://<your-bucket>/raw/yellow-trips/ds=2025-01-01/
s3://<your-bucket>/raw/yellow-trips/ds=2025-02-01/
s3://<your-bucket>/raw/yellow-trips/ds=2025-03-01/
📌 Nota: para este proyecto, el particionamiento más importante debe ocurrir en structured, porque esta será la primera capa pensada para consulta.

3. Implementar la capa structured

Crea un Glue Job (o Lambda function) que tome los archivos desde raw y los escriba en la capa structured.

Este job debe:

  • Leer los archivos válidos desde raw.
  • Estandarizar los tipos de datos.
  • Convertir fechas a tipo date.
  • Convertir timestamps a tipo timestamp.
  • Convertir columnas numéricas a tipos adecuados como doubleint o bigint.
  • Añadir columnas derivadas si lo consideras útil.
  • Escribir los datos en formato columnar, idealmente Parquet.
  • Particionar los datos usando ds.

La estructura recomendada para structured es:

s3://<your-bucket>/structured/yellow-trips/ds=YYYY-MM-DD/

Por ejemplo:

s3://<your-bucket>/structured/yellow-trips/ds=2025-01-01/
s3://<your-bucket>/structured/yellow-trips/ds=2025-02-01/
s3://<your-bucket>/structured/yellow-trips/ds=2025-03-01/

La partición por ds permite que motores como Athena escaneen menos datos al ejecutar consultas, reduciendo costos y mejorando el rendimiento.


4. Registrar los datos en Glue Catalog

Una vez tengas los datos en structured, debes registrarlos en Glue Catalog para que puedan ser consultados desde Athena.

Para esto, crea un Glue Crawler que apunte a la ruta:

s3://<your-bucket>/structured/yellow-trips/

El crawler debe:

  • Detectar el esquema de los datos.
  • Detectar las particiones.
  • Crear o actualizar la tabla en Glue Catalog.
  • Dejar la tabla disponible para ser consultada desde Athena.
La tabla puede llamarse:
yellow_trips



5. Consultar los datos desde Athena

Con la tabla registrada en Glue Catalog, abre Athena y valida que puedas consultar los datos.


6. Integrar todo dentro de Airflow

Actualiza tu DAG de Airflow para orquestar el pipeline completo.

El DAG debe lucir de la siguiente manera:

start
  → lambda_ingest
  → landing_to_raw
  → raw_to_structured
  → glue_crawler
  → end

Donde:

  • lambda_ingest descarga los datos desde la TLC hacia landing.
  • landing_to_raw valida los archivos y los mueve hacia raw o quarantine.
  • raw_to_structured transforma los datos y los escribe en la capa structured.
  • glue_crawler actualiza el catálogo de Glue.
  • end marca el final del pipeline.

Ten en cuenta:

  • Debes hacer un backfill para procesar los archivos requeridos.
  • Como mínimo, procesa los archivos de 2025.
  • Se recomienda incluir algunos archivos de 2024 para probar la lógica de validación y quarantine.
  • Asegúrate de que el pipeline pueda ejecutarse de principio a fin desde Airflow.

Recursos técnicos

Airflow

AWS Glue y Spark

Athena y particionamiento

Completar y continuar