从作业 API 2.0 更新到 2.1

现在可以使用 Azure Databricks 作业编排多个任务。 本文详细介绍支持包含多个任务的作业的作业 API 更改,并提供指导以帮助更新现有 API 客户端来使用此新功能。

Databricks 建议对 API 脚本和客户端使用作业 API 2.1,尤其是在使用包含多个任务的作业时。

本文将使用单个任务定义的作业称为单任务格式,将使用多个任务定义的作业称为多任务格式 。

作业 API 2.0 和 2.1 现在支持 update 请求。 使用 update 请求更改现有作业而不是 reset 请求,以最大程度地减少单任务格式作业和多任务格式作业之间的更改。

API 更改

作业 API 现在定义 TaskSettings 对象以捕获作业中每个任务的设置。 对于多任务格式作业,tasks 字段(TaskSettings 数据结构的数组)包含在 JobSettings 中。 以前是 JobSettings 一部分的某些字段现在是多任务格式作业的任务设置的一部分。 JobSettings 还会更新以包含 format 字段。 format 字段指示作业的格式,是设置为 STRINGSINGLE_TASKMULTI_TASK 值。

对于多任务格式作业,需要更新现有 API 客户端以实现对 JobSettings 的这些更改。 有关所需更改的详细信息,请参阅 API 客户端指

作业 API 2.1 支持多任务格式。 所有 API 2.1 请求都必须符合多任务格式,响应的结构也采用多任务格式。 首先为 API 2.1 发布新功能。

对作业 API 2.0 进行了更新,增加了一个字段,以支持多任务格式作业。 除非另有说明,否则本文档中的示例使用 API 2.0。 但是,Databricks 建议对新的和现有的 API 脚本和客户端使用 API 2.1。

表示 API 2.0 和 2.1 的多任务格式作业的示例 JSON 文档:

{
  "job_id": 53,
  "settings": {
    "name": "A job with multiple tasks",
    "email_notifications": {},
    "timeout_seconds": 0,
    "max_concurrent_runs": 1,
    "tasks": [
      {
        "task_key": "clean_data",
        "description": "Clean and prepare the data",
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/clean-data"
        },
        "existing_cluster_id": "1201-my-cluster",
        "max_retries": 3,
        "min_retry_interval_millis": 0,
        "retry_on_timeout": true,
        "timeout_seconds": 3600,
        "email_notifications": {}
      },
      {
        "task_key": "analyze_data",
        "description": "Perform an analysis of the data",
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/analyze-data"
        },
        "depends_on": [
          {
            "task_key": "clean_data"
          }
        ],
        "existing_cluster_id": "1201-my-cluster",
        "max_retries": 3,
        "min_retry_interval_millis": 0,
        "retry_on_timeout": true,
        "timeout_seconds": 3600,
        "email_notifications": {}
      }
    ],
    "format": "MULTI_TASK"
  },
  "created_time": 1625841911296,
  "creator_user_name": "user@databricks.com",
  "run_as_user_name": "user@databricks.com"
}

作业 API 2.1 支持配置任务级群集或者一个或多个共享的作业群集:

  • 任务级群集在任务启动时创建并启动,在任务完成时终止。
  • 共享作业群集允许同一作业中的多个任务使用该群集。 群集在使用群集的第一个任务启动时创建并启动,在使用群集的最后一个任务完成后终止。 共享作业群集在空闲时不会终止,而是只在使用它的所有任务完成后终止。 共享某个群集的多个非依赖任务可以同时启动。 如果在所有任务完成之前共享作业群集失败或终止,则会创建一个新的群集。

若要配置共享作业群集,请在 JobSettings 对象中包括一个 JobCluster 数组。 最多可为每个作业指定 100 个群集。 下面是配置了两个共享群集的作业的 API 2.1 响应示例:

注意

如果任务具有库依赖项,则必须在 task 字段设置中配置库;不能在共享作业群集配置中配置库。 在下面的示例中,ingest_orders 任务的配置中的 libraries 字段展示了库依赖项的规范。

