OxideETL

Enterprise ETL Pipeline: Oracle → S3 Parquet Data Lake

Migra millones de filas de Oracle a S3 con particionado inteligente, integración con AWS Glue Catalog, y monitoreo en tiempo real vía StreamForge.

27M+
Filas/tabla en producción
100K
Rows/segundo throughput
9x
Compresión Parquet
100%
Rust + Async

Características Principales

Alto Rendimiento

Arquitectura asíncrona con Tokio. Escritura paralela a S3 (4 uploads simultáneos). Procesamiento en streaming NDJSON. Batches de 100K filas optimizados.

AWS Glue Catalog

Registro automático de tablas Parquet en Glue. OxideDB hace REFRESH TABLES en sub-segundo sin escanear S3. Compatible con Athena y Datasphere.

Particionado Inteligente

5 estrategias configurables: none, year_month, year_month_day, full_load_only, mode_based. Optimizado para predicate pushdown en OxideDB.

Multi-tenant Support

Soporte para tenants por tabla con X-Tenant-ID header. Perfecto para arquitecturas multi-tenant. Override global configurable.

CDC Incremental

Change Data Capture con detección INSERT vs UPDATE. Reconciliación de DELETEs. Checkpoints automáticos. Upserts paralelos a PostgreSQL.

StreamForge Events

Monitoreo real-time con eventos: JobStarted, ProgressUpdate, JobCompleted, JobFailed. Integración nativa con StreamForge cluster.

Checkpoints & Recovery

Guardado automático de progreso cada 50K filas. Recuperación desde último checkpoint. Continúa migraciones interrumpidas sin re-procesar.

Formato Parquet

Columnar storage con compresión SNAPPY. 9x ratio de compresión. Compatible con Arrow, DataFusion, Polars, DuckDB, OxideDB.

Dual Sink

Escribe simultáneamente a S3 (data lake) y PostgreSQL (operational). Dead Letter Queue (DLQ) para filas fallidas. Retry configurable.

Data Quality Checks

8 reglas configurables por tabla en YAML: not_null, unique, range, regex, not_future, row_count_min, accepted_values, custom_sql. Se ejecutan post-carga contra PostgreSQL.

REST API

API completa para gestión remota: jobs async, quality checks on-demand, upload de archivos binarios, reportes históricos en SQLite.

Schema Evolution

Detecta automáticamente cambios de schema en Oracle y aplica ALTER TABLE seguros en PostgreSQL. Nuevas columnas, tipos modificados, sin downtime.

vs Competencia

Oxide ETL

  • 100% Rust nativo (sin JVM, sin Python)
  • AWS Glue Catalog integration automática
  • Multi-tenant nativo (X-Tenant-ID)
  • StreamForge events real-time
  • Dual sink: S3 + PostgreSQL
  • Zero dependencies JVM/Python
  • Binario único 50MB (.deb)
  • Optimizado para OxideDB
  • Data quality checks integrados (8 reglas)
  • REST API + Schema evolution automática

Apache Spark

  • Procesamiento distribuido
  • Ecosistema maduro
  • Requiere JVM (pesado ~500MB)
  • Configuración compleja
  • Overhead alto para tablas pequeñas
  • Sin multi-tenant nativo
  • Sin Glue auto-registration
  • Sin quality checks integrados

AWS Glue ETL

  • Serverless (managed)
  • Glue Catalog integrado
  • Costoso ($0.44/DPU-hora)
  • Vendor lock-in AWS
  • Basado en Spark (lento cold start)
  • Sin soporte Oracle directo
  • Debugging complejo
  • Sin schema evolution automática

Arquitectura

Source

Oracle Database

REST API / JDBC Direct

Transform

Oxide ETL

Rust + Tokio + DataFusion

Destination

S3 + Glue Catalog

Parquet + PostgreSQL

Pipeline Flow

  1. 1Lee datos de Oracle en batches de 100K filas (NDJSON streaming)
  2. 2Convierte a formato Parquet columnar con compresión SNAPPY (9x ratio)
  3. 3Sube a S3 con particionado configurable (year/month/day o full_load)
  4. 4Registra metadata en AWS Glue Catalog (primer batch solamente)
  5. 5Opcionalmente hace upsert a PostgreSQL en paralelo (dual sink)
  6. 6Ejecuta Data Quality Checks contra PostgreSQL (not_null, unique, range, etc.)
  7. 7OxideDB hace REFRESH TABLES desde Glue (sub-segundo, sin escanear S3)

Casos de Uso

Data Lake Migration

Migra datos históricos de Oracle (millones de filas) a S3 Parquet para análisis con OxideDB, Athena, o Datasphere.

  • Full load con checkpoints automáticos
  • Recuperación ante fallos
  • Progress tracking en StreamForge
  • 27M+ filas/tabla en producción

