亚马逊KCL检查点和修剪地平线

20
AWS KCL库中的检查点和修剪如何相关?
“处理启动、关闭和限流”文档页面表示: 默认情况下,KCL从流的末尾开始读取记录;也就是最近添加的记录。在这种配置下,如果数据生成应用程序在任何接收记录处理器运行之前向流添加记录,则这些记录在它们启动后不会被记录处理器读取。
要更改记录处理器的行为,使其始终从流的开头读取数据,请在Amazon Kinesis Streams应用程序的属性文件中设置以下值:
initialPositionInStream = TRIM_HORIZON
“使用Java开发Amazon Kinesis Client Library消费者”文档页面表示: Streams要求记录处理器跟踪已在分片中处理过的记录。KCL通过传递检查点器(IRecordProcessorCheckpointer)到processRecords来为您处理此跟踪。记录处理器调用此接口上的checkpoint方法来通知KCL它在处理分片中的记录方面进展如何。如果工作程序失败,KCL将利用此信息重新启动分片的处理,以达到已知处理过的记录的位置。
第一页似乎表明KCL从流的末尾恢复,第二页从已知的最后一个已处理记录(由RecordProcessor使用checkpointer标记为已处理)恢复。在我的情况下,我肯定需要从已知的最后一个已处理记录处重启。我需要将initialPositionInStream设置为TRIM_HORIZON吗?
3个回答

17
使用 Kinesis 流有两个选项,您可以读取最新的记录,或者从最旧的记录(TRIM_HORIZON)开始。
但是,一旦您启动了应用程序,它就会使用其检查点从停止位置开始读取。 您可以在 dynamodb 中看到这些检查点(通常表名与应用程序名称相同)。 因此,如果您重新启动应用程序,它通常会从停止的位置继续。
答案是否定的,您不需要将 initialPositionInStream 设置为 TRIM_HORIZON。

3
谢谢,实际上initialPositiionInStream用于确定如果没有检查点可用,则从哪个值开始启动? - Edmondo
谢谢您的答复,我希望它可以出现在官方文档中。我已经困惑了几天 :) - Ben Watson
这个检查点原则是特定于KCL还是也可以在Lambda中使用? - xtra

6
当您从Kinesis流中读取事件时,有4个选项:
TRIM_HORIZON - 在自动修剪之前仍在流程碎片中的最旧事件(默认为1天,但可以延长至7天)。如果要启动一个新应用程序以处理流中可用的所有记录,但需要一段时间才能赶上并开始实时处理事件,则将使用此选项。
LATEST - 流中最新的事件,并忽略所有过去的事件。如果您启动一个新应用程序,希望立即进行实时处理,则将使用此选项。
AT/AFTER_SEQUENCE_NUMBER - 序列号通常是您在处理事件时保持的检查点。这些检查点允许您可靠地处理事件,即使读取器故障或者您想要更新其版本并继续处理所有事件而不会丢失任何事件。AT/AFTER之间的区别基于您的检查点时间,在成功处理事件之前或之后。
请注意,这是唯一的特定于碎片的选项,因为所有其他选项都是流全局的。当您使用KCL时,它会管理一个DynamoDB表,该表针对每个具有该碎片的“当前”序列号的记录应用程序。
AT_TIMESTAMP - 事件放入流中的估计时间。如果您想要基于其时间戳查找特定事件以进行处理,则将使用此选项。例如,当您知道在特定时间在服务中发生了真实事件时,可以开发一个应用程序来处理这些特定事件,即使您没有序列号。
在此处查看Kinesis文档中的更多详细信息:https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html

我有点困惑,这是否适用于本地API访问而不是Kcl使用? - Edmondo
1
KCL是一个实现API的库,它对流的控制不超过您可以直接通过API获取的内容。 KCL正在添加应用程序管理方面和在DynamoDB中使用序列号进行检查点功能。 - Guy

3
你应该使用"TRIM_HORIZON"。它只会在你的应用程序第一次从流中读取记录时生效。之后,它将从最后已知位置继续。

1
你对此100%确定吗?我并不那么确定。 - 1977

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接