Enterprise-grade ETL orchestration platform using Data Mesh architecture, powered by Java 21 & Spring Boot 3.x.
React ETL Canvas (UI)
β (JWT from Hyperion-IAM)
Control Plane (Orchestration)
β (Kafka Events)
Domain ETL Services (Execution)
- β Data Mesh Architecture - Decentralized domain ownership
- β Permission-Based RBAC - No tenant isolation (OAuth2/JWT only)
- β Event-Driven Execution - Kafka-based async orchestration
- β DAG Validation - Cycle detection, edge compatibility
- β Virtual Threads - Java 21 async execution
- β OpenAPI Documentation - Auto-generated Swagger UI
hyperion-etl-pipelines/
βββ hyperion-etl-control-plane/ # Orchestration service
β βββ src/main/java/com/hyperion/etl/
β β βββ api/ # REST controllers
β β βββ domain/ # Domain models (records)
β β βββ service/ # Business logic
β β βββ mapper/ # MyBatis mappers
β β βββ security/ # OAuth2 + Permission evaluator
β β βββ events/ # Kafka event schemas
β β βββ config/ # Configuration
β βββ src/main/resources/
β βββ db/changelog/ # Liquibase migrations
β βββ mapper/ # MyBatis XML mappers
βββ finance-etl-service/ # Example domain service
βββ hyperion-etl-canvas/ # React UI (drag-drop DAG editor)
βββ docker-compose.yml
- Java 21+
- PostgreSQL 16+
- Apache Kafka 3.5+
- Maven 3.9+
docker-compose up -d postgres kafka zookeepercd hyperion-etl-control-plane
mvn spring-boot:runThe service will start on http://localhost:8083
- Swagger UI: http://localhost:8083/swagger-ui.html
- Health Check: http://localhost:8083/actuator/health
cd hyperion-etl-canvas
npm install
npm run devAll endpoints require OAuth2 JWT from Hyperion-IAM (port 8080).
{
"sub": "user@email.com",
"userId": "uuid",
"permissions": [
"etl:pipeline:WRITE",
"etl:run:RUN",
"*:READ"
]
}| Resource | Actions | Example |
|---|---|---|
etl:pipeline |
READ, WRITE, DELETE | etl:pipeline:WRITE |
etl:run |
RUN, STOP, READ | etl:run:RUN |
etl:log |
READ | etl:log:READ |
etl:node |
VALIDATE | etl:node:VALIDATE |
etl:schema |
READ, WRITE | etl:schema:WRITE |
Wildcard Support:
*:*- Full accessetl:pipeline:*- All actions on pipelines*:READ- Read any resource
curl -X POST http://localhost:8083/api/pipelines \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d '{
"domain": "finance",
"name": "Daily Revenue ETL",
"description": "Aggregates daily revenue"
}'curl -X PUT http://localhost:8083/api/pipelines/{id}/graph \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d @examples/finance-daily-etl.jsoncurl -X POST http://localhost:8083/api/pipelines/{id}/validate \
-H "Authorization: Bearer <JWT>"curl -X POST http://localhost:8083/api/pipelines/{id}/run \
-H "Authorization: Bearer <JWT>"curl http://localhost:8083/api/runs/{runId} \
-H "Authorization: Bearer <JWT>"- No Cycles - Pipeline must be a DAG (Directed Acyclic Graph)
- Required Nodes - At least 1 SOURCE and 1 SINK
- Edge Compatibility:
- β SOURCE β TRANSFORM
- β TRANSFORM β TRANSFORM
- β TRANSFORM β SINK
- β SOURCE β SOURCE
- β SINK β *
- User clicks Run in React Canvas
- Control Plane:
- Validates DAG structure
- Checks
etl:run:RUNpermission - Creates
PipelineRunrecord - Emits Kafka events in topological order
- Domain ETL Service (e.g.,
finance-etl):- Consumes
etl.node.executeevents - Executes node logic (read data, transform, write)
- Publishes
etl.node.completedoretl.node.failed
- Consumes
- Control Plane updates run status
| Topic | Purpose |
|---|---|
etl.pipeline.run |
Pipeline execution started |
etl.node.execute |
Node execution command |
etl.node.completed |
Node execution success |
etl.node.failed |
Node execution failure |
etl.data.product.published |
Data product ready |
Tables:
pipelines- Pipeline definitionspipeline_nodes- Nodes in graphpipeline_edges- Edges connecting nodespipeline_runs- Execution instancesexecution_logs- Structured logs per run
Migrations managed by Liquibase in src/main/resources/db/changelog/
etl.run.duration- Pipeline execution timeetl.node.failure.rate- Node failure rateetl.runs.active- Currently running pipelines
Access metrics: http://localhost:8083/actuator/prometheus
JSON logs with MDC context:
{
"timestamp": "2026-01-28T15:30:00Z",
"level": "INFO",
"runId": "uuid",
"nodeId": "uuid",
"domain": "finance",
"message": "Node execution completed"
}# Unit + Integration Tests
mvn clean verify
# Run with test containers
mvn verify -Dspring.profiles.active=testSPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/hyperion_etl
SPRING_KAFKA_BOOTSTRAP_SERVERS=localhost:9092
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI=http://localhost:8080docker build -t hyperion-etl-control-plane:latest ./hyperion-etl-control-plane
docker-compose up -dThe UI already exists in hyperion-etl-canvas/. Key integration points:
- Graph Sync: PUT
/api/pipelines/{id}/graph - Validation: POST
/api/pipelines/{id}/validate - Execution: POST
/api/pipelines/{id}/run - Status Polling: GET
/api/runs/{id}
- No tenant isolation - All authorization via permissions
- Audit logging - RUN/DELETE actions logged with user
- JWT validation - All requests require valid token from Hyperion-IAM
- CORS enabled - Configured for React Canvas (ports 3000, 5173)
Apache-2.0, MIT, Hyperion Platform