tutoriales.com

Construyendo Data Lakes Escalables y Seguros con Cloud Storage y Dataproc en Google Cloud

Este tutorial te guiará a través del proceso de construcción de un Data Lake robusto en Google Cloud. Exploraremos cómo combinar Google Cloud Storage como una capa de almacenamiento flexible y rentable con Google Cloud Dataproc para un procesamiento de big data potente y escalable. Descubre las mejores prácticas para ingesta, organización, seguridad y análisis de tus datos.

Intermedio25 min de lectura12 views
Reportar error

🚀 Introducción a los Data Lakes en Google Cloud

En la era de los datos, las organizaciones acumulan volúmenes masivos de información de diversas fuentes. Para extraer valor de estos datos heterogéneos, los Data Lakes se han convertido en una solución fundamental. Un Data Lake es un repositorio centralizado que permite almacenar una cantidad masiva de datos estructurados, semiestructurados y no estructurados, en su formato original. A diferencia de un Data Warehouse, que almacena datos ya procesados y estructurados para análisis específicos, un Data Lake ofrece una flexibilidad sin precedentes, permitiendo a los equipos de datos aplicar esquemas al leer (schema-on-read) y explorar los datos de formas innovadoras.

Google Cloud Platform (GCP) ofrece un conjunto de servicios robustos y escalables que son ideales para construir Data Lakes modernos. En este tutorial, nos centraremos en dos componentes clave: Cloud Storage para el almacenamiento masivo de datos y Cloud Dataproc para el procesamiento distribuido. Estos servicios, combinados con otras herramientas de GCP, nos permitirán crear una arquitectura de Data Lake que es no solo escalable y rentable, sino también segura y fácil de administrar.

¿Por qué un Data Lake en Google Cloud?

La elección de Google Cloud para tu Data Lake trae consigo múltiples ventajas:

  • Escalabilidad Ilimitada: Cloud Storage ofrece una capacidad de almacenamiento prácticamente infinita, lo que te permite crecer sin preocuparte por los límites de infraestructura.
  • Costo-Efectividad: Los modelos de precios de Cloud Storage son muy competitivos, especialmente para datos a largo plazo, y Dataproc permite clusters efímeros, pagando solo por el tiempo de uso.
  • Flexibilidad: Soporte para una amplia variedad de formatos de datos y herramientas de procesamiento (Apache Spark, Hadoop, Flink, Presto).
  • Integración Nativas: Se integra sin problemas con otros servicios de Google Cloud como BigQuery, Dataflow, Pub/Sub, Vertex AI, y más, facilitando un ecosistema de datos completo.
  • Seguridad Robusta: Controles de acceso detallados con IAM, cifrado de datos en reposo y en tránsito por defecto, y opciones de conformidad.

🎯 Componentes Clave de un Data Lake en GCP

Para construir un Data Lake eficaz en Google Cloud, utilizaremos principalmente los siguientes servicios:

  • Google Cloud Storage (GCS): El corazón de nuestro Data Lake. GCS es un servicio de almacenamiento de objetos altamente duradero, disponible y escalable. Almacenaremos todos nuestros datos crudos y procesados aquí. Es ideal para un Data Lake por su modelo de objetos sin esquema, que permite almacenar cualquier tipo de archivo.
  • Google Cloud Dataproc: Un servicio administrado de Apache Spark, Hadoop, Flink y Presto. Dataproc nos permitirá ejecutar cargas de trabajo de procesamiento de big data de manera rápida, rentable y con escalabilidad automática. Es perfecto para transformaciones de datos, agregaciones y análisis complejos.
  • Google Cloud Pub/Sub (Opcional): Para la ingesta de datos en tiempo real. Actúa como un message broker global que permite la ingestión de flujos de eventos de alta velocidad.
  • Google Cloud Dataflow (Opcional): Un servicio completamente administrado para la ejecución de pipelines de datos de Apache Beam, tanto por lotes como en streaming. Ideal para transformaciones complejas antes de almacenar los datos en el Data Lake.
  • Google BigQuery (Opcional): Para análisis interactivo y data warehousing. Una vez que los datos son procesados y refinados en el Data Lake, BigQuery es el destino ideal para los datos que requieren análisis SQL de alto rendimiento.
