Amazon Kinesis Data Streams
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

拆分分片

要拆分分片,您需要指定父分片中的哈希键值应如何重新分配到子分片。当您向流添加数据记录时,将基于哈希键值将数据记录分配给分片。哈希键值是您在向流添加数据记录的同时为数据记录指定的分区键的 MD5 哈希;具有相同分区键的数据记录也具有相同的哈希键值。

指定分片的可能的哈希键值构成一组有序的连续非负整数。此可能的哈希键值范围通过以下命令指定:

shard.getHashKeyRange().getStartingHashKey(); shard.getHashKeyRange().getEndingHashKey();

在拆分分片时,您指定此范围内的一个值。此哈希键值和所有较高的哈希键值将分配到其中一个子分片。所有较小的哈希键值将分配到另一子分片。

以下代码演示在所有子分片之间均匀地重新分配哈希键的分片拆分操作,基本上是将父分片一分为二。这只是一种可能的父分片划分方式。例如,您可拆分分片,以便父分片中下层三分之一的键分配给一个子分片,上层三分之二的键分配给另一子分片。但是,在许多应用程序中,将分片一分为二是一种很有效的方法。

此代码假定 myStreamName 包含您的流名称,对象变量 shard 包含要拆分的分片。首先实例化一个新的 splitShardRequest 对象并设置流名称和分片 ID。

SplitShardRequest splitShardRequest = new SplitShardRequest(); splitShardRequest.setStreamName(myStreamName); splitShardRequest.setShardToSplit(shard.getShardId());

确定位于分片中最低值和最高值的中间的哈希键值。这是将包含父分片中上半层哈希键的子分片的起始哈希键值。在 setNewStartingHashKey 方法中指定此值。您只需指定此值:Kinesis Data Streams 将会自动将低于此值的哈希键分配给拆分操作所创建的另一子分片。最后一步是对 Kinesis Data Streams 客户端调用 splitShard 方法。

BigInteger startingHashKey = new BigInteger(shard.getHashKeyRange().getStartingHashKey()); BigInteger endingHashKey = new BigInteger(shard.getHashKeyRange().getEndingHashKey()); String newStartingHashKey = startingHashKey.add(endingHashKey).divide(new BigInteger("2")).toString(); splitShardRequest.setNewStartingHashKey(newStartingHashKey); client.splitShard(splitShardRequest);

等待流再次变为活动状态中演示了此过程之后的第一步。