maestro

NetflixApache-2.0活跃维护

Netflix 开源的工作流编排器,用 DAG 定义和调度批处理、ETL/ELT 数据管道,让大规模数据作业按依赖关系自动执行。

Maestro: Netflix’s Workflow Orchestrator

暂无版本3,852star311fork同步于 2026-11-10 11:39 UTC

怎么上手

由 README 提炼,执行前请确认
./gradlew build
./gradlew bootRun
硬件要求按 README 说明

README 未说明显存或 GPU 要求;本地运行需 Java 21、Gradle、Docker,AWS 模块与扩展服务依赖 Docker Compose 启动的 LocalStack。

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

Netflix 开源的通用工作流编排器,把数据与 ML 任务的调度和依赖管理交给它

Netflix 开源的工作流编排器,用 DAG 定义和调度批处理、ETL/ELT 数据管道,让大规模数据作业按依赖关系自动执行。

核心能力

  • 以 workflow-as-a-service 形式提供托管式编排
  • 通过 REST API 提交、查询、触发和删除工作流
  • 支持注册 job template 并在工作流中复用为模板步骤
  • 支持在 Kubernetes pod 中运行步骤生成器
  • 提供 Python SDK 构建 YAML 并推送、启动工作流

容易踩的坑

需先装好 Java 21、Gradle 和 Docker,否则构建或启动会失败;AWS 模块要先执行 docker compose -f maestro-aws/docker-compose.yml up 再以 aws profile 启动;maestro-extensions 是独立服务,需另起 LocalStack 并占用 8081 端口。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

0 个版本

暂无 release 数据(可能没有发版,或尚未同步)。

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    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

    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'

    Register a sample job template and run a workflow that uses it as a template step

    • curl --header "user: tester" -X POST 'http://127.0.0.1:8080/api/v3/job-templates' -H "Content-Type: application/json" -d @maestro-common/src/testFixtures/resources/fixtures/api/sample-job-template-positions-create-request.json
    • 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-template-wf.json
    • curl --header "user: tester" -X POST 'http://127.0.0.1:8080/api/v3/workflows/sample-template-wf/versions/latest/actions/start' -H "Content-Type: application/json" -d '{"initiator": {"type": "manual"}}'
    • For an example that runs a generator in a Kubernetes pod to build the list of steps to execute, use sample-job-template-step-preparer-create-request.json together with sample-template-step-preparer-wf.json.

    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.