Arquitectura Data Lake - Google Cloud Fuentes IoT Apps Bases de Datos Cloud Pub/Sub Cloud Dataflow Cloud Storage Raw Data Staging Data Curated Data Cloud Dataproc BigQuery * Arquitectura simplificada de flujos de datos en GCP

🛠️ Configuración Inicial y Herramientas

Antes de sumergirnos en la construcción, necesitamos configurar nuestro entorno de Google Cloud. Asegúrate de tener una cuenta de GCP activa y un proyecto configurado.

1. Habilitar APIs Necesarias

Necesitaremos habilitar las APIs para Cloud Storage, Dataproc, y posiblemente Pub/Sub y Dataflow. Esto se puede hacer fácilmente a través de la consola de GCP o con la gcloud CLI.

gcloud services enable storage.googleapis.com
gcloud services enable dataproc.googleapis.com
gcloud services enable pubsub.googleapis.com
gcloud services enable dataflow.googleapis.com

2. Configurar la gcloud CLI

Asegúrate de tener la gcloud CLI instalada y configurada con tu proyecto por defecto.

gcloud init
gcloud config set project [YOUR_PROJECT_ID]
💡 Consejo: Utiliza Cloud Shell si prefieres un entorno preconfigurado con todas las herramientas de Google Cloud ya instaladas.

☁️ Paso 1: Estableciendo la Base del Data Lake con Cloud Storage

Cloud Storage será nuestro almacenamiento principal para el Data Lake. Crearemos varios buckets para organizar nuestros datos en diferentes etapas del ciclo de vida, lo que es una práctica recomendada para la gestión y la seguridad.

1. Estructura de Buckets Recomendada

Una buena práctica es crear buckets separados o prefijos dentro de un bucket para datos crudos, datos en etapa de preparación (staging) y datos curados o refinados.

  • gs://[YOUR_PROJECT_ID]-raw-data: Para datos en su formato original, sin modificar.
  • gs://[YOUR_PROJECT_ID]-staging-data: Para datos que están en proceso de transformación, pero aún no listos para el consumo final.
  • gs://[YOUR_PROJECT_ID]-curated-data: Para datos limpios, transformados y optimizados para el análisis.

Creemos estos buckets:

gs_project_id="$(gcloud config get-value project)"
gcloud storage buckets create "gs://${gs_project_id}-raw-data" --location=us-central1
gcloud storage buckets create "gs://${gs_project_id}-staging-data" --location=us-central1
gcloud storage buckets create "gs://${gs_project_id}-curated-data" --location=us-central1
🔥 Importante: La ubicación del bucket debe ser elegida cuidadosamente para minimizar la latencia con tus usuarios y otros servicios de GCP que utilizarás.

2. Clases de Almacenamiento y Ciclo de Vida

Cloud Storage ofrece diferentes clases de almacenamiento para optimizar costos y acceso:

  • Standard: Alta disponibilidad y baja latencia. Ideal para datos a los que se accede con frecuencia.
  • Nearline: Acceso menos frecuente (una vez al mes). Más barato que Standard.
  • Coldline: Acceso poco frecuente (una vez al trimestre). Aún más barato.
  • Archive: Para archivado a largo plazo y recuperación de desastres. El más económico, pero con mayor latencia y costos de recuperación.

Para un Data Lake, los datos crudos pueden comenzar en Standard y, con el tiempo, moverse a Nearline o Coldline mediante reglas de ciclo de vida. Los datos curados, por su naturaleza de acceso frecuente, a menudo permanecen en Standard.

Creemos una política de ciclo de vida para el bucket de datos crudos para mover objetos a Coldline después de 30 días y eliminarlos después de 365 días (ajusta según tus necesidades).

Crea un archivo lifecycle.json:

{
  "lifecycle": {
    "rule": [
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "COLDLINE"
        },
        "condition": {
          "age": 30
        }
      },
      {
        "action": {
          "type": "Delete"
        },
        "condition": {
          "age": 365
        }
      }
    ]
  }
}

Aplica la política:

gcloud storage buckets update "gs://${gs_project_id}-raw-data" --lifecycle-file lifecycle.json

🛡️ Seguridad del Data Lake en Cloud Storage

La seguridad es primordial en un Data Lake. Utilizaremos Google Cloud IAM (Identity and Access Management) para controlar quién puede acceder a qué datos y con qué nivel de permisos.

1. Principio de Mínimo Privilegio

Asigna solo los permisos necesarios para realizar una tarea específica. Evita el uso de roles amplios como roles/editor en entornos de producción.

Roles Comunes para Cloud Storage:

  • roles/storage.objectViewer: Permite ver objetos y sus metadatos.
  • roles/storage.objectCreator: Permite crear objetos.
  • roles/storage.objectAdmin: Control total sobre los objetos (leer, escribir, eliminar).
  • roles/storage.admin: Control total sobre los buckets y objetos (incluyendo políticas de IAM).

2. Cuentas de Servicio para Aplicaciones

Para los servicios de GCP (Dataproc, Dataflow, etc.) que interactuarán con Cloud Storage, utiliza cuentas de servicio dedicadas. Por ejemplo, tu cluster de Dataproc necesitará permisos para leer y escribir en los buckets de tu Data Lake.

# Ejemplo: Otorgar permiso de lectura y escritura a una cuenta de servicio en el bucket de datos crudos
gcloud storage buckets add-iam-policy-binding "gs://${gs_project_id}-raw-data" \
    --member="serviceAccount:my-dataproc-service-account@[YOUR_PROJECT_ID].iam.gserviceaccount.com" \
    --role="roles/storage.objectAdmin"

3. Cifrado de Datos

Todos los datos en Cloud Storage están cifrados en reposo de forma predeterminada, utilizando claves gestionadas por Google. Para requisitos de seguridad más estrictos, puedes utilizar:

  • Customer-Managed Encryption Keys (CMEK): Cifrado con claves que tú gestionas a través de Cloud Key Management Service (KMS).
  • Customer-Supplied Encryption Keys (CSEK): Cifrado con claves que tú generas y gestionas, que Cloud Storage usa para cifrar/descifrar tus datos.
Ejemplo de configuración CMEK para un bucket Para usar CMEK, primero debes crear una clave en Cloud KMS:
gcloud kms keyrings create my-keyring --location us-central1
gcloud kms keys create my-key --keyring my-keyring --location us-central1 \
    --purpose encryption

Luego, otorga al agente de servicio de Cloud Storage permiso para usar la clave:

PROJECT_NUMBER=$(gcloud projects describe "${gs_project_id}" --format="value(projectNumber)")
gcloud kms keys add-iam-policy-binding "my-key" --keyring "my-keyring" \
    --location "us-central1" --member="serviceAccount:service-${PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com" \
    --role="roles/cloudkms.cryptoKeyEncrypterDecrypter"

Y finalmente, configura el bucket para usar esa clave por defecto:

gcloud storage buckets update "gs://${gs_project_id}-raw-data" \
    --default-kms-key projects/${gs_project_id}/locations/us-central1/keyrings/my-keyring/cryptoKeys/my-key

🖥️ Paso 2: Procesamiento de Big Data con Cloud Dataproc

Una vez que los datos están en Cloud Storage, necesitamos una herramienta para procesarlos. Cloud Dataproc es la elección perfecta para ejecutar cargas de trabajo de Apache Spark, Hadoop, Hive, etc., de manera eficiente.

1. Creando un Cluster de Dataproc

Los clusters de Dataproc pueden ser efímeros (creados para una tarea y eliminados después) o de larga duración. Para un Data Lake, a menudo se usan clusters efímeros para tareas específicas o clusters de larga duración para equipos que realizan análisis ad-hoc constantemente.