{
  "job_id": 53,
  "settings": {
    "name": "A job with multiple tasks",
    "email_notifications": {},
    "timeout_seconds": 0,
    "max_concurrent_runs": 1,
    "job_clusters": [
      {
        "job_cluster_key": "default_cluster",
        "new_cluster": {
          "spark_version": "7.3.x-scala2.12",
          "node_type_id": "i3.xlarge",
          "spark_conf": {
            "spark.speculation": true
          },
          "aws_attributes": {
            "availability": "SPOT",
            "zone_id": "us-west-2a"
          },
          "autoscale": {
            "min_workers": 2,
            "max_workers": 8
          }
        }
      },
      {
        "job_cluster_key": "data_processing_cluster",
        "new_cluster": {
          "spark_version": "7.3.x-scala2.12",
          "node_type_id": "r4.2xlarge",
          "spark_conf": {
            "spark.speculation": true
          },
          "aws_attributes": {
            "availability": "SPOT",
            "zone_id": "us-west-2a"
          },
          "autoscale": {
            "min_workers": 8,
            "max_workers": 16
          }
        }
      }
    ],
    "tasks": [
      {
        "task_key": "ingest_orders",
        "description": "Ingest order data",
        "depends_on": [ ],
        "job_cluster_key": "auto_scaling_cluster",
        "spark_jar_task": {
          "main_class_name": "com.databricks.OrdersIngest",
          "parameters": [
            "--data",
            "dbfs:/path/to/order-data.json"
          ]
        },
        "libraries": [
          {
            "jar": "dbfs:/mnt/databricks/OrderIngest.jar"
          }
        ],
        "timeout_seconds": 86400,
        "max_retries": 3,
        "min_retry_interval_millis": 2000,
        "retry_on_timeout": false
      },
      {
        "task_key": "clean_orders",
        "description": "Clean and prepare the order data",
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/clean-data"
        },
        "job_cluster_key": "default_cluster",
        "max_retries": 3,
        "min_retry_interval_millis": 0,
        "retry_on_timeout": true,
        "timeout_seconds": 3600,
        "email_notifications": {}
      },
      {
        "task_key": "analyze_orders",
        "description": "Perform an analysis of the order data",
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/analyze-data"
        },
        "depends_on": [
          {
            "task_key": "clean_data"
          }
        ],
        "job_cluster_key": "data_processing_cluster",
        "max_retries": 3,
        "min_retry_interval_millis": 0,
        "retry_on_timeout": true,
        "timeout_seconds": 3600,
        "email_notifications": {}
      }
    ],
    "format": "MULTI_TASK"
  },
  "created_time": 1625841911296,
  "creator_user_name": "user@databricks.com",
  "run_as_user_name": "user@databricks.com"
}

对于单任务格式作业,JobSettings 数据结构保持不变,只不过添加了 format 字段。 不包含 TaskSettings 数组,并且任务设置仍在 JobSettings 数据结构的顶层进行定义。 无需对现有 API 客户端进行更改即可处理单任务格式作业。

表示 API 2.0 单任务格式作业的示例 JSON 文档:

{
  "job_id": 27,
  "settings": {
    "name": "Example notebook",
    "existing_cluster_id": "1201-my-cluster",
    "libraries": [
      {
        "jar": "dbfs:/FileStore/jars/spark_examples.jar"
      }
    ],
    "email_notifications": {},
    "timeout_seconds": 0,
    "schedule": {
      "quartz_cron_expression": "0 0 0 * * ?",
      "timezone_id": "US/Pacific",
      "pause_status": "UNPAUSED"
    },
    "notebook_task": {
      "notebook_path": "/notebooks/example-notebook",
      "revision_timestamp": 0
    },
    "max_concurrent_runs": 1,
    "format": "SINGLE_TASK"
  },
  "created_time": 1504128821443,
  "creator_user_name": "user@databricks.com"
}

API 客户端指南

本部分提供受新的多任务格式功能影响的 API 调用的指导原则、示例和所需更改。

本节内容:

创建

若要在作业 API 中通过创建新作业操作 (POST /jobs/create) 创建单任务格式作业,无需更改现有客户端。

若要创建多任务格式作业,请使用 JobSettings 中的 tasks 字段为每个任务指定设置。 以下示例创建一个包含两个笔记本任务的作业。 此示例适用于 API 2.0 和 2.1:

注意

最多可为每个作业指定 100 个任务。

{
  "name": "Multi-task-job",
  "max_concurrent_runs": 1,
  "tasks": [
    {
      "task_key": "clean_data",
      "description": "Clean and prepare the data",
      "notebook_task": {
        "notebook_path": "/Users/user@databricks.com/clean-data"
      },
      "existing_cluster_id": "1201-my-cluster",
      "timeout_seconds": 3600,
      "max_retries": 3,
      "retry_on_timeout": true
    },
    {
      "task_key": "analyze_data",
      "description": "Perform an analysis of the data",
      "notebook_task": {
        "notebook_path": "/Users/user@databricks.com/analyze-data"
      },
      "depends_on": [
        {
          "task_key": "clean_data"
        }
      ],
      "existing_cluster_id": "1201-my-cluster",
      "timeout_seconds": 3600,
      "max_retries": 3,
      "retry_on_timeout": true
    }
  ]
}

运行提交

若要在作业 API 中通过创建和触发一次性运行操作 (POST /runs/submit) 提交单任务格式作业的一次性运行,无需更改现有客户端。

若要提交多任务格式作业的一次性运行,请使用 JobSettings 中的 tasks 字段为每个任务指定设置(包括群集)。 在提交多任务格式作业时,必须在任务级别设置群集,因为 runs submit 请求不支持共享作业群集。 有关指定多个任务的示例 JobSettings,请参阅创建

更新

若要在作业 API 中通过部分更新作业操作 (POST /jobs/update) 更新单任务格式作业,无需更改现有客户端。

若要更新多任务格式作业的设置,必须使用唯一的 task_key 字段标识新 task 设置。 有关指定多个任务的示例 JobSettings,请参阅创建

重置

若要在作业 API 中通过覆盖作业的所有设置操作 (POST /jobs/reset) 覆盖单任务格式作业的设置,无需更改现有客户端。

若要覆盖多任务格式作业的设置,请指定具有 TaskSettings 数据结构数组的 JobSettings 数据结构。 有关指定多个任务的示例 JobSettings,请参阅创建

使用 Update 可以更改单个字段,而无需从单任务转换为多任务格式。

列表

对于单任务格式作业,无需进行客户端更改即可处理来自作业 API 中列出所有作业操作 (GET /jobs/list) 的响应。

对于多任务格式作业,大多数设置在任务级别而不是作业级别进行定义。 可以在任务或作业级别设置群集配置。 若要修改客户端以访问 Job 结构中返回的多任务格式作业的群集或任务设置,请执行以下操作:

下面的示例演示一个包含单任务和多任务格式作业的响应。 此示例适用于 API 2.0:

{
  "jobs": [
    {
      "job_id": 36,
      "settings": {
        "name": "A job with a single task",
        "existing_cluster_id": "1201-my-cluster",
        "email_notifications": {},
        "timeout_seconds": 0,
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/example-notebook",
          "revision_timestamp": 0
        },
        "max_concurrent_runs": 1,
        "format": "SINGLE_TASK"
      },
      "created_time": 1505427148390,
      "creator_user_name": "user@databricks.com"
    },
    {
      "job_id": 53,
      "settings": {
        "name": "A job with multiple tasks",
        "email_notifications": {},
        "timeout_seconds": 0,
        "max_concurrent_runs": 1,
        "format": "MULTI_TASK"
      },
      "created_time": 1625841911296,
      "creator_user_name": "user@databricks.com"
    }
  ]
}

获取

对于单任务格式作业,无需进行客户端更改即可处理来自作业 API 中获取作业操作 (GET /jobs/get) 的响应。

多任务格式作业会返回包含任务设置的 task 数据结构数组。 如果需要访问任务级别详细信息,则需要修改客户端以循环访问 tasks 数组并提取所需字段。

下面显示来自针对多任务格式作业的 Get API 调用的示例响应。 此示例适用于 API 2.0 和 2.1:

{
  "job_id": 53,
  "settings": {
    "name": "A job with multiple tasks",
    "email_notifications": {},
    "timeout_seconds": 0,
    "max_concurrent_runs": 1,
    "tasks": [
      {
        "task_key": "clean_data",
        "description": "Clean and prepare the data",
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/clean-data"
        },
        "existing_cluster_id": "1201-my-cluster",
        "max_retries": 3,
        "min_retry_interval_millis": 0,
        "retry_on_timeout": true,
        "timeout_seconds": 3600,
        "email_notifications": {}
      },
      {
        "task_key": "analyze_data",
        "description": "Perform an analysis of the data",
        "notebook_task": {
          "notebook_path": "/Users/user@databricks.com/analyze-data"
        },
        "depends_on": [
          {
            "task_key": "clean_data"
          }
        ],
        "existing_cluster_id": "1201-my-cluster",
        "max_retries": 3,
        "min_retry_interval_millis": 0,
        "retry_on_timeout": true,
        "timeout_seconds": 3600,
        "email_notifications": {}
      }
    ],
    "format": "MULTI_TASK"
  },
  "created_time": 1625841911296,
  "creator_user_name": "user@databricks.com",
  "run_as_user_name": "user@databricks.com"
}

运行获取

对于单任务格式作业,无需进行客户端更改即可处理来自作业 API 中获取作业运行操作 (GET /jobs/runs/get) 的响应。

多任务格式作业运行的响应包含 TaskSettings 的数组。 若要检索每个任务的运行结果,请执行以下操作:

  • 循环访问每个任务。
  • 分析每个任务的 run_id
  • 使用 run_id 调用获取运行的输出操作 (GET /jobs/runs/get-output) 以获取关于每个任务的运行的详细信息。 下面是此请求的示例响应:
{
  "job_id": 53,
  "run_id": 759600,
  "number_in_job": 7,
  "original_attempt_run_id": 759600,
  "state": {
    "life_cycle_state": "TERMINATED",
    "result_state": "SUCCESS",
    "state_message": ""
  },
  "cluster_spec": {},
  "start_time": 1595943854860,
  "setup_duration": 0,
  "execution_duration": 0,
  "cleanup_duration": 0,
  "trigger": "ONE_TIME",
  "creator_user_name": "user@databricks.com",
  "run_name": "Query logs",
  "run_type": "JOB_RUN",
  "tasks": [
    {
      "run_id": 759601,
      "task_key": "query-logs",
      "description": "Query session logs",
      "notebook_task": {
        "notebook_path": "/Users/user@databricks.com/log-query"
      },
      "existing_cluster_id": "1201-my-cluster",
      "state": {
        "life_cycle_state": "TERMINATED",
        "result_state": "SUCCESS",
        "state_message": ""
      }
    },
    {
      "run_id": 759602,
      "task_key": "validate_output",
      "description": "Validate query output",
      "depends_on": [
        {
          "task_key": "query-logs"
        }
      ],
      "notebook_task": {
        "notebook_path": "/Users/user@databricks.com/validate-query-results"
      },
      "existing_cluster_id": "1201-my-cluster",
      "state": {
        "life_cycle_state": "TERMINATED",
        "result_state": "SUCCESS",
        "state_message": ""
      }
    }
  ],
  "format": "MULTI_TASK"
}

运行获取输出

对于单任务格式作业,无需进行客户端更改即可处理来自作业 API 中获取运行的输出操作 (GET /jobs/runs/get-output) 的响应。

对于多任务格式作业,对父运行调用 Runs get output 会导致错误,因为运行输出仅适用于单个任务。 若要获取多任务格式作业的输出和元数据,请执行以下操作:

  • 调用获取运行的输出请求。
  • 循环访问响应中的子 run_id 字段。
  • 使用子 run_id 值调用 Runs get output

运行列表

对于单任务格式作业,无需进行客户端更改即可处理来自列出作业运行操作 (GET /jobs/runs/list) 的响应。

对于多任务格式作业,会返回空 tasks 数组。 将 run_id 传递到run_id操作 (GET /jobs/runs/get) 以检索任务。 下面显示来自针对多任务格式作业的 Runs list API 调用的示例响应:

{
  "runs": [
    {
      "job_id": 53,
      "run_id": 759600,
      "number_in_job": 7,
      "original_attempt_run_id": 759600,
      "state": {
          "life_cycle_state": "TERMINATED",
          "result_state": "SUCCESS",
          "state_message": ""
      },
      "cluster_spec": {},
      "start_time": 1595943854860,
      "setup_duration": 0,
      "execution_duration": 0,
      "cleanup_duration": 0,
      "trigger": "ONE_TIME",
      "creator_user_name": "user@databricks.com",
      "run_name": "Query logs",
      "run_type": "JOB_RUN",
      "tasks": [],
      "format": "MULTI_TASK"
    }
  ],
  "has_more": false
}