爬网程序属性 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

爬网程序属性

使用 AWS Glue 控制台或 AWS Glue API 定义爬网程序时,您可以指定以下信息:

爬网程序名称以及可选描述符和设置

设置包含标签、安全配置和自定义分类器。您可以先定义自定义分类器,然后再定义爬网程序。有关更多信息,请参阅下列内容:

爬网程序源类型

爬网程序可以直接访问数据存储作为爬网的源,也可以使用 Data Catalog 中的现有表作为源。如果爬网程序使用现有目录表,它将爬取由这些目录表指定的数据存储。有关更多信息,请参阅爬网程序源类型

仅网络爬取 S3 数据源的新文件夹

如果启用,则只会爬网自上次爬网程序运行以来添加的 Amazon S3 文件夹。有关更多信息,请参阅中的增量爬网AWS Glue

爬网程序源:数据存储或目录表

从以下选项中进行选择:

  • 一个或多个数据存储

    爬网程序可以爬取多个不同类型的数据存储(Amazon S3、JDBC 等)。

  • Data Catalog 表的列表

    目录表指定要爬取的数据存储。爬网程序在单次运行中只能爬取目录表;它无法混用其他源类型。

您一次只能配置一个数据存储。在提供连接信息并包含路径和排除模式后,您可以选择添加另一个数据存储。

有关更多信息,请参阅爬网程序源类型

其他爬网程序源参数

每个源类型都需要一组不同的附加参数。下面是一个不完整的列表:

Connection

选择或添加 AWS Glue 连接。有关连接的信息,请参阅在 AWS Glue Data Catalog 中定义连接

启用数据采样(仅适用于 Amazon DynamoDB、MongoDB 和 Amazon DocumentDB 数据存储)

选择是否仅对数据样本进行爬网。如果未选择该选项,则对整个表进行爬网。当表不是高吞吐量表时,扫描所有记录会花费很长时间。

扫描速率(仅适用于 DynamoDB 数据存储)

指定 AWS Glue 爬网程序使用的已配置读取容量单位的百分比。读取容量单位是一个由 DynamoDB 定义的术语,它是一个数值,用作每秒可对表执行的读取次数的速率限制器。请输入介于 0.1 和 1.5 之间的值。如果未指定,则该值默认为 0.5(对于预配置的表)和配置的最大容量的 1/4(对于按需表)。

包含路径
对于 Amazon S3 数据存储

选择是在您的账户还是其他账户中指定路径,然后浏览以选择 Amazon S3 路径。

对于 JDBC 数据存储

Enter <database>/<schema>/<table><database>/<table>,具体取决于数据库产品。Oracle Database 和 MySQL 不支持路径中的架构。您可以用百分比 (%) 字符替换 <schema><table>, 例如,对于系统标识符 (SID) 为 orcl 的 Oracle 数据库,请输入 orcl/% 以导入连接中指定的用户有权访问的所有表。

重要

此字段区分大小写。

对于 MongoDB 或 Amazon DocumentDB 数据存储

Enter database/collection.

有关更多信息,请参阅包含和排除模式

排除模式

您可以使用这些模式从爬取中排除某些文件或表。有关更多信息,请参阅包含和排除模式

IAM 角色

爬网程序将代入此角色。它必须具有类似于 AWS 托管策略 AWSGlueServiceRole 的权限。 对于 Amazon S3 和 DynamoDB 源,它还必须具有访问数据存储的权限。如果爬网程序读取使用 Amazon S3 (AWS Key Management Service) 加密的 AWS KMS 数据,则角色必须具有对 AWS KMS 密钥的解密权限。

对于 Amazon S3 数据存储,附加到角色的其他权限将类似于以下内容:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket/object*" ] } ] }

对于 Amazon DynamoDB 数据存储,附加到角色的其他权限将类似于以下内容:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:Scan" ], "Resource": [ "arn:aws:dynamodb:region:account-id:table/table-name*" ] } ] }

有关更多信息,请参阅 步骤 2: 为 IAM 创建 AWS Glue 角色管理 AWS Glue 资源的访问权限

爬网程序计划

您可以按需运行爬网程序,或制定计划以自动运行爬网程序。有关更多信息,请参阅安排 AWS Glue 爬网程序

Data Catalog 中用于所创建的目录表的目标数据库

有关更多信息,请参阅在数据目录中定义数据库

输出配置选项

选项包括爬网程序应如何处理检测到的架构更改、数据存储中的已删除对象等等。有关更多信息,请参阅设置爬网程序配置选项

