亚马逊Kinesis Firehose - 如何暂停流?

3
我需要在AWS Kinesis Firehose中暂停流的能力。
当我需要执行需要重新创建表(例如更改排序键)的模式更改时,我需要它。
这些更改通常需要创建一个新表,将行插入到新表中,然后删除原始表并将新表重命名为原始名称。 这样做会导致在此过程中流传输的行丢失。
我可以想到两种解决方法:
1. 在过程开始时重命名原始表,然后强制firehose失败,并重试直到您进行更改并将其重新命名回来。 我不确定重试机制是否足够强大以实现此目的。 2. 在负载之间定义几小时的时间间隔(根据需要),然后监视“COPY”查询,并在COPY之后立即执行与#1相同的操作。 这比#1更加安全。
这两种解决方案都没有达到最佳实践的水平。
有更好的解决方案吗?我的解决方案有多可靠?

寻找最小阻力的方法,或者更好地表述为“我能做的最少工作量是多少”。我觉得解决方法1听起来不错,至少对于你的例子,其中模式不会以任何需要更改传入记录的方式改变。我们计划调整群集大小,这必将涉及一些停机时间。值得注意的是,如果Firehose在重试限制之后仍然无法成功,将向S3写入一个清单文件,详细说明无法加载的数据,因此一旦停机时间结束,使用这些清单运行adhoc复制应该很容易。 - Garlando
2个回答

3
我遇到了同样的问题,并采取了以下措施。注意:为使此方法有效,您必须在从Kinesis注入到Redshift中的事件上具有时间戳(下面答案中的created_at)。
  1. 假设table1是您已经拥有的表,而Kinesis正在将事件从firehose1倾倒到其中。
  2. 创建一个新的firehose,firehose2,将事件转储到一个新表table2中,该表与table1具有相同的模式。
  3. 一旦您可以确认事件着陆table2,并且table1中的max(created_at)小于table2中的min(created_at),则删除firehose1。我们现在可以确定不会丢失任何数据,因为table1table2之间已经存在重叠部分。
  4. 创建一个与table1具有相同架构的表table3。将所有事件从table1复制到table3中。
  5. 删除table1并重新创建它,这次带有排序键。
  6. 重新创建firehose1以继续将事件倾倒到table1中。
  7. 一旦事件再次开始着陆table1,请确认table1中的min(created_at)小于table2中的max(created_at)。当这是真的时,删除firehose2
  8. 将所有created_at严格大于table3中的max(created_at)并且严格小于table1中的min(created_at)的事件从table2复制到table1。如果您的系统允许具有相同时间戳的事件,则可能会在此步骤中引入重复项。
  9. 将所有事件从table3复制回新的table1
编辑:如果您使用alter tabletable1重命名为table1_old,然后使table2成为新的table1,则可以避免使用table3

这种方法也可以进行调整,以处理架构更重要的更改的情况,例如传入数据也发生了更改。 - Garlando

0

由于AWS Kinesis Stream可以存储数据(默认为1天,最长可达一年但超过24小时将会产生额外费用),我建议删除Delivery Stream(Kinesis Firehose),一旦完成升级/维护工作,您可以轻松地重新配置一个新的Delivery Stream。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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