DataSkills Hub

Apache Ceph

Apache Ceph es un sistema de almacenamiento distribuido. Provee almacenamiento de objetos compatible con la API S3 a través de Ceph Object Gateway (RGW), utilizado como base del Data Lake.

#Getting Started

#Instalar MinIO Client (mc)

# Linux
$ curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc && sudo mv mc /usr/local/bin/

# Verificar instalación
$ mc --version

#Configurar alias de conexión

$ mc alias set miceph <tu-url> <tu_access_key> <tu_secret_key>

# Verificar conexión
$ mc admin info miceph

#Operaciones con Buckets

Comando Descripción
mc ls miceph Listar todos los buckets
mc ls miceph/bucket-name/ Listar contenido de un bucket
mc ls miceph/bucket-name/prefix/ --recursive Listar recursivamente
mc mb miceph/nuevo-bucket Crear un bucket
mc rb miceph/bucket-vacio Eliminar bucket vacío
mc rb miceph/bucket --force Eliminar bucket con contenido

#Gestión de Objetos (Archivos)

#Upload y Download

Subir un archivo

$ mc cp archivo_local.parquet miceph/data-raw/etl/ventas/2026/

Subir un directorio completo

$ mc cp ./datos_locales/ miceph/data-raw/etl/batch/ \
    --recursive \
    --exclude "*.tmp"

Descargar un archivo

$ mc cp miceph/data-raw/etl/ventas/2026/data.parquet ./local/

Descargar un directorio

$ mc cp miceph/data-analytics/resultados/ ./resultados/ \
    --recursive

#Sincronizar directorios

Sync local → Ceph (solo sube diferencias)

$ mc mirror ./datos/ miceph/data-raw/etl/datos/ \
    --overwrite \
    --remove \
    --exclude "*.log"

Sync Ceph → local

$ mc mirror miceph/data-analytics/reportes/ ./reportes_local/

Sync entre buckets Ceph

$ mc mirror miceph/data-raw/etl/ miceph/data-backup/etl/

#Estructura de Buckets

#Buckets del Data Lake

Bucket Capa Descripción
data-raw Raw Layer Datos crudos sin procesar (landing zone)
data-staging Staging Datos en proceso de transformación
data-analytics Analytics Datos procesados listos para consumo
data-ml ML Layer Datasets y modelos de machine learning
data-backup Backup Copias de seguridad
data-temp Temp Archivos temporales (limpieza automática 30d)

#Convención de ruta estándar

s3://data-raw/
  └── {area}/{fuente}/{año}/{mes}/{dia}/
        └── {nombre_archivo}.{formato}

# Ejemplo:
s3://data-raw/comercial/crm/2026/03/11/clientes.parquet
s3://data-analytics/telco/kpis/2026/03/kpi_red_mensual.parquet

#Operaciones Avanzadas

#Gestión de metadatos

Ver metadatos de un objeto

$ mc stat miceph/data-raw/etl/ventas/data.parquet

Agregar metadatos personalizados al subir

$ mc cp reporte_marzo.parquet miceph/data-analytics/reportes/ \
    --attr "area=comercial;owner=data-engineering;version=1.0"

#Copiar y mover objetos

Copiar objeto dentro de Ceph

$ mc cp miceph/data-raw/etl/ventas/data.parquet \
       miceph/data-analytics/procesado/ventas/data.parquet

Mover objeto (copiar + borrar)

$ mc mv miceph/data-raw/temp/archivo.parquet \
        miceph/data-analytics/final/archivo.parquet

#Generar URLs prefirmadas (acceso temporal)

Generar URL de descarga válida por 1 hora

$ mc share download --expire 1h miceph/data-analytics/reportes/informe.xlsx

#Uso desde Python (minio)

#Configurar cliente MinIO

from minio import Minio

client = Minio(
    "<tu-url>",
    access_key="<tu_access_key>",
    secret_key="<tu_secret_key>",
    secure=True,
)

#Operaciones comunes en Python

Listar archivos en un prefijo

objects = client.list_objects(
    "data-raw",
    prefix="etl/ventas/2026/03/",
    recursive=True,
)
for obj in objects:
    print(obj.object_name, obj.size)

Subir archivo

from minio.commonconfig import Tags

tags = Tags(for_object=True)
tags["owner"] = "de-team"
tags["version"] = "1.0"

client.fput_object(
    "data-raw",
    "etl/ventas/2026/03/11/data.parquet",
    "local_data.parquet",
    tags=tags,
)

Descargar archivo

client.fget_object(
    "data-analytics",
    "reportes/kpi_mensual.parquet",
    "kpi_mensual.parquet",
)

#Leer Parquet directo desde Ceph con pandas

import pandas as pd
import s3fs

fs = s3fs.S3FileSystem(
    endpoint_url="<tu-url>",
    key="<tu_access_key>",
    secret="<tu_secret_key>",
)

df = pd.read_parquet(
    "s3://data-analytics/ventas/2026/03/",
    filesystem=fs,
)

#Monitoreo y Operaciones

#Comandos de administración (requiere rol admin)

Ver espacio usado por bucket

$ mc du miceph/data-analytics

Ver estadísticas rápidas de un bucket

$ mc ls miceph/data-raw --recursive --summarize

Buscar archivos por extensión en todo un bucket

$ mc find miceph/data-raw --name "*.parquet"

#Lifecycle policies (requiere admin)

{
  "Rules": [
    {
      "ID": "eliminar-temporales-30-dias",
      "Filter": { "Prefix": "temp/" },
      "Status": "Enabled",
      "Expiration": { "Days": 30 }
    }
  ]
}

Aplicar política de lifecycle

$ mc ilm import miceph/data-temp < lifecycle.json