重新爬网策略

在第一个爬网完成后对 Amazon S3 数据源进行爬网时,请选择是再次爬取整个数据集还是只爬取自上次爬网程序运行以来添加的文件夹。有关更多信息,请参阅中的增量爬网AWS Glue

爬网程序源类型

爬网程序可以直接访问数据存储作为爬取的源,也可以使用现有目录表作为源。如果爬网程序使用现有目录表,它将爬取由这些目录表指定的数据存储。

将目录表指定为源的常见原因是,您手动创建表(因为您已经知道数据存储的结构)并且希望爬网程序保持更新表(包括添加新分区)时。有关其他原因的讨论,请参阅使用爬网程序更新手动创建的 Data Catalog 表

当您指定现有表作为爬网程序源类型时,以下条件适用:

  • 数据库名称是可选的。

  • 仅允许指定 Amazon S3 或 Amazon DynamoDB 数据存储的目录表。

  • 爬网程序运行时,不会创建新的目录表。根据需要更新现有表,包括添加新分区。

  • 将忽略在数据存储中找到的已删除对象;不删除目录表。相反,爬网程序会写入一条日志消息。(SchemaChangePolicy.DeleteBehavior=LOG)

  • 用于为每个 Amazon S3 路径创建单个架构的爬网程序配置选项在默认情况下处于启用状态,并且无法禁用。(TableGroupingPolicy=CombineCompatibleSchemas)有关更多信息,请参阅如何为每个 Amazon S3 包含路径创建单个架构

  • 您不能将目录表与任何其他源类型(例如 Amazon S3 或 Amazon DynamoDB)混用来作为源。

包含和排除模式

在评估要在爬网中包含或排除的内容时,爬网程序首先评估所需的包含路径。对于 Amazon S3、MongoDB、Amazon DocumentDB(与 MongoDB 兼容)和关系数据存储,您必须指定包含路径。

对于 Amazon S3 数据存储,包括路径语法为 bucket-name/folder-name/file-name.ext。 要对存储桶中的所有对象进行爬网,只需在包含路径中指定存储桶名称。排除模式相对于包含路径

对于 MongoDB 和 Amazon DocumentDB(具有 MongoDB 兼容性),语法为 database/collection

对于 JDBC 数据存储,语法为 database-name/schema-name/table-namedatabase-name/table-name。 语法取决于数据库引擎是否支持数据库中的架构。例如,对于 MySQL 或 Oracle 等数据库引擎,请勿在包含路径中指定 schema-name。您可以用百分号 (%) 取代包含路径中的架构或表,以表示数据库中的所有架构或所有表。您不能用百分号 (%) 取代包含路径中的数据库。排除路径相对于包含路径。例如,要排除 JDBC 数据存储中的表,请在排除路径中键入表名称。

爬网程序使用包含 JDBC URI 连接字符串的 AWS Glue 连接连接到 JDBC 数据存储。该爬网程序只能使用 AWS Glue 连接中的 JDBC 用户名和密码来访问数据库引擎中的对象。爬网程序只能创建它通过 JDBC 连接可以访问的表。 在爬网程序使用 JDBC URI 访问数据库引擎后,包含路径用于确定在 Data Catalog 中创建了数据库引擎中的哪些表。例如,对于 MySQL,如果您指定包含路径 MyDatabase/%,则 MyDatabase 中的所有表都将在 Data Catalog 中创建。访问 Amazon Redshift 时,如果您指定包含路径 MyDatabase/%,则数据库 MyDatabase 的所有架构中的所有表都是在 Data Catalog 中创建的。如果您指定包含路径 MyDatabase/MySchema/%,则会创建数据库 MyDatabase 和架构 MySchema 中的所有表。

指定包含路径后,您可以通过指定一个或多个 Unix 样式 glob 排除模式,从爬取中排除对象 (否则您的包含路径会包括它)。这些模式应用于您的包含路径,以确定哪些对象被排除。这些模式还会存储为爬网程序创建的表的属性。AWS GluePySpark 扩展(如 create_dynamic_frame.from_catalog)读取表属性并排除由排除模式定义的对象。

AWS Glue 在排除模式中支持以下类型的 glob 模式。