CDC Sync + Quality

Sincroniza cambios incrementales con detección automática de INSERTs vs UPDATEs y validación de calidad post-carga.

  • INSERT vs UPDATE + reconciliación DELETEs
  • Quality checks automáticos post-sync
  • Schema evolution sin downtime
  • Reportes persistidos en SQLite

Instalación

Ubuntu/Debian (.deb)

1. Descargar e instalar paquete .deb:

# Descargar última versión
wget https://releases.oxidedb.com/oxide-etl/latest/oxide-etl_0.4.9_amd64.deb

# Instalar paquete
sudo dpkg -i oxide-etl_0.4.9_amd64.deb

# Verificar instalación
oxide-etl --version

2. Configurar archivo YAML:

# /etc/oxide-etl/etl_config.yaml
source:
  mode: http
  base_url: "https://your-api.com"
  api_key: "your-key"
  tenant: "default"

s3:
  enabled: true
  bucket: "my-data-lake"
  default_partition_strategy: "mode_based"

glue:
  enabled: true
  database: "oxidedb_catalog"
  region: "us-east-2"

tables:
  - oracle_schema: "PROD"
    oracle_table: "CUSTOMERS"
    postgres_schema: "public"
    postgres_table: "customers"
    primary_keys: ["customer_id"]
    enabled: true

3. Crear database en Glue (una sola vez):

aws glue create-database --database-input Name=oxidedb_catalog

4. Ejecutar migración:

# Full load de todas las tablas
oxide-etl full-load --tables all

# Full load de tablas específicas
oxide-etl full-load --tables CUSTOMERS,ORDERS

# Sync incremental
oxide-etl sync --tables all

# Data quality check manual
oxide-etl quality --tables CUSTOMERS

Nota: El paquete .deb incluye systemd service para ejecución como daemon. Configura en /etc/systemd/system/oxide-etl.service

REST API

Jobs & Control

GET/api/health
GET/api/status
GET/api/tables
POST/api/jobs
GET/api/jobs/{id}
POST/api/jobs/{id}/cancel

Quality & Upload

POST/api/quality
GET/api/quality
GET/api/quality/{table}
POST/api/upload

Quality reports se persisten en SQLite. Consultables por tabla o historial completo.

# Ejecutar quality checks via API
curl -X POST http://localhost:8090/api/quality \
  -H "Content-Type: application/json" \
  -d '{"tables": ["clin_far_movim"]}'

# Ver último reporte de una tabla
curl http://localhost:8090/api/quality/clin_far_movim

# Lanzar full-load async
curl -X POST http://localhost:8090/api/jobs \
  -H "Content-Type: application/json" \
  -d '{"command": "full-load", "tables": "CUSTOMERS"}'

Data Quality Rules

Configuración en YAML

tables:
  - source_table: FACTURAS
    quality:
      enabled: true
      rules:
        - rule: not_null
          column: MONTO_TOTAL
        - rule: range
          column: MONTO_TOTAL
          min: 0
        - rule: unique
          columns: [NUMERO_FACTURA, SERIE]
        - rule: not_future
          column: FECHA_EMISION
        - rule: row_count_min
          value: 1000
        - rule: accepted_values
          column: ESTADO
          values: ["A", "I", "P"]
        - rule: custom_sql
          name: "sin_montos_negativos"
          sql: "SELECT COUNT(*) FROM {schema}.{table}
               WHERE monto < 0"
not_null
unique
range
regex
not_future
row_count_min
accepted_values
custom_sql

Las reglas se ejecutan automáticamente después de cada full-load y sync incremental. Los resultados se persisten en SQLite y son consultables via GET /api/quality. Informativo y no bloqueante: solo WARN en logs y evento StreamForge.

Integración con OxideDB

Oxide ETL + OxideDB = Stack completo para Data Analytics

Oxide ETL hace:

  • ✅ Migración Oracle → S3 Parquet
  • ✅ Registro automático en Glue Catalog
  • ✅ Particionado optimizado (5 estrategias)
  • ✅ CDC con INSERT/UPDATE/DELETE
  • ✅ Dual sink: S3 + PostgreSQL
  • ✅ Data Quality Checks (8 reglas YAML)
  • ✅ REST API + Schema evolution
  • ✅ StreamForge events real-time

OxideDB hace:

  • ✅ REFRESH TABLES desde Glue (sub-segundo)
  • ✅ Queries SQL ultra-rápidas (241K rows/s)
  • ✅ RBAC + Encryption + Audit logs
  • ✅ Predicate/Projection pushdown en S3
  • ✅ SIMD vectorization (AVX-512)
  • ✅ Window functions + CTEs + JOINs

Enterprise ETL • Production Ready • Built with Rust 🦀