设置爬网程序配置选项 - Amazon Glue
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

设置爬网程序配置选项

当爬网程序运行时,它可能会遇到导致架构或分区与以前的爬网不同的数据存储更改。您可以使用 Amazon Web Services Management Console或 Amazon Glue API 来配置爬网程序如何处理某些类型的更改。

在 Amazon Glue 控制台上设置爬网程序配置选项

当您使用 Amazon Glue 控制台定义爬网程序时,有多个选项可用于配置爬网程序的行为。有关使用 Amazon Glue 控制台添加爬网程序的更多信息,请参阅在 Amazon Glue 控制台上使用爬网程序

当爬网程序针对以前已爬网的数据存储运行时,可能会发现架构已更改或数据存储中的一些对象已被删除。爬网程序将记录架构更改。根据爬网程序的源类型,可能创建新的表和分区,而不考虑架构更改策略。

要指定爬网程序在发现架构中的更改时执行什么操作,您可以在控制台上选择下列操作之一:

  • Update the table definition in the Data Catalog (更新数据目录中的表定义) – 在 Amazon Glue Data Catalog 中添加新列、删除缺少的列并修改现有列的定义。删除爬网程序未设置的任何元数据。这是默认设置。

  • Add new columns only (仅添加新列) – 对于映射到 Amazon S3 数据存储的表,在发现新列时添加这些新列,但不删除或更改数据目录中的现有列的类型。当数据目录中的当前列正确且您不希望爬网程序删除或更改现有列的类型时,选择此选项。如果基本 Amazon S3 表属性(如分类、压缩类型或 CSV 分隔符)更改,将此表标记为已弃用。保留数据目录中存在的输入格式和输出格式。仅当 SerDe 参数是由爬网程序设置时,才更新该参数。对于所有其他数据存储,修改现有列定义。

  • Ignore the change and don't update the table in the Data Catalog (忽略更改,不更新数据目录中的表) – 只创建新表和分区。

    这是增量爬网的默认设置。

爬网程序可能还发现新的或更改的分区。默认情况下,会添加新分区,如果现有分区已更改,则会更新它们。此外,您还可以在 Amazon Glue 控制台上将爬网程序配置选项设置为 Update all new and existing partitions with metadata from the table (使用表中的元数据更新所有新的和现有的分区)。设置此选项后,分区会继承其父表中的元数据属性,如分类、输入格式、输出格式、SerDe 信息和架构。对表中的这些属性进行的任何更改都将传播到其分区。当在现有爬网程序上设置此配置选项时,将会更新现有分区,以便在下次爬网程序运行时与父表的属性相匹配。

要指定爬网程序在数据存储中找到已删除对象时执行什么操作,请选择下列操作之一:

  • 删除数据目录中的表和分区

  • Ignore the change and don't update the table in the Data Catalog(忽略更改,不更新数据目录中的表)

    这是增量爬网的默认设置。

  • Mark the table as deprecated in the Data Catalog (在数据目录中将表标记为已弃用) – 这是默认设置。

使用 API 设置爬网程序配置选项

当使用 Amazon Glue API 定义爬网程序时,您可以从多个字段中选择来配置爬网程序。爬网程序 API 中的 SchemaChangePolicy 确定爬网程序在发现已更改的架构或已删除的对象时执行什么操作。爬网程序在运行时记录架构更改。

当爬网程序运行时,无论架构更改策略如何,都始终会创建新的表和分区。您可以在 SchemaChangePolicy 结构中的 UpdateBehavior 字段中选择以下操作之一来确定爬网程序在发现更改的表架构时执行什么操作:

  • UPDATE_IN_DATABASE – 更新 Amazon Glue Data Catalog 中的表。添加新列、删除缺少的列并修改现有列的定义。删除爬网程序未设置的任何元数据。

  • LOG – 忽略更改,不更新数据目录中的表

    这是增量爬网的默认设置。

您也可以使用爬网程序 API Configuration 字段中提供的 JSON 对象覆盖 SchemaChangePolicy 结构。此 JSON 对象可以包含键–值对以将策略设置为不更新现有列并仅添加新列。例如,以字符串形式提供以下 JSON 对象:

{ "Version": 1.0, "CrawlerOutput": { "Tables": { "AddOrUpdateBehavior": "MergeNewColumns" } } }

