MCPcopy Index your code
hub / github.com/Netflix/maestro

github.com/Netflix/maestro @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
6,303 symbols 34,338 edges 899 files 1,917 documented · 30%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Maestro

Maestro is a general-purpose workflow orchestrator that provides a fully managed workflow-as-a-service (WAAS) to the data platform users at Netflix.

It serves thousands of users, including data scientists, data engineers, machine learning engineers, software engineers, content producers, and business analysts, for various use cases. It schedules hundreds of thousands of workflows, millions of jobs every day and operates with a strict SLO even when there are spikes in the traffic. Maestro is highly scalable and extensible to support existing and new use cases and offers enhanced usability to end users.

You can read more details about it in our series of blog posts - Maestro: Data/ML Workflow Orchestrator at Netflix - Orchestrating Data/ML Workflows at Scale With Netflix Maestro - 100X Faster: How We Supercharged Netflix Maestro's Workflow Engine - Incremental Processing using Netflix Maestro and Apache Iceberg

Get started

Prerequisite

  • Git
  • Java 21
  • Gradle
  • Docker

Build it

  • ./gradlew build

Run it

  • ./gradlew bootRun

Run it with AWS module

  • docker compose -f maestro-aws/docker-compose.yml up
  • ./gradlew bootRun --args='--spring.profiles.active=aws'

Create a sample workflow

  • curl --header "user: tester" -X POST 'http://127.0.0.1:8080/api/v3/workflows' -H "Content-Type: application/json" -d @maestro-server/src/test/resources/samples/sample-dag-test-1.json

Get the sample workflow definition

  • curl -X GET 'http://127.0.0.1:8080/api/v3/workflows/sample-dag-test-1/versions/latest'

Trigger to run the sample workflow

  • curl --header "user: tester" -X POST 'http://127.0.0.1:8080/api/v3/workflows/sample-dag-test-1/versions/latest/actions/start' -H "Content-Type: application/json" -d '{"initiator": {"type": "manual"}}'

Get the sample workflow instance

  • curl -X GET 'http://127.0.0.1:8080/api/v3/workflows/sample-dag-test-1/instances/1/runs/1'

Delete the sample workflow and its data

  • curl --header "user: tester" -X DELETE 'http://127.0.0.1:8080/api/v3/workflows/sample-dag-test-1'

Run it with maestro-extensions (foreach flattening service)

The maestro-extensions module runs as a separate Spring Boot service that listens to maestro events via SQS (subscribed to the SNS topic maestro-server publishes to) and provides additional functionality such as foreach step flattening views.

To run maestro-server and maestro-extensions together locally: 1. Start LocalStack (provides local SQS/SNS): - docker compose -f maestro-aws/docker-compose.yml up -d 2. Start maestro-server (port 8080): - ./gradlew :maestro-server:bootRun --args='--spring.profiles.active=aws' 3. Start maestro-extensions (port 8081): - ./gradlew :maestro-extensions:bootRun

Once both services are running, maestro-extensions will consume step instance status change events from the maestro-event SQS queue and process foreach flattening. Query the flattened views via the extensions REST API on port 8081.

Run it with Kubernetes support

  • setup kubernetes configs so the kubectl command works
  • ./gradlew bootRun
  • curl --header "user: tester" -X POST 'http://127.0.0.1:8080/api/v3/workflows' -H "Content-Type: application/json" -d @maestro-server/src/test/resources/samples/sample-kubernetes-wf.json
  • curl --header "user: tester" -X POST 'http://127.0.0.1:8080/api/v3/workflows/sample-kubernetes-wf/versions/latest/actions/start' -H "Content-Type: application/json" -d '{"initiator": {"type": "manual"}}'

Python SDK client

Installation

pip install maestro-sdk

Creating a workflow

from maestro import Workflow, Job

wf = Workflow(id="test-wf")
wf.owner("tester").tags("test")
wf.job(Job(id="job1", type='NoOp'))
wf_yaml = wf.to_yaml()

Pushing a workflow to Maestro server

from maestro import Workflow, Job, MaestroClient

wf = Workflow(id="test-wf")
wf.owner("tester").tags("test")
wf.job(Job(id="job1", type='NoOp'))
wf_yaml = wf.to_yaml()

client = MaestroClient(base_url="http://127.0.0.1:8080", user="tester")
response = client.push_yaml(wf_yaml)
print(response)

