

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 合并两个分片
<a name="kinesis-using-sdk-java-resharding-merge"></a>

 分片合并操作使用两个指定分片并将它们合并为一个分片。在合并后，单个子分片将收到两个父分片所包含的所有哈希键值的数据。

**分片相邻**  
要合并两个分片，分片必须*相邻*。如果两个分片的哈希键范围联合构成一个无间断的连续集，则认为两个分片相邻。例如，假设您有两个分片，一个分片的哈希键范围为 276...381，另一个分片的哈希键范围为 382...454。您可以将这两个分片合并为一个分片，其哈希键范围为 276...454。

另举一例，假设您有两个分片，一个分片的哈希键范围为 276...381，另一个分片的哈希键范围为 455...560。您无法合并这两个分片，因为这两个分片之间有一个或多个哈希键位于 382...454 范围的分片。

流中所有`OPEN`分片的集合（作为一个组）始终跨越整个哈希键值范围。 MD5 有关分片状态（例如 `CLOSED`）的更多信息，请参阅 [重新分片之后考虑数据路由、数据保留和分片状态](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-data-routing)。

要标识作为合并候选的分片，您应筛选出处于 `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);
```

[等待流再次变为活动状态](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-wait-until-active)中演示了此过程之后的第一步。