此选项对应于 Amazon Glue 控制台上的 Add new columns only (仅添加新列) 选项。它仅覆盖通过对 Amazon S3 数据存储进行网络爬取生成的表的 SchemaChangePolicy 结构。如果您希望保留数据目录(可信来源)中存在的元数据,请选择此选项。在遇到新列时添加这些新列,包括嵌套数据类型。但是,不会删除现有列,且不会更改其类型。如果 Amazon S3 表属性显著更改,将此表标记为已弃用,并记录一条警告,指示需要解决不兼容的属性。

当爬网程序针对以前爬取的数据存储运行时,它可能会发现新的或已更改的分区。默认情况下,会添加新分区,如果现有分区已更改,则会更新它们。此外,您还可以将爬网程序配置选项设置为 InheritFromTable(对应于 Amazon Glue 控制台上的 Update all new and existing partitions with metadata from the table (使用表中的元数据更新所有新的和现有的分区) 选项)。设置此选项后,分区会继承其父表中的元数据属性,如分类、输入格式、输出格式、SerDe 信息和架构。对父表进行的任何属性更改都将传播到其分区。

当在现有爬网程序上设置此配置选项时,将会更新现有分区,以便在下次爬网程序运行时与父表的属性相匹配。在爬网程序 API Configuration 字段中设置此行为。例如,以字符串形式提供以下 JSON 对象:

{ "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" } } }

爬网程序 API Configuration 字段可以设置多个配置选项。例如,要配置分区和表的爬网程序输出,可以提供以下 JSON 对象的字符串表示形式:

{ "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }, "Tables": {"AddOrUpdateBehavior": "MergeNewColumns" } } }

您可以选择下列操作之一来确定爬网程序在数据存储中找到已删除对象时执行什么操作。爬网程序 API 中的 SchemaChangePolicy 结构中的 DeleteBehavior 字段设置爬网程序在发现已删除对象时的行为。

  • DELETE_FROM_DATABASE – 删除数据目录中的表和分区。

  • LOG – 忽略更改。请勿更新数据目录。而是写入日志消息。

  • DEPRECATE_IN_DATABASE – 在数据目录中将表标记为已弃用。这是默认设置。

如何阻止爬网程序更改现有架构

如果您不希望爬网程序覆盖您对 Amazon S3 表定义中的现有字段进行的更新,请在控制台上选择选项 Add new columns only (仅添加新列) 或设置配置选项 MergeNewColumns。这适用于表和分区,除非 Partitions.AddOrUpdateBehavior 被覆盖为 InheritFromTable

如果您不希望在爬网程序运行时更改表架构,请将架构更改策略设置为 LOG。您还可以设置将分区架构设置为从表继承的配置选项。

如果您在控制台上配置爬网程序,可以选择以下操作:

  • Ignore the change and don't update the table in the Data Catalog(忽略更改,不更新数据目录中的表)

  • Update all new and existing partitions with metadata from the table (使用表中的元数据更新所有新的和现有的分区)

当您使用 API 配置爬网程序时,请设置以下参数:

  • SchemaChangePolicy 结构中的 UpdateBehavior 字段设置为 LOG

  • 使用爬网程序 API 中的以下 JSON 对象的字符串表示形式设置 Configuration 字段;例如:

    { "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" } } }

如何为每个 Amazon S3 包含路径创建单个架构

默认情况下,当爬网程序为 Amazon S3 中存储的数据定义表时,它会同时考虑数据兼容性和架构相似性。它考虑的数据兼容性因素包括数据是否具有相同的格式(例如,JSON),相同的压缩类型(例如,GZIP),Amazon S3 路径的结构以及其他数据属性。架构相似性衡量单独 Amazon S3 对象的架构的相似程度。

您可以在可能的情况下将 CombineCompatibleSchemas 的爬网程序配置为公用表定义。使用此选项,爬网程序仍会考虑数据兼容性,但在评估指定包含路径中的 Amazon S3 对象时会忽略特定架构的相似性。

如果要在控制台上配置爬网程序以组合架构,请选择爬网程序选项 Create a single schema for each S3 path (为每个 S3 路径创建单个架构)

当您使用 API 配置爬网程序时,请设置以下配置选项:

  • 使用爬网程序 API 中的以下 JSON 对象的字符串表示形式设置 Configuration 字段;例如:

    { "Version": 1.0, "Grouping": { "TableGroupingPolicy": "CombineCompatibleSchemas" } }

为帮助说明此选项,假设您使用包含路径 s3://bucket/table1/ 定义了一个爬网程序。当该爬网程序运行时,它会找到两个具有以下特征的 JSON 文件:

  • 文件 1S3://bucket/table1/year=2017/data1.json

  • 文件内容{“A”: 1, “B”: 2}

  • 架构A:int, B:int

  • 文件 2S3://bucket/table1/year=2018/data2.json

  • 文件内容{“C”: 3, “D”: 4}

  • 架构C: int, D: int

