本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
合并两个分片
分片合并操作使用两个指定分片并将它们合并为一个分片。在合并后,单个子分片将收到两个父分片所包含的所有哈希键值的数据。
分片相邻
要合并两个分片,分片必须相邻。如果两个分片的哈希键范围联合构成一个无间断的连续集,则认为两个分片相邻。例如,假设您有两个分片,一个分片的哈希键范围为 276...381,另一个分片的哈希键范围为 382...454。您可以将这两个分片合并为一个分片,其哈希键范围为 276...454。
另举一例,假设您有两个分片,一个分片的哈希键范围为 276...381,另一个分片的哈希键范围为 455...560。您无法合并这两个分片,因为这两个分片之间有一个或多个哈希键位于 382...454 范围的分片。
流中所有OPEN
分片的集合(作为一个组)始终跨越整个哈希键值范围。MD5有关分片状态(例如 CLOSED
)的更多信息,请参阅 重新分片之后考虑数据路由、数据保留和分片状态。
要标识作为合并候选的分片,您应筛选出处于 CLOSED
状态的所有分片。状态为 OPEN
(也就是非 CLOSED
)的分片的结尾序列号为 null
。您可使用以下命令测试此结束序列号:
if( null == shard.getSequenceNumberRange().getEndingSequenceNumber() ) { // Shard is OPEN, so it is a possible candidate to be merged. }
在筛选出已关闭分片后,按每个分片支持的最高哈希键值对剩余分片进行排序。您可使用以下命令检索此值:
shard.getHashKeyRange().getEndingHashKey();
如果两个分片在这个经过筛选和排序的列表中相邻,则可合并它们。
合并操作的代码
以下代码可合并两个分片。此代码假定 myStreamName
包含您的流名称并且对象变量 shard1
和 shard2
包含要合并的两个相邻分片。
为进行合并操作,首先实例化一个新的 mergeShardsRequest
对象。使用 setStreamName
方法指定流名称。然后使用 setShardToMerge
和 setAdjacentShardToMerge
方法指定要合并的两个分片。最后,对 Kinesis Data Streams 客户端调用 mergeShards
方法以执行此操作。
MergeShardsRequest mergeShardsRequest = new MergeShardsRequest(); mergeShardsRequest.setStreamName(myStreamName); mergeShardsRequest.setShardToMerge(shard1.getShardId()); mergeShardsRequest.setAdjacentShardToMerge(shard2.getShardId()); client.mergeShards(mergeShardsRequest);
等待流再次变为活动状态中演示了此过程之后的第一步。