我需要能够在AWS Kinesis Firehose中暂停一个流。
当我需要执行需要重新创建表的模式更改时(例如,更改sortkey),我需要它。
这些更改通常需要创建一个新表,将行插入新表,删除原始表并将新表重命名为原始名称。执行此操作将导致丢失在此过程中流式传输的行。
我可以考虑两个解决方法:
在声明中,这两种解决方法都不是最佳做法。
有更好的解决方案吗? 我的解决方案是如何发布的?
答案 0 :(得分:2)
我遇到了同样的问题并做了以下事情。注意:要使此方法起作用,您必须在从Kinesis摄取Redshift的事件中加上时间戳(下面的答案为created_at
)。
table1
是您已有的表,Kinesis正在从firehose1
向其转储事件。 firehose2
,将事件转储到新表table2
,该表与table1
具有相同的架构。 table2
中登陆,且max(created_at)
中的table1
小于min(created_at)
中的table2
,请删除firehose1
}。我们现在可以确保不会丢失任何数据,因为table1
和table2
之间已经存在重叠。table3
具有相同架构的表table1
。将所有活动从table1
复制到table3
。table1
并重新创建它,这次使用排序键。firehose1
以继续将事件转储到table1
。table1
登陆,请确认min(created_at)
中的table1
小于max(created_at)
中的table2
。如果是这样,请删除firehose2
。table2
的{{1}}的{{1}}严格大于created_at
max(created_at)
,table3
min(created_at)
严格小于table1
的所有活动1}}。如果您的系统允许具有相同时间戳的事件,则此步骤中可能会出现重复项。table1
复制回新的table3
。编辑:如果您使用table1
将table3
重命名为alter table
,然后将table1
置于新table1_old
之上,则可以避免使用table2
}。