默认情况下,该爬网程序会创建两个名为 year_2017year_2018 的表,因为架构不够相似。但是,如果选项 Create a single schema for each S3 path (为每个 S3 路径创建单个架构) 处于选中状态,并且数据是兼容的,则爬网程序会创建一个表。该表具有架构 A:int,B:int,C:int,D:intpartitionKey year:string

如何指定表位置和分区级别

默认情况下,当爬网程序为 Amazon S3 中存储的数据定义表时,爬网程序会尝试将架构合并在一起并创建顶级表(year=2019)。在某些情况下,您可能希望爬网程序为文件夹 month=Jan 创建一个表,但由于同级文件夹(month=Mar)已合并到同一个表中,因此爬网程序会创建一个分区。

通过表级别爬网程序选项,您可以灵活地告诉爬网程序表的位置,以及您希望如何创建分区。当您指定 Table level (表级别) 时,则会从 Amazon S3 存储桶中以该绝对级别创建表。


        将表级别指定为级别 2 的爬网程序分组。

当在控制台上配置爬网程序时,您可以为 Table level (表级别) 爬网程序选项指定一个值。该值必须是指示表位置(数据集中的绝对级别)的正整数。顶级文件夹的级别为 1。例如,对于路径 mydataset/a/b,如果级别设置为 3,则在位置 mydataset/a/b 处创建表。

Console

              在爬网程序配置中指定表级别。
API

使用 API 配置爬网程序时,请使用以下 JSON 对象的字符串表示形式设置 Configuration 字段;例如:

configuration = jsonencode( { "Version": 1.0, "Grouping" = { TableLevelConfiguration = 2 } })
CloudFormation

在本例中,您在 CloudFormation 模板的控制台中设置了可用的表级别选项:

"Configuration": "{ \"Version\":1.0, \"Grouping\":{\"TableLevelConfiguration\":2} }"

如何指定允许爬网程序创建的最大表数

您可以选择允许爬网程序创建的最大表数,方法是通过 Amazon Glue 控制台或 CLI 指定 TableThreshold。如果爬网程序在其爬取过程中检测到的表数大于此输入值,则爬取失败且不会向 Data Catalog 写入任何数据。

当爬网程序检测和创建的表数比预期表数要大得多时,此参数非常有用。这可能有多种原因,例如:

  • 使用 Amazon Glue 作业填充 Amazon S3 位置时,您最终可能会得到与文件夹相同级别的空文件。在这种情况下,当您在此 Amazon S3 位置运行爬网程序时,由于文件和文件夹位于同一级别,爬网程序会创建多个表。

  • 如果没有配置 "TableGroupingPolicy": "CombineCompatibleSchemas",您最终得到的表数可能比预期数量多。

您可以将 TableThreshold 指定为一个大于 0 的整数值。该值根据每个爬网程序进行配置。也就是说,每次爬取都会考虑该值。例如:爬网程序的 TableThreshold 值设置为 5。每次爬取时,Amazon Glue 会将检测到的表数与此表阈值(5)进行比较。如果检测到的表数小于 5,Amazon Glue 将表写入 Data Catalog;否则,爬取失败,将不会写入 Data Catalog。

控制台

使用 Amazon 控制台设置 TableThreshold


          Amazon 控制台的“Output and scheduling”(输出和计划)部分显示最大表阈值参数。
CLI

使用 Amazon CLI 设置 TableThreshold

"{"Version":1.0, "CrawlerOutput": {"Tables":{"AddOrUpdateBehavior":"MergeNewColumns", "TableThreshold":5}}}";

记录错误消息以帮助您识别表路径和清理数据。爬网程序因表数大于提供的表阈值而失败时您账户中的日志示例:

Table Threshold value = 28, Tables detected - 29

在 CloudWatch 中,我们将检测到的所有表位置记录为 INFO 消息。将错误记录为失败原因。

ERROR com.amazonaws.services.glue.customerLogs.CustomerLogService - CustomerLogService received CustomerFacingException with message The number of tables detected by crawler: 29 is greater than the table threshold value provided: 28. Failing crawler without writing to Data Catalog. com.amazonaws.services.glue.exceptions.CustomerFacingInternalException: The number of tables detected by crawler: 29 is greater than the table threshold value provided: 28. Failing crawler without writing to Data Catalog.

如何为 Delta Lake 数据存储指定配置选项

