使用作业书签跟踪已处理的数据 - AWS Glue

使用作业书签跟踪已处理的数据

AWS Glue 通过保存作业运行的状态信息来跟踪上次运行 ETL 作业期间已处理的数据。此持久状态信息称为作业书签。作业书签可帮助 AWS Glue 维护状态信息,并可防止重新处理旧数据。有了作业书签,您可以在按照计划的时间间隔重新运行时处理新数据。作业书签包含作业的各种元素的状态,如源、转换和目标。例如,您的 ETL 任务可能会读取 Amazon S3 文件中的新分区。AWS Glue 跟踪任务已成功处理哪些分区,以防止任务的目标数据存储中出现重复处理和重复数据。

为 JDBC 数据源、关系化转换和一些 Amazon Simple Storage Service(Amazon S3)源实施了任务书签。下表列出了 AWS Glue 支持任务书签的 Amazon S3 源格式。

AWS Glue 版本 Amazon S3 源格式
版本 0.9 JSON、CSV、Apache Avro、XML
版本 1.0 及更高版本 JSON、CSV、Apache Avro、XML、Parquet、ORC

有关 AWS Glue 版本的信息,请参阅定义 Spark 作业的作业属性

通过 AWS Glue 脚本访问作业书签功能时,还具有其他功能。浏览生成的脚本时,您可能会看到与此功能相关的转换上下文。有关更多信息,请参阅 使用作业书签

在 AWS Glue 中使用作业书签

在启动作业时,作业书签选项作为参数传递。下表描述了在 AWS Glue 控制台中用于设置任务书签的选项。

作业书签 描述
Enable 使作业在运行后更新状态,以跟踪之前处理的数据。如果作业的源支持作业书签,它将跟踪已处理的数据,当作业运行时,它将处理自上一检查点以来的新数据。
禁用 不使用作业书签,作业始终处理整个数据集。您负责管理上一个作业运行的输出。这是默认模式。
Pause

处理上次成功运行以来的增量数据或以下子选项标识的范围内的数据,无需更新最后一个书签的状态。您负责管理上一个作业运行的输出。这两个子选项是:

  • job-bookmark-from <from-value> 是运行 ID,它表示直到最后一次成功运行之前处理的所有输入,包括指定的运行 ID。对应的输入将被忽略。

  • job-bookmark-to <to-value> 是运行 ID,它表示直到最后一次成功运行之前处理的所有输入,包括指定的运行 ID。由作业处理对应的输入,不包括 <from-value> 标识的输入。任何晚于此输入的输入也会被排除在外,不进行处理。

指定此选项集时,作业书签状态不更新。

子选项是可选的,但是使用时,需要提供两个子选项。

有关命令行上传递给作业的参数的详细信息(特别是关于作业书签的详细信息),请参阅在 AWS Glue 作业中使用作业参数

对于 Amazon S3 输入源,AWS Glue 任务书签将通过检查对象的上次修改时间来验证哪些对象需要重新处理。如果您的输入源数据在上次作业运行后已修改,则再次运行作业时将重新处理这些文件。

对于 JDBC 源,以下规则将适用:

  • 对于每个表,AWS Glue 使用一个或多个列作为书签键来确定新数据和处理过的数据。书签键将合并成一个复合键。

  • AWS Glue 默认情况下将使用主键作为书签键,前提是它按顺序递增或递减(没有间隙)。

  • 可以指定要用作 AWS Glue 脚本中书签键的列。有关在 AWS Glue 脚本模式中使用作业书签的更多信息,请参阅 使用作业书签

  • AWS Glue 不支持使用区分大小写的列作为作业书签键。

您可以将您的 AWS Glue Spark ETL 任务的任务书签倒回之前的任何任务运行。您可以通过将您的作业书签倒回之前的任何作业运行来更好的支持数据回填场景,从而使后续作业运行只再处理已做上标签的作业运行的数据。

如果您打算使用相同的作业重新处理所有数据,请重置作业书签。要重置作业书签状态,请使用 AWS Glue 控制台、ResetJobBookmark 操作(Python:reset_job_bookmark) API 操作或 AWS CLI。例如,使用 AWS CLI 输入以下命令:

aws glue reset-job-bookmark --job-name my-job-name

在回放或重置书签时,AWS Glue 不会清除目标文件,因为可能有多个目标,并且不会使用任务书签跟踪目标。仅使用任务书签跟踪源文件。在回卷和重新处理源文件时,您可以创建不同的输出目标,以避免输出中出现重复数据。

AWS Glue 按作业跟踪作业书签。如果您删除作业,作业书签也会被删除。

有些情况下,您可能已启用 AWS Glue 作业书签,但您的 ETL 作业还在重新处理早期运行中已处理的数据。有关解决该错误的常见原因的信息,请参阅排查 Spark 错误

作业书签功能的操作详细信息

本节将介绍有关使用作业书签的更多操作详情。

作业书签存储作业的状态。每个状态实例的键由作业名称和版本号组成。当脚本调用 job.init 时,它将检索其状态并始终获取最新版本。在一个状态中,有多个状态元素,这些元素特定于脚本中的每个源、转换和接收器实例。这些状态元素由附加至脚本中相应元素(源、转换或接收器)的转换上下文来标识。从用户脚本中调用 job.commit 时,将自动保存状态元素。脚本将从参数中获取作业书签的作业名称和控制选项。

作业书签中的状态元素是特定于源、转换或接收器的数据。例如,假设您要从上游任务或进程不断写入数据的 Amazon S3 位置读取增量数据。在这种情况下,脚本必须确定目前已处理的内容。Amazon S3 源的任务书签实现将保存信息,这样,当任务再次运行时,它可以使用保存的信息仅筛选新对象并重新计算任务的下次运行状态。时间戳用于筛选新文件。

除了状态元素外,作业书签还有运行编号尝试次数版本号。运行编号跟踪作业的运行,尝试次数记录作业运行的尝试次数。作业运行编号是随着每次成功运行单调增加的数字。尝试次数跟踪每次运行的尝试,仅在失败尝试后有运行时才增加。版本号单调增加并跟踪作业书签的更新。

在 AWS Glue 服务数据库中,所有转换的书签状态都作为键值对存储在一起:

{ "job_name" : ..., "run_id": ..., "run_number": .., "attempt_number": ... "states": { "transformation_ctx1" : { bookmark_state1 }, "transformation_ctx2" : { bookmark_state2 } } }
最佳实践

以下是使用作业书签的最佳实践。

  • 请勿在启用书签的情况下更改数据源属性。例如,假定 datasource0 指向 Simple Storage Service (Amazon S3) 输入路径 A,并且该任务从启用书签情况下运行数轮的源进行读取。如果您将 datasource0 的输入路径更改为 Simple Storage Service (Amazon S3) 路径 B 而未更改 transformation_ctx,则 AWS Glue 任务将使用存储的旧书签状态。这将导致丢失或跳过输入路径 B 中的文件,因为 AWS Glue 将假定这些文件在以前的运行中已经处理过。

  • 将目录表和书签搭配使用以实现更好的分区管理。书签既适用于来自数据目录的数据源,也适用于来自选项的数据源。但是,使用来自选项方法很难删除/添加新的分区。将目录表和爬网程序搭配使用可以提供更好的自动化,以跟踪新添加的分区并让您通过下推谓词灵活选择特定的分区。

  • 使用适合大型数据集的 AWS Glue Simple Storage Service (Amazon S3 文件列表器。书签将列出每个输入分区下的所有文件并进行筛选,因此,如果单个分区下的文件过多,书签可以运行到驱动程序 OOM 中。使用 AWS Glue Simple Storage Service (Amazon S3) 文件列表器,以避免一次在内存中列出所有文件。