为何 AWS Glue 爬网程序要运行很长时间?

上次更新时间:2019 年 9 月 24 日

AWS Glue 爬网程序已经运行了几个小时或更长时间,仍然无法识别我的数据存储中的 schema。为何爬网程序要花费这么长时间,我怎样才能提速?

简短描述

以下是导致爬网程序长时间运行的一些常见原因:

  • 频繁添加新数据:在第一次运行爬网程序期间,爬网程序会读取每个文件的第一个兆字节来推断 schema。 在后续爬网程序运行期间,爬网程序会列出目标中的文件(包括第一次运行时爬取的文件),并读取新文件的第一个兆字节。爬网程序不会读取之前爬网程序运行期间已读取的文件。这意味着后续爬网程序运行速度通常更快。但是,当您在每次爬网程序运行期间向数据存储中添加大量文件或文件夹时,每次运行时间都会增加。
  • 爬取压缩文件:压缩文件需要更长时间来爬取。这是因为爬网程序必须下载该文件并将其解压,然后才能读取第一个兆字节或列出文件。
    注意:对于 Apache Parquet、Apache Avro 和 Apache Orc 文件,爬网程序不会爬取第一个兆字节。爬网程序反而会读取存储在每个文件中的元数据。

解决方法

在开始进行故障排除之前,请考虑下您是否需要运行爬网程序。除非您需要在 AWS Glue 数据目录中创建表,并在 ETL 作业或下游服务(如 Amazon Athena)中使用该表,否则不需要运行爬网程序。对于 ETL 作业,您可以使用 from_options 直接从数据存储中读取数据,并在 DynamicFrame 上使用转换。当您执行此操作时,无需在 ETL 管道中运行爬网程序。如果您确定爬网程序适用于您的使用案例,请使用以下一种或多种方法来减少爬网程序运行时间。

使用排除模式

排除模式会指示爬网程序跳过某些文件或路径。排除模式减少了爬网程序必须列出的文件数量,这意味着爬网程序的运行速度会更快。例如,使用排除模式可排除元文件和已爬取的文件。有关更多信息(包括排除模式示例),请参阅包含模式和排除模式

运行多个爬网程序

与其在整个数据存储中运行一个爬网程序,不如考虑运行多个爬网程序。短时间运行多个爬网程序比长时间运行一个爬网程序更好。例如,假设您要按年对数据进行分区,并且每个分区都包含大量数据。如果在每个分区(每年)运行不同的爬网程序,则爬网程序的完成速度会更快。

合并较小的文件以创建较大的文件

爬取大量小文件要比爬取少量大文件花更多时间。这是因为爬网程序必须列出每个文件,并且必须读取每个新文件的第一个兆字节。