在为 Delta Lake 数据存储配置网络爬取程序时,可以指定以下配置参数:

连接

可以选择或添加要用于此 Amazon S3 目标的网络连接。有关连接的信息,请参阅 在 Amazon Glue Data Catalog 中定义连接

启用写入清单

选择是否检测 Delta Lake 事务处理日志中的表元数据或 Schema 更改;它会重新生成清单文件。如果已经使用 Delta Lake SET TBLPROPERTIES 配置了自动清单更新,则不应选择此选项。

包含 Delta Lake 表路径

将一个或多个指向 Delta 表的 Amazon S3 路径,格式为 s3://bucket/prefix/object


              指定爬取某个 Delta Lake 数据存储。

如何将爬网程序配置为使用 Lake Formation 凭证

该功能为预览版,可能会发生变化。有关更多信息,请参阅 Amazon 服务条款文档中的“测试版和预览”部分。

您可以将爬网程序配置为使用 Amazon Lake Formation 凭证访问 Amazon S3 数据存储库或 Data Catalog 表的证书,该表包含相同 Amazon Web Services 账户 或不同 Amazon Web Services 账户 中的基础 Amazon S3 位置。如果爬网程序与 Data Catalog 表位于同一账户中,则可以将现有 Data Catalog 表配置为爬网程序的目标。使用 Data Catalog 表作为爬网程序的目标时,目前只允许具有单个目录表的单个目录目标。

注意

将 Data Catalog 表定义为爬网程序目标时,请确保 Data Catalog 表的基础位置是 Amazon S3 位置。使用 Lake Formation 凭证的爬网程序仅支持具有基础 Amazon S3 位置的 Data Catalog 目标。

爬网程序与注册的 Amazon S3 位置或 Data Catalog 表位于同一账户(账户内爬取)时所需的设置

要允许爬网程序使用 Lake Formation 凭证访问数据存储或 Data Catalog 表,您需要向 Lake Formation 注册数据位置。此外,爬网程序的 IAM 角色必须有从 Amazon S3 桶的注册目标读取数据的权限。

您可以使用 Amazon Web Services Management Console 或 Amazon Command Line Interface(Amazon CLI)完成以下配置步骤。