Creemos un cluster efímero básico para un ejemplo:

gcloud dataproc clusters create data-lake-cluster \
    --region=us-central1 \
    --zone=us-central1-a \
    --master-machine-type=n1-standard-4 \
    --worker-machine-type=n1-standard-4 \
    --num-workers=2 \
    --image-version=2.0-debian10 \
    --optional-components=ANACONDA,JUPYTER \
    --enable-component-gateway \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --bucket="${gs_project_id}-dataproc-temp" # Un bucket temporal para Dataproc
📌 Nota: `--scopes=https://www.googleapis.com/auth/cloud-platform` le da al cluster acceso completo a los recursos de GCP en el proyecto. En producción, es preferible usar una cuenta de servicio específica con roles más restrictivos para cumplir con el principio de mínimo privilegio.

2. Ejecutando un Trabajo Spark en Dataproc

Supongamos que tenemos un archivo CSV (data.csv) en nuestro bucket de raw-data y queremos procesarlo con Spark para contar palabras o realizar alguna transformación. Primero, subamos un archivo de ejemplo:

word,count
apple,10
banana,20
apple,5
orange,15

Guarda el contenido anterior en un archivo llamado data.csv y súbelo a tu bucket de raw-data:

gcloud storage cp data.csv "gs://${gs_project_id}-raw-data/data.csv"

Ahora, escribamos un script de Spark (word_count.py) para leer este CSV, sumar los conteos por palabra y guardar el resultado en el bucket de curated-data como Parquet.

from pyspark.sql import SparkSession
from pyspark.sql.functions import sum, col

spark = SparkSession.builder.appName("WordCountDataLake").getOrCreate()

project_id = spark.sparkContext._conf.get("spark.executor.extraJavaOptions") # Hacky way to get project_id in Dataproc 2.0+ or pass it as arg
# For simplicity, let's hardcode it for this example, or pass it via --properties
# project_id = "[YOUR_PROJECT_ID]" # Replace with your project ID

# Or better, pass as an argument to the script
# import sys
# project_id = sys.argv[1]

# Using environment variable set in cluster creation or via --properties
project_id = "[YOUR_PROJECT_ID_HERE]" # Replace with your actual project ID

raw_data_path = f"gs://{project_id}-raw-data/data.csv"
curated_data_path = f"gs://{project_id}-curated-data/word_counts_parquet"

# Read the raw CSV data
df = spark.read.option("header", "true").csv(raw_data_path)

# Convert count to integer and sum by word
word_counts_df = df.groupBy("word").agg(sum(col("count").cast("int")).alias("total_count"))

# Write the result to the curated data bucket in Parquet format
word_counts_df.write.mode("overwrite").parquet(curated_data_path)

spark.stop()

Guarda el script anterior como word_count.py. Reemplaza [YOUR_PROJECT_ID_HERE] con tu ID de proyecto real. Sube el script a un bucket temporal o directamente al cluster (aunque el bucket es más común).

gcloud storage cp word_count.py "gs://${gs_project_id}-dataproc-temp/word_count.py"

Ahora, envía el trabajo de Spark a tu cluster de Dataproc:

gcloud dataproc jobs submit pyspark "gs://${gs_project_id}-dataproc-temp/word_count.py" \
    --cluster=data-lake-cluster \
    --region=us-central1 \
    --properties spark.executor.extraJavaOptions="-Dproject_id=${gs_project_id}" # Pass project_id via properties

Después de que el trabajo finalice, podrás verificar los resultados en tu bucket de curated-data.

gcloud storage ls "gs://${gs_project_id}-curated-data/word_counts_parquet/"
💡 Consejo: Para trabajos programados, considera usar Cloud Composer (Apache Airflow) o Cloud Scheduler con Cloud Functions para automatizar el lanzamiento de tus jobs de Dataproc.

📊 Paso 3: Análisis y Consumo de Datos Curados

Una vez que los datos han sido procesados y refinados en el bucket de curated-data, están listos para ser consumidos por herramientas de análisis, machine learning o business intelligence.