Starting a workflow

from maestro import MaestroClient

client = MaestroClient(base_url="http://127.0.0.1:8080", user="tester")
response = client.start(workflow_id="test-wf", run_params={"foo": {"value": "bar", "type": "STRING"}})
print(response)

Please check Maestro python project for more details.

Get in touch

Join our community Slack workspace for discussions!

License

Copyright 2024 Netflix, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Extension points exported contracts — how you extend this code

Action (Interface)
Actions supported by flow group actors, flow actors, and task actors. @author jun-he [21 implementers]
maestro-flow/src/main/java/com/netflix/maestro/flow/actor/Action.java
ExtFunction (Interface)
Extension Function for Util class. Note that the extension function is still executed within the secured thread so it ha [16 …
netflix-sel/src/main/java/com/netflix/sel/ext/ExtFunction.java
AlertingValidator (Interface)
Interface for validating an Alerting object. [22 implementers]
maestro-common/src/main/java/com/netflix/maestro/validations/AlertingValidator.java
StepRuntime (Interface)
Step runtime implementation. It is expected to be stateless and thread safe. The state should not be kept in instanc [9 …
maestro-engine/src/main/java/com/netflix/maestro/engine/steps/StepRuntime.java
HttpRuntimeExecutor (Interface)
Interface for HTTP runtime executor to execute HTTP requests. [18 implementers]
maestro-http/src/main/java/com/netflix/maestro/engine/http/HttpRuntimeExecutor.java
ResultProcessor (Interface)
Functional interface for processing result set. @param the type of the processed result @author jun-he [17 implementers]
maestro-database/src/main/java/com/netflix/maestro/database/utils/ResultProcessor.java
MaestroJobEvent (Interface)
Those are maestro internal job events, which won't be emitted externally. [8 implementers]
maestro-queue/src/main/java/com/netflix/maestro/queue/jobevents/MaestroJobEvent.java
TimeTriggerProducer (Interface)
Producer for Time trigger messages. [5 implementers]
maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/producer/TimeTriggerProducer.java

Core symbols most depended-on inside this repo

get
called by 1458
maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowDao.java
build
called by 667
maestro-engine/src/main/java/com/netflix/maestro/engine/transformation/WorkflowGraph.java
size
called by 665
maestro-queue/src/main/java/com/netflix/maestro/queue/jobevents/TerminateThenRunJobEvent.java
getValue
called by 458
maestro-common/src/main/java/com/netflix/maestro/models/parameter/Parameter.java
getWorkflowId
called by 431
maestro-common/src/main/java/com/netflix/maestro/models/events/MaestroEvent.java
name
called by 403
maestro-flow/src/main/java/com/netflix/maestro/flow/actor/BaseActor.java
info
called by 395
maestro-common/src/main/java/com/netflix/maestro/models/timeline/TimelineLogEvent.java
type
called by 381
netflix-sel/src/main/java/com/netflix/sel/type/SelType.java

Shape

Method 5,171
Class 1,025
Interface 55
Enum 52

Languages

Java100%

Modules by API surface

netflix-sel/src/main/java/com/netflix/sel/ast/SelParser.java163 symbols
maestro-engine/src/test/java/com/netflix/maestro/engine/params/ParamsMergeHelperTest.java71 symbols
maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowDao.java55 symbols
maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceDao.java52 symbols
maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroRunStrategyDao.java44 symbols
maestro-engine/src/test/java/com/netflix/maestro/engine/dao/MaestroWorkflowDaoTest.java43 symbols
maestro-common/src/main/java/com/netflix/maestro/models/parameter/Parameter.java41 symbols
maestro-engine/src/test/java/com/netflix/maestro/engine/dao/MaestroWorkflowInstanceDaoTest.java40 symbols
maestro-engine/src/test/java/com/netflix/maestro/engine/dao/MaestroStepInstanceDaoTest.java39 symbols
netflix-sel/src/main/java/com/netflix/sel/ast/SelParserTokenManager.java37 symbols
maestro-engine/src/test/java/com/netflix/maestro/engine/dao/MaestroStepInstanceActionDaoTest.java36 symbols
maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowInstanceDao.java36 symbols

Datastores touched

maestroDatabase · 1 repos

For agents

$ claude mcp add maestro \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact