Harvester

ETL pipeline de alta performance

Extrae datos desde bases Oracle, PostgreSQL y otras fuentes, transforma a Parquet y deposita en Harkonnen Vault (S3). Pipeline batch nativo Rust con Tokio + Rayon. Compresión Parquet 9x vs CSV. Sin Spark, sin JVM, sin dependencias externas. Binario estático de ~12MB.

Características

  • 100K rows/s con paralelismo Rayon
  • Compresión Parquet 9x vs CSV — 1GB de CSV → 110MB Parquet
  • Extracción directa desde Oracle, PostgreSQL, MySQL y más
  • Binario estático de 12MB — sin JVM, sin Spark, sin Python
  • Pipeline: Oracle → Arrow → Parquet → Harkonnen Vault (S3)
  • Jobs programables con cron expressions vía Sandworm
  • Retry automático con dead-letter queue
  • Idempotencia — re-ejecutar sin duplicados
  • Monitoreo de progreso en Eye of Ibad

Pipeline file

toml
# /etc/dune/pipelines/db-sync.toml

[source]
type = "oracle"
connection = "oracle://user:pass@hospital-db:1521/PROD"
query = "SELECT * FROM PACIENTES WHERE FECHA_MODIF > :last_run"
incremental = true

[[transforms]]
type = "arrow_columnar"
compression = "snappy"

[[transforms]]
type = "deduplicate"
key = "rut_paciente"

[destination]
type = "harkonnen-vault"
bucket = "data-lake"
prefix = "exports/"
format = "parquet"
compression = "zstd"     # 9x vs CSV

[schedule]
cron = "*/15 * * * *"
retry_attempts = 3
retry_delay = "30s"

CLI

bash
# Ejecutar pipeline manualmente
dune harvest run --pipeline db-sync
# ✦ Source: Oracle (hospital-db)
# ✦ Extracting... 47,291 rows
# ✦ Transform: Arrow columnar → Parquet (9x compression)
# ✦ Depositing to Harkonnen Vault (s3://data-lake/exports/)
# ✦ Complete: 47,291 rows in 0.4s (118K rows/s)
# ✦ Size: 42MB CSV → 4.7MB Parquet

# Ver jobs programados
dune harvest jobs list
# JOB              SCHEDULE       LAST RUN   ROWS      STATUS
# db-sync        */15 * * * *   4m ago     47,291    success
# lab-results        0 * * * *      32m ago    12,847    success
# audit-export     0 2 * * *      8h ago     891,204   success

# Ver historial de un pipeline
dune harvest history db-sync --last 24h
# RUN               ROWS      DURATION  PARQUET   STATUS
# 2026-03-23 14:30  47,291    0.4s      4.7MB     success
# 2026-03-23 14:15  47,105    0.4s      4.6MB     success
# 2026-03-23 14:00  46,998    0.3s      4.6MB     success