Amazon Kinesis Firehose - 如何暂停流?

时间:2017-08-22 23:12:22

标签: amazon-kinesis-firehose

我需要能够在AWS Kinesis Firehose中暂停一个流。

当我需要执行需要重新创建表的模式更改时(例如,更改sortkey),我需要它。

这些更改通常需要创建一个新表,将行插入新表,删除原始表并将新表重命名为原始名称。执行此操作将导致丢失在此过程中流式传输的行。

我可以考虑两个解决方法:

  1. 在处理过程中重命名原始表,然后强制firehose失败,然后重试,直到您进行更改并重命名为止。如果重试机制足够防弹,我不会起诉。
  2. 在负载之间定义几个小时的时间间隔(根据需要),然后观看“COPY”查询,并在COPY之后执行与#1相同的操作。这比#1更安全。
  3. 在声明中,这两种解决方法都不是最佳做法。

    有更好的解决方案吗? 我的解决方案是如何发布的?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题并做了以下事情。注意:要使此方法起作用,您必须在从Kinesis摄取Redshift的事件中加上时间戳(下面的答案为created_at)。

  1. 假设table1是您已有的表,Kinesis正在从firehose1向其转储事件。
  2. 创建一个新的firehose firehose2,将事件转储到新表table2,该表与table1具有相同的架构。
  3. 确认事件已在table2中登陆,且max(created_at)中的table1小于min(created_at)中的table2,请删除firehose1 }。我们现在可以确保不会丢失任何数据,因为table1table2之间已经存在重叠。
  4. 创建一个与table3具有相同架构的表table1。将所有活动从table1复制到table3
  5. 删除table1并重新创建它,这次使用排序键。
  6. 重新创建firehose1以继续将事件转储到table1
  7. 一旦事件再次开始在table1登陆,请确认min(created_at)中的table1小于max(created_at)中的table2。如果是这样,请删除firehose2
  8. 将来自table2的{​​{1}}的{​​{1}}严格大于created_at max(created_at)table3 min(created_at)严格小于table1的所有活动1}}。如果您的系统允许具有相同时间戳的事件,则此步骤中可能会出现重复项。
  9. 将所有活动从table1复制回新的table3
  10. 编辑:如果您使用table1table3重命名为alter table,然后将table1置于新table1_old之上,则可以避免使用table2 }。