

# 使用 Amazon Glue API 查询工作流
<a name="workflows_api_concepts"></a>

Amazon Glue 提供了用于管理工作流程的丰富 API。您可以使用 Amazon Glue API 检索工作流程的静态视图或正在运行的工作流程的动态视图。有关更多信息，请参阅 [工作流程](aws-glue-api-workflow.md)。

**Topics**
+ [查询静态视图](#workflows_api_concepts_static)
+ [查询动态视图](#workflows_api_concepts_dynamic)

## 查询静态视图
<a name="workflows_api_concepts_static"></a>

可使用 `GetWorkflow` API 操作获取指示工作流程设计的静态视图。此操作返回由节点和边缘组成的有向图，其中节点表示触发器、作业或爬网程序。边缘定义节点之间的关系。它们由 Amazon Glue 控制台中图表上的连接器（箭头）表示。

您还可以将此操作用于常用的图形处理库，如 NetworkX、igraph、JGraphT 和 Java 通用网络/图表 (JUNG) 框架。由于所有这些库都以类似方式表示图表，因此需要最少的转换。

根据与工作流程关联的触发器的最新定义，此 API 返回的静态视图是最新视图。

### 图表定义
<a name="workflows_api_concepts_static_graph"></a>

工作流程图表 G 是一个有序对 (N, E)，其中 N 是一组节点，E 是一组边缘。*节点* 是图表中由一个唯一数字标识的顶点。节点的类型可以是触发器、任务或爬网程序。例如：`{name:T1, type:Trigger, uniqueId:1}, {name:J1, type:Job, uniqueId:2}`。

*边缘* 是一个 2 元组的形式 (`src, dest`)，其中 `src` 和 `dest` 是节点，并且存在从 `src` 到 `dest` 的定向边缘。

### 查询静态视图的示例
<a name="workflows_api_concepts_static_example"></a>

考虑条件触发器 T，这将在作业 J1 完成时触发作业 J2。

```
J1 ---> T ---> J2
```

节点：J1、T、J2 

边缘：(J1, T)、(T, J2)

## 查询动态视图
<a name="workflows_api_concepts_dynamic"></a>

使用 `GetWorkflowRun` API 操作获取正在运行的工作流程的动态视图。此操作返回图表的相同的静态视图以及与工作流程运行相关的元数据。

对于运行，表示 `GetWorkflowRun` 调用中的任务的节点具有一组任务运行，它们作为最新工作流运行的一部分启动。您可以使用此列表在图表本身中显示每个作业的运行状态。对于尚未运行的下游依赖项，此字段设置为 `null`。图表信息使您能够随时了解任何工作流程的当前状态。

此 API 返回的动态视图基于工作流运行开始时出现的静态视图。

*运行时节点示例：*`{name:T1, type: Trigger, uniqueId:1}`、`{name:J1, type:Job, uniqueId:2, jobDetails:{jobRuns}}`、`{name:C1, type:Crawler, uniqueId:3, crawlerDetails:{crawls}}`

### 示例 1：动态视图
<a name="workflows_api_concepts_dynamic_examples"></a>

以下示例说明了一个包含两个触发器的简单工作流程。
+ 节点：t1、j1、t2、j2 
+ 边缘：(t1, j1)、(j1, t2)、(t2, j2)

`GetWorkflow` 响应包含以下内容。

```
{
    Nodes : [
        {
            "type" : Trigger,
            "name" : "t1",
            "uniqueId" : 1
        },
        {
            "type" : Job,
            "name" : "j1",
            "uniqueId" : 2
        },
        {
            "type" : Trigger,
            "name" : "t2",
            "uniqueId" : 3
        },
        {
            "type" : Job,
            "name" : "j2",
            "uniqueId" : 4
        }
    ],
    Edges : [
        {
            "sourceId" : 1,
            "destinationId" : 2
        },
        {
            "sourceId" : 2,
            "destinationId" : 3
        },
        {
            "sourceId" : 3,
            "destinationId" : 4
        }
}
```

`GetWorkflowRun` 响应包含以下内容。

```
{
    Nodes : [
        {
            "type" : Trigger,
            "name" : "t1",
            "uniqueId" : 1,
            "jobDetails" : null,
            "crawlerDetails" : null
        },
        {
            "type" : Job,
            "name" : "j1",
            "uniqueId" : 2,
            "jobDetails" : [
                {
                    "id" : "jr_12334",
                    "jobRunState" : "SUCCEEDED",
                    "errorMessage" : "error string"
                }
            ],
            "crawlerDetails" : null
        },
        {
            "type" : Trigger,
            "name" : "t2",
            "uniqueId" : 3,
            "jobDetails" : null,
            "crawlerDetails" : null
        },
        {
            "type" : Job,
            "name" : "j2",
            "uniqueId" : 4,
            "jobDetails" : [
                {
                    "id" : "jr_1233sdf4",
                    "jobRunState" : "SUCCEEDED",
                    "errorMessage" : "error string"
                }
            ],
            "crawlerDetails" : null
        }
    ],
    Edges : [
        {
            "sourceId" : 1,
            "destinationId" : 2
        },
        {
            "sourceId" : 2,
            "destinationId" : 3
        },
        {
            "sourceId" : 3,
            "destinationId" : 4
        }
}
```

### 示例 2：带一个条件触发器的多个作业
<a name="workflows_api_concepts_dynamic_example_2"></a>

以下示例显示具有多个作业和一个条件触发器 (t3) 的工作流程。

```
Consider Flow:
T(t1) ---> J(j1) ---> T(t2) ---> J(j2)
             |                    |
             |                    |
             >+------> T(t3) <-----+
                        |
                        |
                      J(j3)

Graph generated:
Nodes: t1, t2, t3, j1, j2, j3
Edges: (t1, j1), (j1, t2), (t2, j2), (j1, t3), (j2, t3), (t3, j3)
```