

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在截止日期雲端中排程任務
<a name="build-jobs-scheduling"></a>

建立任務之後， AWS 截止日期 Cloud 會將任務排程在與佇列相關聯的一或多個機群上進行處理。根據為機群設定的功能和特定步驟的主機需求，選擇處理特定任務的機群。

佇列中的任務會以最盡力的優先順序排定，從最高到最低。當兩個任務具有相同的優先順序時，會先排程最舊的任務。

下列各節提供排程任務程序的詳細資訊。

## 判斷機群相容性
<a name="jobs-scheduling-compatibility"></a>

建立任務後，截止日期雲端會根據與提交任務的佇列相關聯的機群功能，檢查任務中每個步驟的主機需求。如果機群符合主機需求，任務會進入 `READY` 狀態。

如果任務中的任何步驟具有與佇列相關聯的機群無法滿足的需求，則該步驟的狀態會設為 `NOT_COMPATIBLE`。此外，任務中的其餘步驟也會取消。

機群的功能是在機群層級設定。即使機群中的工作者符合任務的需求，如果其機群不符合任務的需求，則不會從任務指派任務。

下列任務範本有一個步驟，指定步驟的主機需求：

```
name: Sample Job With Host Requirements
specificationVersion: jobtemplate-2023-09
steps:
- name: Step 1
  script:
    actions:
      onRun:
        args:
        - '1'
        command: /usr/bin/sleep
  hostRequirements:
    amounts:
    # Capabilities starting with "amount." are amount capabilities. If they start with "amount.worker.",
    # they are defined by the OpenJD specification. Other names are free for custom usage.
    - name: amount.worker.vcpu
      min: 4
      max: 8
    attributes:
    - name: attr.worker.os.family
      anyOf:
      - linux
```

此任務可以排程到具有下列功能的機群：

```
{
    "vCpuCount": {"min": 4, "max": 8},
    "memoryMiB": {"min": 1024},
    "osFamily": "linux",
    "cpuArchitectureType": "x86_64"
}
```

此任務無法排程到具有下列任何功能的機群：

```
{
    "vCpuCount": {"min": 4},
    "memoryMiB": {"min": 1024},
    "osFamily": "linux",
    "cpuArchitectureType": "x86_64"
}
    The vCpuCount has no maximum, so it exceeds the maximum vCPU host requirement.
    
{
    "vCpuCount": {"max": 8},
    "memoryMiB": {"min": 1024},
    "osFamily": "linux",
    "cpuArchitectureType": "x86_64"
}
    The vCpuCount has no minimum, so it doesn't satisfy the minimum vCPU host requirement.

{
    "vCpuCount": {"min": 4, "max": 8},
    "memoryMiB": {"min": 1024},
    "osFamily": "windows",
    "cpuArchitectureType": "x86_64"
}    
    The osFamily doesn't match.
```

## 機群擴展
<a name="jobs-scheduling-scaling"></a>

當任務指派給相容的服務受管機群時，機群會自動擴展。機群中的工作者數量會根據機群可執行的任務數量而變更。