1. Integración con BigQuery

BigQuery es la solución de data warehousing de Google Cloud y se integra perfectamente con Cloud Storage. Puedes crear tablas externas en BigQuery que apuntan directamente a los archivos Parquet en tu Data Lake.

CREATE EXTERNAL TABLE IF NOT EXISTS `[YOUR_PROJECT_ID].data_lake_dataset.word_counts`
OPTIONS (
  format = 'PARQUET',
  uris = ['gs://[YOUR_PROJECT_ID]-curated-data/word_counts_parquet/*']
);

Reemplaza [YOUR_PROJECT_ID] y data_lake_dataset (crea un nuevo dataset si no existe) con tus valores. Una vez creada la tabla externa, puedes consultarla como cualquier otra tabla de BigQuery:

SELECT * FROM `[YOUR_PROJECT_ID].data_lake_dataset.word_counts`
WHERE total_count > 10;

Esto te permite aprovechar el poder de BigQuery para análisis SQL de alto rendimiento sin tener que mover los datos de Cloud Storage.

2. Integración con Vertex AI

Para cargas de trabajo de machine learning, los datos curados en Cloud Storage pueden ser directamente utilizados por Vertex AI. Por ejemplo, para entrenar modelos de ML, los datasets pueden apuntar a rutas de Cloud Storage.

3. Herramientas de BI

Herramientas como Looker Studio (anteriormente Google Data Studio) o Looker pueden conectarse directamente a BigQuery (que a su vez está conectado a tu Data Lake) para crear dashboards y visualizaciones interactivas.


⚙️ Mejores Prácticas y Consideraciones Avanzadas

La construcción de un Data Lake es un proceso continuo. Aquí hay algunas consideraciones adicionales para optimizar y madurar tu Data Lake.

1. Gobernanza de Datos y Catálogo

A medida que tu Data Lake crece, la gobernanza de datos se vuelve crucial. Herramientas como Google Cloud Data Catalog te permiten descubrir, gestionar y entender tus datos. Puedes etiquetar datos, buscar conjuntos de datos y entender su linaje.

2. Ingesta de Datos

  • Tiempo Real: Para datos de streaming, utiliza Cloud Pub/Sub para la ingesta y Cloud Dataflow para el procesamiento y la escritura en Cloud Storage (por ejemplo, en formato Parquet o Avro).
  • Batch: Para datos por lotes, Cloud Storage gsutil cp o gsutil rsync son herramientas básicas. Para ingestas programadas y complejas, considera Cloud Dataflow o Dataproc.
Ingesta Batch: FTP/SFTP, On-premise -> Cloud Storage (gsutil, Storage Transfer Service).
Ingesta Streaming: IoT, Aplicaciones -> Cloud Pub/Sub -> Dataflow -> Cloud Storage.
Transformación: Datos crudos -> Dataproc/Dataflow -> Datos curados.
Análisis: Datos curados -> BigQuery, Vertex AI, Looker Studio.

3. Optimización de Costos

  • Clases de Almacenamiento: Como se mencionó, usar las clases de almacenamiento correctas en Cloud Storage es fundamental.
  • Lifecycle Policies: Automatiza el movimiento de datos entre clases para reducir costos.
  • Clusters Efímeros de Dataproc: En lugar de mantener clusters activos constantemente, crea clusters de Dataproc solo cuando los necesites para ejecutar trabajos específicos y luego elimínalos.
  • Autoscaling de Dataproc: Configura el autoscaling en tus clusters de Dataproc para que ajusten el número de workers automáticamente según la carga de trabajo.
90% Ahorro con buenas prácticas

4. Particionamiento de Datos

En Cloud Storage, organizar tus datos con una estructura de directorios lógica (por ejemplo, /data/year=YYYY/month=MM/day=DD/) mejora significativamente el rendimiento de las consultas, especialmente cuando se usa Dataproc o BigQuery con tablas externas. Esto permite a los motores de consulta descartar datos que no coinciden con los criterios de la partición.