排除模式 Description
*.csv 与表示当前文件夹中以 .csv 结尾的对象名称的 Amazon S3 路径匹配
*.* 与包含点的所有对象名称匹配
*.{csv,avro} 与以 .csv.avro 结尾的对象名称匹配
foo.? 与以 foo. 开头,后跟单个字符扩展名的对象名称匹配
myfolder/* myfolder 的一个级别子文件夹中的对象匹配,例如 /myfolder/mysource
myfolder/*/* myfolder 的两个级别子文件夹中的对象匹配,例如 /myfolder/mysource/data
myfolder/** myfolder 的所有子文件夹中的对象匹配,例如 /myfolder/mysource/mydata/myfolder/mysource/data
myfolder** 匹配子文件夹 myfolder 以及 myfolder 下的文件,如 /myfolder/myfolder/mydata.txt
Market* 与具有以 Market 开头的名称的 JDBC 数据库中的表匹配,例如 Market_usMarket_fr

AWS Glue 解释 glob 排除模式,如下所示:

  • 斜杠 (/) 字符是将 Amazon S3 密钥分隔到文件夹层次结构中的分隔符。

  • 星号 (*) 字符与不跨越文件夹边界的名称组分的零个或多个字符匹配。

  • 双星号 (**) 与跨越文件夹或架构边界的零个或多个字符匹配。

  • 问号 (?) 字符恰好匹配名称组分的一个字符。

  • 反斜杠 (\) 字符用于对其他可以解释为特殊字符的字符进行转义。表达式 \\ 与单个反斜杠匹配,\{ 与左大括号匹配。

  • 方括号 [ ] 创建一个与名称组分的单个字符 (来自一组字符) 匹配的方括号表达式。例如,[abc]abc 匹配。 连字符 (-) 可用于指定范围,因此 [a-z] 指定从 az(含)的范围匹配。这些形式可以混合,因此 [abce-g] 与 abcefg 匹配。 如果方括号 ([) 后面的字符是感叹号 (!),则括号表达式将否定。例如,[!a-c]abc 以外的任何字符匹配。

    在方括号表达式内,*?\ 字符与自身匹配。如果连字符 (-) 是方括号内的第一个字符,或者如果它在您否定时是 ! 之后的第一个字符,则它与自身匹配。

  • 大括号 ({ }) 将一组子模式 (如果组中的任何子模式匹配,则组匹配) 括起来。逗号 (,) 字符用于分隔子模式。不能对组进行嵌套。

  • 在匹配操作中,文件名中的前导句点或点字符被视为正常字符。例如,* 排除与文件名 .hidden 匹配的模式。

例 属于 Amazon S3 排除模式

将会根据包含路径计算每个排除模式。例如,假设您具有以下 Amazon S3 目录结构:

/mybucket/myfolder/ departments/ finance.json market-us.json market-emea.json market-ap.json employees/ hr.json john.csv jane.csv juan.txt

假定包含路径 s3://mybucket/myfolder/,下面是排除模式的一些示例结果:

排除模式 结果
departments/** 排除 departments 下面的所有文件和文件夹,并包括 employees 文件夹及其文件
departments/market* 排除 market-us.jsonmarket-emea.jsonmarket-ap.json
**.csv 排除名称以 .csv 结尾的 myfolder 下面的所有对象
employees/*.csv 排除 employees 文件夹中的所有 .csv 文件

例 排除 Amazon S3 分区的子集

假设数据按天进行分区,以便一年中的每一天都在单独的 Amazon S3 分区中。对于 2015 年 1 月,有 31 个分区。现在,若要仅网络爬取 1 月的第一周内的数据,您必须排除除第 1 到第 7 天之外的所有分区:

2015/01/{[!0],0[8-9]}**, 2015/0[2-9]/**, 2015/1[0-2]/**

让我们来看一下此 glob 模式的几个部分。第一部分 2015/01/{[!0],0[8-9]}** 排除不以“0”开头的所有天,以及 2015 年 01 月中的第 08 和第 09 天。请注意,“**”用作日期数字模式的后缀,并穿越文件夹边界直到较低级别的文件夹。如果使用“*”,则不排除较低文件夹级别。

第二部分 2015/0[2-9]/** 排除 2015 年 02 月 09 月中的天。

第三部分 2015/1[0-2]/** 排除 2015 年 10、11 和 12 月中的天。

例 JDBC 排除模式

假设您使用以下架构结构爬取 JDBC 数据库:

MyDatabase/MySchema/ HR_us HR_fr Employees_Table Finance Market_US_Table Market_EMEA_Table Market_AP_Table

假定包含路径 MyDatabase/MySchema/%,下面是排除模式的一些示例结果:

排除模式 结果
HR* 排除名称以 HR 开头的表
Market_* 排除名称以 Market_ 开头的表
**_Table 排除名称以 _Table 结尾的所有表