

# 排查 Amazon Glue 中的蓝图错误
<a name="blueprint_workflow_troubleshoot"></a>

如果您在使用 Amazon Glue 蓝图时遇到错误，则可以使用以下解决方案来帮助您查找问题的根源并解决问题。

**Topics**
+ [错误：缺少 PySpark 模块](#blueprint-workflow-error-1)
+ [错误：缺少蓝图配置文件](#blueprint-workflow-error-2)
+ [错误：缺少导入的文件](#blueprint-workflow-error-3)
+ [错误：未授权在资源上执行 iamPassRole](#blueprint-workflow-error-4)
+ [错误：无效 cron 计划](#blueprint-workflow-error-5)
+ [错误：已存在具有相同名称的触发器](#blueprint-workflow-error-6)
+ [错误：名称为 foo 的工作流已存在。](#blueprint-workflow-error-7)
+ [错误：在指定的布局生成器路径中找不到模块](#blueprint-workflow-error-8)
+ [错误：连接字段中的验证错误](#blueprint-workflow-error-9)

## 错误：缺少 PySpark 模块
<a name="blueprint-workflow-error-1"></a>

Amazon Glue 返回错误“Unknown error executing layout generator function ModuleNotFoundError: No module named 'pyspark'”。

解压蓝图存档文件时，它可能类似以下任一情况：

```
$ unzip compaction.zip 
Archive:  compaction.zip
   creating: compaction/
  inflating: compaction/blueprint.cfg  
  inflating: compaction/layout.py    
  inflating: compaction/README.md    
  inflating: compaction/compaction.py   
  
$ unzip compaction.zip
Archive:  compaction.zip
  inflating: blueprint.cfg           
  inflating: compaction.py           
  inflating: layout.py               
  inflating: README.md
```

对于第一种情况，与蓝图相关的所有文件均位于名为 compaction 的文件夹下面，然后转换为名为 *compaction.zip* 的 zip 格式文件。

对于第二种情况，蓝图所需的所有文件均不在文件夹内，而是作为根文件添加到 zip 格式文件 *compaction.zip* 下面。

允许使用上述两种格式创建文件。但是，请确保 `blueprint.cfg` 有正确路径指向布局生成脚本中函数的名称。

**示例**  
对于案例 1：`blueprint.cfg` 应该具有 `layoutGenerator`，如下所示：

```
layoutGenerator": "compaction.layout.generate_layout"
```

对于案例 2：`blueprint.cfg` 应该具有 `layoutGenerator`，如下所示：

```
layoutGenerator": "layout.generate_layout" 
```

如果没有正确包含此路径，您可能会看到指示的错误。例如，如果您拥有案例 2 中提到的文件夹结构，并且具有案例 1 中指明的 `layoutGenerator`，您可能会看到上面的错误。

## 错误：缺少蓝图配置文件
<a name="blueprint-workflow-error-2"></a>

Amazon Glue 返回错误“Unknown error executing layout generator function FileNotFoundError: [Errno 2] No such file or directory: '/tmp/compaction/blueprint.cfg'”。

blueprint.cfg 应置于 ZIP 格式存档的根级别，或者置于与 ZIP 存档文件具有相同名称的文件夹内。

当我们提取蓝图 ZIP 格式存档文件时，blueprint.cfg 预计位于以下某个路径。如果您在以下路径找不到该文件，您可能会看到上述错误。

```
$ unzip compaction.zip 
Archive:  compaction.zip
   creating: compaction/
  inflating: compaction/blueprint.cfg  
  
$ unzip compaction.zip
Archive:  compaction.zip
  inflating: blueprint.cfg
```

## 错误：缺少导入的文件
<a name="blueprint-workflow-error-3"></a>

Amazon Glue 返回错误“Unknown error executing layout generator function FileNotFoundError: [Errno 2] No such file or directory:\$1 \$1'demo-project/foo.py'”。

如果布局生成脚本具有读取其他文件的功能，请确保提供要导入的文件的完整路径。例如，Conversion.py 脚本可能会在 Layout.py 中引用。有关更多信息，请参阅[示例蓝图项目](https://docs.amazonaws.cn/glue/latest/dg/developing-blueprints-sample.html)。

## 错误：未授权在资源上执行 iamPassRole
<a name="blueprint-workflow-error-4"></a>

Amazon Glue 返回错误“User: arn:aws:sts::123456789012:assumed-role/AWSGlueServiceRole/GlueSession is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789012:role/AWSGlueServiceRole”

如果工作流中的任务和爬网程序承担的角色是通过蓝图创建工作流时传递的角色，则蓝图角色本身需要包含 `iam:PassRole` 权限。

如果工作流中的任务和爬网程序承担的角色不是通过蓝图创建工作流实体时传递的角色，则蓝图角色对于此类其他角色（不是蓝图角色）需要包含 `iam:PassRole` 权限。

有关更多信息，请参阅[蓝图角色的权限](https://docs.amazonaws.cn/glue/latest/dg/blueprints-personas-permissions.html#blueprints-role-permissions)。

## 错误：无效 cron 计划
<a name="blueprint-workflow-error-5"></a>

Amazon Glue 返回错误“The schedule cron(0 0 \$1 \$1 \$1 \$1) is invalid.”

提供有效 [cron](https://en.wikipedia.org/wiki/Cron) 表达式。有关更多信息，请参阅[用于作业和爬网程序的基于时间的计划](https://docs.amazonaws.cn/glue/latest/dg/monitor-data-warehouse-schedule.html)。

## 错误：已存在具有相同名称的触发器
<a name="blueprint-workflow-error-6"></a>

Amazon Glue 返回错误“Trigger with name 'foo\$1starting\$1trigger' already submitted with different configuration”。

蓝图不要求您在用于工作流创建的布局脚本中定义触发器。触发器创建由蓝图库根据两项操作之间定义的依赖关系进行管理。

触发器的命名如下所示：
+ 对于工作流中的启动触发器，命名为 <workflow\$1name>\$1starting\$1trigger。
+ 如果工作流中的节点（任务/爬网程序）取决于一个或多个上游节点的完成情况；Amazon Glue 会定义以下名称的触发器：<workflow\$1name>\$1<node\$1name>\$1trigger

此错误意味着已存在具有相同名称的触发器。您可以删除现有触发器并重新运行工作流创建。

**注意**  
删除工作流不会删除工作流内的节点。虽然工作流已删除，但触发器可能会保留。因此，您可能不会收到“workflow already exists”错误，但如果创建工作流、删除工作流并尝试从同一蓝图使用相同的名称重新创建，您可能会收到“trigger already exists”错误。

## 错误：名称为 foo 的工作流已存在。
<a name="blueprint-workflow-error-7"></a>

工作流名称应该唯一。请尝试使用其他名称。

## 错误：在指定的布局生成器路径中找不到模块
<a name="blueprint-workflow-error-8"></a>

Amazon Glue 返回错误“Unknown error executing layout generator function ModuleNotFoundError: No module named 'crawl\$1s3\$1locations'”。

```
layoutGenerator": "crawl_s3_locations.layout.generate_layout"
```

例如，如果您具有上述 LayoutGenerator 路径，当您解压缩蓝图归档文件时，它需要如下所示：

```
$ unzip crawl_s3_locations.zip 
Archive:  crawl_s3_locations.zip
   creating: crawl_s3_locations/
  inflating: crawl_s3_locations/blueprint.cfg  
  inflating: crawl_s3_locations/layout.py    
  inflating: crawl_s3_locations/README.md
```

解压归档文件时，如果蓝图归档文件如下所示，则可能会出现上述错误。

```
$ unzip crawl_s3_locations.zip
Archive:  crawl_s3_locations.zip
  inflating: blueprint.cfg           
  inflating: layout.py               
  inflating: README.md
```

您可能会发现，没有名为 `crawl_s3_locations` 的文件夹，并且当 `layoutGenerator` 路径通过模块 `crawl_s3_locations` 指向布局文件时，您可能会收到上述错误。

## 错误：连接字段中的验证错误
<a name="blueprint-workflow-error-9"></a>

Amazon Glue 返回错误“Unknown error executing layout generator function TypeError: Value ['foo'] for key Connections should be of type <class 'dict'>\$1”。

这是验证错误。`Job` 类中的 `Connections` 字段需要一个字典，但却提供了导致错误的值列表。

```
User input was list of values
Connections= ['string']

Should be a dict like the following
Connections*=*{'Connections': ['string']}
```

为了在从蓝图创建工作流时避免这些运行时错误，您可以验证工作流、任务和爬网程序定义，如[测试蓝图](https://docs.amazonaws.cn/glue/latest/dg/developing-blueprints-testing.html)中概述。

请参阅 [Amazon Glue 蓝图类参考](https://docs.amazonaws.cn/glue/latest/dg/developing-blueprints-code-classes.html)中的语法，定义布局脚本中的 Amazon Glue 作业、爬网程序和工作流。