Amazon Web Services Management Console
  1. 在配置爬网程序以访问爬网程序源之前,向 Lake Formation 注册数据存储或 Data Catalog 的数据位置。在 Lake Formation 控制台(https://console.aws.amazon.com/lakeformation/)中,将 Amazon S3 位置注册为定义爬网程序的 Amazon Web Services 账户 中数据湖的根位置。有关更多信息,请参阅 Registering an Amazon S3 location(注册 Amazon S3 位置)。

  2. 向用于爬网程序运行的 IAM 角色授予 Data location(数据位置)权限,以便爬网程序可以从 Lake Formation 中的目标读取数据。有关更多信息,请参阅 Granting data location permissions (same account)(授予数据位置权限(同一账户))。

  3. 授予爬网程序角色数据库的访问权限(CreateDescribeAlter),该数据库被指定为输出数据库。有关更多信息,请参阅 Granting database permissions using the Lake Formation console and the named resource method(使用 Lake Formation 控制台和指定的资源方法授予数据库权限)。

  4. 在 IAM 控制台(https://console.aws.amazon.com/iam/)中,为爬网程序创建 IAM 角色。将 lakeformation:GetDataAccess 策略添加到该角色。

  5. 在 Amazon Glue 控制台(https://console.aws.amazon.com/glue/)中配置爬网程序时,选择选项 Use Lake Formation credentials for crawling Amazon S3 data source(使用 Lake Formation 凭证爬取 Amazon S3 数据来源)。

    注意

    accountId 字段对于账户内爬取是可选的。

Amazon CLI
aws glue --profile demo create-crawler --debug --cli-input-json '{ "Name": "prod-test-crawler", "Role": "arn:aws:iam::111122223333:role/service-role/AWSGlueServiceRole-prod-test-run-role", "DatabaseName": "prod-run-db", "Description": "", "Targets": { "S3Targets":[ { "Path": "s3://crawl-testbucket" } ] }, "SchemaChangePolicy": { "UpdateBehavior": "LOG", "DeleteBehavior": "LOG" }, "RecrawlPolicy": { "RecrawlBehavior": "CRAWL_EVERYTHING" }, "LineageConfiguration": { "CrawlerLineageSettings": "DISABLE" }, "LakeFormationConfiguration": { "UseLakeFormationCredentials": true, "AccountId": "111122223333" }, "Configuration": { "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }, "Tables": {"AddOrUpdateBehavior": "MergeNewColumns" } }, "Grouping": { "TableGroupingPolicy": "CombineCompatibleSchemas" } }, "CrawlerSecurityConfiguration": "", "Tags": { "KeyName": "" } }'

爬网程序与注册的 Amazon S3 位置位于不同账户(跨账户爬取)时所需的设置

要允许爬网程序使用 Lake Formation 凭证访问不同账户中的数据存储,您必须先向 Lake Formation 注册 Amazon S3 数据位置。然后,通过执行以下步骤向爬网程序的账户授予数据位置权限。

您可以使用 Amazon Web Services Management Console 或 Amazon CLI 完成以下步骤。

Amazon Web Services Management Console
  1. 在注册 Amazon S3 位置的账户(账户 B)中:

    1. 向 Lake Formation 注册 Amazon S3 路径。有关更多信息,请参阅注册 Amazon S3 位置

    2. 向将运行爬网程序的账户(账户 A)授予 Data location(数据位置)权限。有关更多信息,请参阅授予数据位置权限

    3. 在 Lake Formation 中创建一个空数据库,将基础位置作为目标 Amazon S3 位置。有关更多信息,请参阅创建数据库

    4. 授予账户 A(将运行爬网程序的账户)访问您在上一步中创建的数据库的权限。有关更多信息,请参阅授予数据库权限

  2. 在创建并将运行爬网程序的账户(账户 A)中:

    1. 使用 Amazon RAM 控制台,接受从外部账户(账户 B)共享的数据库。有关更多信息,请参阅 Accepting a resource share invitation from Amazon Resource Access Manager(接受来自 RAMlong 的资源共享邀请)。

    2. 为爬网程序创建 IAM 角色。将 lakeformation:GetDataAccess 策略添加到该角色。

    3. 在 Lake Formation 控制台(https://console.aws.amazon.com/lakeformation/)中,授予用于爬网程序运行的 IAM 角色目标 Amazon S3 位置上的 Data location(数据位置)权限,以使爬网程序能够从 Lake Formation 中的目标读取数据。有关更多信息,请参阅授予数据位置权限

    4. 在共享数据库上创建资源链接。有关更多信息,请参阅创建资源链接

    5. 授予爬网程序角色对共享数据库和资源链接的访问权限(CreateDescribeAlter)。资源链接在爬网程序的输出中指定。

    6. 在 Amazon Glue 控制台(https://console.aws.amazon.com/glue/)中配置爬网程序时,选择选项 Use Lake Formation credentials for crawling Amazon S3 data source(使用 Lake Formation 凭证爬取 Amazon S3 数据来源)。

      对于跨账户爬取,请指定向 Lake Formation 注册的目标 Amazon S3 位置的 Amazon Web Services 账户 ID。对于账户内爬取,accountId 字段是可选的。

Amazon CLI
aws glue --profile demo create-crawler --debug --cli-input-json '{ "Name": "prod-test-crawler", "Role": "arn:aws:iam::111122223333:role/service-role/AWSGlueServiceRole-prod-test-run-role", "DatabaseName": "prod-run-db", "Description": "", "Targets": { "S3Targets":[ { "Path": "s3://crawl-testbucket" } ] }, "SchemaChangePolicy": { "UpdateBehavior": "LOG", "DeleteBehavior": "LOG" }, "RecrawlPolicy": { "RecrawlBehavior": "CRAWL_EVERYTHING" }, "LineageConfiguration": { "CrawlerLineageSettings": "DISABLE" }, "LakeFormationConfiguration": { "UseLakeFormationCredentials": true, "AccountId": "111111111111" }, "Configuration": { "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }, "Tables": {"AddOrUpdateBehavior": "MergeNewColumns" } }, "Grouping": { "TableGroupingPolicy": "CombineCompatibleSchemas" } }, "CrawlerSecurityConfiguration": "", "Tags": { "KeyName": "" } }'
注意
  • 只有 Amazon S3 和 Data Catalog 目标支持使用 Lake Formation 凭证的爬网程序。

  • 对于使用 Lake Formation 凭证售卖的目标,基础 Amazon S3 位置必须属于同一个桶。例如,只要所有目标位置都在同一个桶(bucket1)下,客户就可以使用多个目标(s3://bucket1/folder1、s3://bucket1/folder2)。不允许指定不同的桶(s3://bucket1/folder1、s3://bucket2/folder2)。

  • 目前,对于 Data Catalog 目标爬网程序,只允许具有单个目录表的单个目录目标。