

# 修复和恢复工作流运行
<a name="resuming-workflow"></a>

 如果工作流中的一个或多个节点（任务或爬网程序）未成功完成，这意味着工作流仅部分运行。找到根本原因并进行更正后，您可以选择要从中恢复工作流运行的一个或多个节点，然后恢复工作流运行。然后，所选节点以及这些节点下游的所有节点就会运行。

**Topics**
+ [恢复工作流运行：工作原理](#resume-workflow-howitworks)
+ [恢复工作流运行](#how-to-resume-workflow)
+ [工作流运行恢复的注释和限制](#resume-workflow-notes)

## 恢复工作流运行：工作原理
<a name="resume-workflow-howitworks"></a>

请考虑下图中的工作流 W1。

![\[触发器以矩形显示，任务以圆形显示。左侧触发器 T1 通过运行任务 J1 启动工作流。存在后续触发器和任务，但任务 J2 和 J3 失败，因此下游触发器和任务显示为未运行状态。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/workflow_W1.png)


工作流运行进程如下所示：

1. 触发器 T1 启动任务 J1。

1. J1 成功完成，从而触发触发器 T2 和 T3，分别运行任务 J2 和 J3。

1. 任务 J2 和 J3 失败。

1. 触发器 T4 和 T5 取决于 J2 和 J3 的成功完成结果，所以它们不会触发，任务 J4 和 J5 也不会运行。工作流 W1 仅部分运行。

现在，假设导致 J2 和 J3 失败的问题得到更正。J2 和 J3 被选为工作流运行的恢复起点。

![\[任务 J2 和 J3 被标记为要恢复的节点。下游触发器和任务显示为成功运行状态。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/workflow_W1_resumed.png)


工作流运行恢复如下所示：

1. 任务 J2 和 J3 成功运行。

1. 触发触发器 T4 和 T5。

1. 任务 J4 和 J5 成功运行。

恢复的工作流运行作为具有新运行 ID 的单独工作流运行被跟踪。查看工作流历史记录时，您可以查看任意工作流运行的上次运行 ID。在以下屏幕截图中的示例中，具有运行 ID `wr_c7a22...`（第二行）的工作流运行有未完成的节点。用户修复问题并恢复工作流运行，从而导致运行 ID `wr_a07e55...`（第一行）。

![\[工作流的 History (历史记录) 选项卡下的表包含两行，每个工作流运行各一行。第一行同时具有运行 ID 和上次运行 ID。第二行只有运行 ID。第一行中的上次运行 ID 与第二行中的运行 ID 相同。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/previous-run-id.png)


**注意**  
在本次讨论的其余部分，术语“恢复的工作流运行”是指恢复上次工作流运行时创建的工作流运行。“原始工作流运行”是指仅部分运行且需要恢复的工作流运行。

**“恢复的工作流运行”图**  
在恢复的工作流运行中，尽管仅运行部分节点，但运行图是完整图。也就是说，恢复的工作流中未运行的节点将从原始工作流运行的运行图中复制。原始工作流运行中运行的复制任务和爬网程序节点包括运行详细信息。

再次考虑上图中的工作流 W1。从 J2 和 J3 开始恢复工作流运行时，恢复的工作流运行的运行图会显示所有任务（J1 到 J5）以及所有触发器（T1 到 T5）。从原始工作流运行中复制 J1 的运行详细信息。

**工作流运行快照**  
启动工作流运行时，AWS Glue 会在该时间点拍摄工作流设计图的快照。该快照在工作流运行期间使用。如果您在运行启动后对任何触发器进行更改，这些更改不会影响当前工作流运行。快照确保工作流运行以一致方式继续执行。

快照确保仅触发器不可改变。您在工作流运行期间对下游任务和爬网程序所做的更改对当前运行有效。

## 恢复工作流运行
<a name="how-to-resume-workflow"></a>

请按照以下步骤操作，恢复工作流运行。您可以使用 AWS Glue 控制台、API、或 AWS Command Line Interface（AWS CLI）恢复工作流。

**恢复工作流运行（控制台）**

1. 通过 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 打开 AWS Glue 控制台。

   以有权查看工作流和恢复工作流运行的用户身份登录。
**注意**  
要恢复工作流运行，您需要 `glue:ResumeWorkflowRun` AWS Identity and Access Management（IAM）权限。

1. 在导航窗格中，选择 **Workflows (工作流)**。

1. 选择工作流，然后选择 **History (历史记录)** 选项卡。

1. 选择仅部分运行的工作流运行，然后选择 **View run details (查看运行详细信息)**。

1. 在运行图中，选择您要重新启动并且从中恢复工作流运行的第一个（或唯一）节点。

1. 在图形右侧的详细信息窗格中，选中 **Resume (恢复)** 复选框。  
![\[运行图显示三个节点，包括一个失败的任务节点。右侧的任务详细信息窗格包括 Resume (恢复) 复选框。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/workflow-pre-select-resume.png)

   节点会更改颜色，并在右上角显示一个小恢复图标。  
![\[文本介绍了运行图的相关更改。Resume (恢复) 复选框处于选中状态。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/workflow-post-select-resume.png)

1. 完成前面 2 个步骤，以便其他节点重新启动。

1. 选择 **Resume run (恢复运行)**。

**恢复工作流运行（AWS CLI）**

1. 确保您拥有 `glue:ResumeWorkflowRun` IAM 权限。

1. 检索要重新启动的节点的节点 ID。

   1.  运行原始工作流运行的 `get-workflow-run` 命令。提供工作流名称和运行 ID，然后添加 `--include-graph` 选项，如以下示例所示。从控制台上的 **History (历史记录)** 选项卡中获取运行 ID，或者运行 `get-workflow` 命令以获取运行 ID。

      ```
      aws glue get-workflow-run --name cloudtrailtest1 --run-id wr_a07e55f2087afdd415a404403f644a4265278f68b13ba3da08c71924ebe3c3a8 --include-graph
      ```

      命令以大型 JSON 对象的形式返回图形的节点和边缘。

   1. 按照节点对象的 `Type` 和 `Name` 属性，找到感兴趣的节点。

      以下是输出中的示例节点对象。

      ```
      {
          "Type": "JOB",
          "Name": "test1_post_failure_4592978",
          "UniqueId": "wnode_d1b2563c503078b153142ee76ce545fe5ceef66e053628a786ddd74a05da86fd",
          "JobDetails": {
              "JobRuns": [
                  {
                      "Id": "jr_690b9f7fc5cb399204bc542c6c956f39934496a5d665a42de891e5b01f59e613",
                      "Attempt": 0,
                      "TriggerName": "test1_aggregate_failure_649b2432",
                      "JobName": "test1_post_failure_4592978",
                      "StartedOn": 1595358275.375,
                      "LastModifiedOn": 1595358298.785,
                      "CompletedOn": 1595358298.785,
                      "JobRunState": "FAILED",
                      "PredecessorRuns": [],
                      "AllocatedCapacity": 0,
                      "ExecutionTime": 16,
                      "Timeout": 2880,
                      "MaxCapacity": 0.0625,
                      "LogGroupName": "/aws-glue/python-jobs"
                  }
              ]
          }
      }
      ```

   1. 从节点对象的 `UniqueId` 属性中获取节点 ID。

1. 运行 `resume-workflow-run` 命令。提供工作流名称、运行 ID 和节点 ID 列表（使用空格分隔），如以下示例所示。

   ```
   aws glue resume-workflow-run --name cloudtrailtest1 --run-id wr_a07e55f2087afdd415a404403f644a4265278f68b13ba3da08c71924ebe3c3a8 --node-ids wnode_ca1f63e918fb855e063aed2f42ec5762ccf71b80082ae2eb5daeb8052442f2f3  wnode_d1b2563c503078b153142ee76ce545fe5ceef66e053628a786ddd74a05da86fd
   ```

   命令会输出已恢复（新）工作流运行的运行 ID 以及将启动的节点列表。

   ```
   {
       "RunId": "wr_2ada0d3209a262fc1156e4291134b3bd643491bcfb0ceead30bd3e4efac24de9",
       "NodeIds": [
           "wnode_ca1f63e918fb855e063aed2f42ec5762ccf71b80082ae2eb5daeb8052442f2f3"
       ]
   }
   ```

   请注意，尽管示例 `resume-workflow-run` 命令列出了两个要重新启动的节点，但示例输出指明仅重新启动了一个节点。这是因为，一个节点位于另一个节点的下游，下游节点无论如何会按工作流的正常流程重新启动。

## 工作流运行恢复的注释和限制
<a name="resume-workflow-notes"></a>

恢复工作流运行时，请牢记以下注释和限制。
+ 仅当工作流处于 `COMPLETED` 状态时，您可恢复工作流。
**注意**  
即使工作流运行中有一个或多个节点未完成，工作流运行状态也会显示为 `COMPLETED`。请务必检查运行图，发现任何未成功完成的节点。
+ 您可以从原始工作流运行尝试运行的任务或爬网程序节点恢复工作流运行。您不能从触发器节点恢复工作流运行。
+ 重新启动节点不会重置其状态。部分处理的数据都不会回滚。
+ 您可以多次恢复失败的工作流程运行。但是，恢复过的运行只能再恢复一次。要进行其他重试，请改为恢复原来的失败运行
+ 如果您选择两个要重新启动的节点，并且它们彼此依赖，则上游节点将在下游节点之前运行。事实上，无需选择下游节点，因为它将按照工作流的正常流程运行。