當任務指派給客戶管理的機群時，工作者可能已經存在，或者可以使用事件型自動擴展來建立。如需詳細資訊，請參閱《Amazon EC2 Auto Scaling 使用者指南》中的[使用 EventBridge 來處理自動擴展事件](https://docs.aws.amazon.com/autoscaling/ec2/userguide/automating-ec2-auto-scaling-with-eventbridge.html)。 *Amazon EC2 Auto Scaling *

## 工作階段
<a name="jobs-scheduling-sessions"></a>

任務中的任務分為一或多個工作階段。工作者會執行工作階段來設定環境、執行任務，然後銷毀環境。每個工作階段都由工作者必須採取的一或多個動作組成。

當工作者完成區段動作時，可以將其他工作階段動作傳送給工作者。工作者會在工作階段中重複使用現有的環境和任務附件，以更有效率的方式完成任務。

在服務受管機群工作者上，工作階段目錄會在工作階段結束後刪除，但在工作階段之間保留其他目錄。此行為可讓您針對可在多個工作階段間重複使用的資料實作快取策略。若要快取工作階段之間的資料，請將資料存放在執行任務之使用者的主目錄下。例如，Conda 套件會在Windows工作者和`/home/job-user/.conda-pkgs`Linux工作者`C:\Users\job-user\.conda-pkgs`上的 的任務使用者主目錄下快取。在工作者關閉之前，此資料仍然可用。

任務附件是由做為截止日期 Cloud CLI 任務套件一部分的提交者建立。您也可以使用 `create-job` AWS CLI 命令的 `--attachments`選項來建立任務附件。環境定義在兩個位置：連接到特定佇列的佇列環境，以及任務範本中定義的任務和步驟環境。

有四種工作階段動作類型：
+ `syncInputJobAttachments` – 將輸入任務附件下載至工作者。
+ `envEnter` – 執行環境`onEnter`的動作。
+ `taskRun` – 執行任務`onRun`的動作。
+ `envExit` – 執行環境`onExit`的動作。

下列任務範本具有步驟環境。它具有設定步驟環境`onEnter`的定義、定義要執行之任務`onRun`的定義，以及縮減步驟環境`onExit`的定義。為此任務建立的工作階段將包含 `envEnter`動作、一或多個`taskRun`動作，以及 `envExit`動作。

```
name: Sample Job with Maya Environment
specificationVersion: jobtemplate-2023-09
steps:
- name: Maya Step
  stepEnvironments:
  - name: Maya
    description: Runs Maya in the background.
    script:
      embeddedFiles:
      - name: initData
        filename: init-data.yaml
        type: TEXT
        data: |
          scene_file: MyAwesomeSceneFile
          renderer: arnold
          camera: persp
      actions:
        onEnter:
          command: MayaAdaptor
          args:
          - daemon
          - start
          - --init-data
          - file://{{Env.File.initData}}
        onExit:
          command: MayaAdaptor
          args:
          - daemon
          - stop
  parameterSpace:
    taskParameterDefinitions:
    - name: Frame
      range: 1-5
      type: INT
  script:
    embeddedFiles:
    - name: runData
      filename: run-data.yaml
      type: TEXT
      data: |
        frame: {{Task.Param.Frame}}
    actions:
      onRun:
        command: MayaAdaptor
        args:
        - daemon
        - run
        - --run-data
        - file://{{ Task.File.runData }}
```

### 工作階段動作管道
<a name="jobs-session-pipelining"></a>

工作階段動作管道可讓排程器將多個工作階段動作預先指派給工作者。工作者接著可以依序執行這些動作，減少或消除任務之間的閒置時間。

若要建立初始指派，排程器會建立一個具有一個任務的工作階段、工作者完成任務，然後排程器會分析任務持續時間以判斷未來的指派。

為了讓排程器有效，有任務持續時間規則。對於一分鐘內的任務，排程器會使用 2 號動力成長模式。例如，對於 1 秒的任務，排程器會指派 2 個新任務，然後 4 個新任務，然後 8 個新任務。對於超過一分鐘的任務，排程器只會指派一個新任務，且管道會保持停用狀態。

若要計算管道大小，排程器會執行下列動作：
+ 使用已完成任務的平均任務持續時間
+ 旨在讓工作者保持忙碌一分鐘
+ 僅考慮相同工作階段中的任務
+ 不跨工作者共用持續時間資料

隨著工作階段動作繁衍，工作者會立即開始新的任務，而且排程器請求之間沒有等待時間。它也為長時間執行的程序提供更高的工作者效率和更好的任務分佈。

此外，如果有新的較高優先順序任務可用，工作者將在目前的工作階段結束之前完成所有先前指派的工作，並指派較高優先順序任務的新工作階段。

## 步驟相依性
<a name="jobs-scheduling-dependencies"></a>

Deadline Cloud 支援在步驟之間定義相依性，讓一個步驟等待另一個步驟完成再開始。您可以為步驟定義多個相依性。在其所有相依性完成之前，不會排程具有相依性的步驟。

如果任務範本定義循環相依性，則會拒絕任務，並將任務狀態設定為 `CREATE_FAILED`。

下列任務範本會建立具有兩個步驟的任務。 `StepB` 取決於 `StepA`。 `StepB`只會在 `StepA` 成功完成後執行。

建立任務後， `StepA` 會處於 `READY` 狀態，並`StepB`處於 `PENDING` 狀態。`StepA` 完成後， `StepB`會移至 `READY` 狀態。如果 `StepA` 失敗，或`StepA`如果 已取消，則 `StepB`會移至 `CANCELED` 狀態。

您可以設定多個步驟的相依性。例如，如果 同時`StepC`取決於 `StepA`和 `StepB`，則在另外兩個步驟完成之前， `StepC`不會開始。

步驟相依性有下列限制：
+ **每個步驟的相依性** – 步驟最多可以依賴其他 128 個步驟。
+ **每個步驟的取用**者 – 最多 32 個其他步驟可以取決於單一步驟。

```
name: Step-Step Dependency Test
specificationVersion: 'jobtemplate-2023-09'
steps:
- name: A
  script:
    actions:
      onRun:
        command: bash
        args: ['{{ Task.File.run }}']
    embeddedFiles:
      - name: run
        type: TEXT
        data: |
          #!/bin/env bash

          set -euo pipefail

          sleep 1
          echo Task A Done!
- name: B
  dependencies:
  - dependsOn: A # This means Step B depends on Step A
  script:
    actions:
      onRun:
        command: bash
        args: ['{{ Task.File.run }}']
    embeddedFiles:
      - name: run
        type: TEXT
        data: |
          #!/bin/env bash

          set -euo pipefail

          sleep 1
          echo Task B Done!
```