

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 2 つのシャードを結合する
<a name="kinesis-using-sdk-java-resharding-merge"></a>

 シャードの結合オペレーションは、指定した 2 つのシャードを取得し、1 つシャードに組み合わせます。結合後、1 つの子シャードは 2 つの親シャードのすべてのハッシュキー値のデータを受け取ります。

**シャードの隣接**  
2 つのシャードを結合するには、シャードが*隣接*している必要があります。2 つのシャードのハッシュキー範囲が途切れておらず連続している場合、2 つのシャードは隣接していると考えられます。たとえば、2 つのシャードがあり、1 つのハッシュキー範囲が 276〜381、もう 1 つのハッシュキー範囲が 382〜454 であるとします。この 2 つのシャードは 1 つのシャードに結合可能であり、結合した場合のハッシュキー範囲は 276〜454 となります。

別の例として 2 つのシャードがあり、1 つのハッシュキー範囲が 276〜381、もう 1 つのハッシュキー範囲が 455〜560 であるとします。この 2 つのシャードは結合できません。これらの間に 1 つ以上のシャード (ハッシュキー範囲が 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.
}
```

CLOSED 状態のシャードを除外した後、各シャードでサポートされている最大ハッシュキー値で、残りのシャードを並べ替えます。以下のコード使用してこの値を取得できます。

```
shard.getHashKeyRange().getEndingHashKey();
```

 このフィルタリングして並び替えたリストで 2 つシャードが隣接している場合、それらのシャードは結合できます。

**結合オペレーションのコード**  
 以下のコードでは、2 つシャードを結合しています。`myStreamName` には、ストリームの名前が格納され、オブジェクト変数 `shard1` と `shard2` には、結合する 2 つの隣接するシャードが格納されるとします。

結合オペレーションの場合、新しい `mergeShardsRequest` オブジェクトをインスタンス化することから始めます。`setStreamName` メソッドでストリーム名を指定します。次に、`setShardToMerge` と `setAdjacentShardToMerge` のメソッドを使用して、結合する 2 つのシャードを指定します。最後に、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)に示されています。