Ejemplo de estructura de particionamiento ``` gs://[YOUR_PROJECT_ID]-curated-data/my_table/ ├── year=2023/ │ ├── month=01/ │ │ ├── day=01/file1.parquet │ │ └── day=02/file2.parquet │ └── month=02/ │ ├── day=01/file3.parquet └── year=2024/ └── month=01/ └── day=01/file4.parquet ```

5. Formatos de Archivo

Para el Data Lake, se recomiendan formatos de archivo columnares como Parquet o ORC. Estos formatos son auto-descriptivos, comprimidos y optimizados para la lectura analítica, ofreciendo un mejor rendimiento y ahorro de costos en comparación con CSV o JSON, especialmente cuando se usan con motores como Spark o BigQuery.

FormatoDescripciónVentajasDesventajas
------------
CSVTexto plano, delimitado por comas.Simple, universal.No auto-descriptivo, no optimizado para columnas, lento para Big Data.
JSONTexto plano, estructura jerárquica.Flexible, legible, soporta datos semi-estructurados.No optimizado para Big Data, lento, mayor tamaño.
------------
ParquetColumna, binario, auto-descriptivo, comprimido.Excelente para analítica, compresión, schema evolution.Más complejo de manejar directamente, no legible por humanos.
AvroFila, binario, auto-descriptivo, compresión opcional.Bueno para streaming, schema evolution, integración con sistemas Hadoop.Rendimiento ligeramente inferior a Parquet para analítica pesada.

6. Monitoreo y Alertas

Utiliza Cloud Monitoring para supervisar el uso de Cloud Storage y Dataproc. Configura alertas para detectar umbrales de costos, errores de trabajos, o problemas de rendimiento. Cloud Logging recopilará todos los logs de tus servicios para facilitar la depuración y auditoría.


🧹 Limpieza de Recursos

Una vez que hayas terminado con este tutorial, es una buena práctica limpiar los recursos para evitar cargos inesperados.

  1. Eliminar el Cluster de Dataproc:
gcloud dataproc clusters delete data-lake-cluster --region=us-central1
  1. Eliminar los Buckets de Cloud Storage:
gs_project_id="$(gcloud config get-value project)"
gcloud storage rm -r "gs://${gs_project_id}-raw-data"
gcloud storage rm -r "gs://${gs_project_id}-staging-data"
gcloud storage rm -r "gs://${gs_project_id}-curated-data"
gcloud storage rm -r "gs://${gs_project_id}-dataproc-temp"
<div class="callout warning">⚠️ <strong>Advertencia:</strong> El comando `gcloud storage rm -r` eliminará recursivamente todo el contenido del bucket. ¡Asegúrate de que no contenga datos importantes que quieras conservar!</div>

3. Eliminar la tabla externa de BigQuery:

DROP EXTERNAL TABLE IF EXISTS `[YOUR_PROJECT_ID].data_lake_dataset.word_counts`;
  1. Eliminar el dataset de BigQuery (opcional):
bq rm -r -f [YOUR_PROJECT_ID]:data_lake_dataset
  1. Deshabilitar APIs (opcional): Si no planeas usar estos servicios pronto, puedes deshabilitar las APIs. Ten en cuenta que esto puede afectar a otras partes de tu proyecto.

📚 Conclusión

Has aprendido a construir un Data Lake escalable y seguro en Google Cloud utilizando Cloud Storage para el almacenamiento de objetos y Cloud Dataproc para el procesamiento distribuido de big data. Hemos cubierto la configuración inicial, la ingesta y organización de datos, la seguridad con IAM y CMEK, el procesamiento con Spark y la integración con BigQuery para análisis.

La flexibilidad de Google Cloud permite que tu Data Lake evolucione con tus necesidades, desde el almacenamiento de datos crudos hasta la generación de información valiosa. Al seguir las mejores prácticas en gobernanza, optimización de costos y elección de formatos, podrás maximizar el valor de tus datos y potenciar tus iniciativas de inteligencia de negocios y machine learning.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!