

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

# リシャーディングアクションを完了する
<a name="kinesis-using-sdk-java-after-resharding"></a>

Amazon Kinesis Data Streams でリシャーディングの手順が終了し、通常のレコード処理を再開する前に必要な手順や検討事項があります。以下のセクションでは、これらについて説明します。

**Topics**
+ [

## ストリームが再度アクティブになるまで待機する
](#kinesis-using-sdk-java-resharding-wait-until-active)
+ [

## リシャーディング後のデータのルーティング、データの永続化、シャードの状態を考慮する
](#kinesis-using-sdk-java-resharding-data-routing)

## ストリームが再度アクティブになるまで待機する
<a name="kinesis-using-sdk-java-resharding-wait-until-active"></a>

リシャーディングオペレーションとして `splitShard` または `mergeShards` のいずれかを呼び出した後、ストリームが再びアクティブになるまで待機する必要があります。使用するコードは、[ストリームの作成](kinesis-using-sdk-java-create-stream.md)後にストリームがアクティブになるまで待機する場合のものと同じです。コードは次のとおりです。

```
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest();
describeStreamRequest.setStreamName( myStreamName );

long startTime = System.currentTimeMillis();
long endTime = startTime + ( 10 * 60 * 1000 );
while ( System.currentTimeMillis() < endTime ) 
{
  try {
    Thread.sleep(20 * 1000);
  } 
  catch ( Exception e ) {}
  
  try {
    DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest );
    String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus();
    if ( streamStatus.equals( "ACTIVE" ) ) {
      break;
    }
   //
    // sleep for one second
    //
    try {
      Thread.sleep( 1000 );
    }
    catch ( Exception e ) {}
  }
  catch ( ResourceNotFoundException e ) {}
}
if ( System.currentTimeMillis() >= endTime ) 
{
  throw new RuntimeException( "Stream " + myStreamName + " never went active" );
}
```

## リシャーディング後のデータのルーティング、データの永続化、シャードの状態を考慮する
<a name="kinesis-using-sdk-java-resharding-data-routing"></a>

Kinesis Data Streams は、リアルタイムのデータストリーミングサービスです。アプリケーションは、データがストリーム内のシャードを継続的に流れることを前提とする必要があります。リシャーディングすると、親シャードに流れていたデータレコードは、データレコードのパーティションキーがマッピングされるハッシュキー値に基づいて、子シャードに流れるように再ルーティングされます。ただし、リシャーディング前に親シャードにあったデータレコードはすべて、それらのシャードに残ります。リシャーディング後に親シャードが失われることはありません。それらのシャードはリシャーディング前に格納されていたデータと共に保持されます。親シャードのデータレコードには、Kinesis Data Streams API の [`getShardIterator` および `getRecords`](developing-consumers-with-sdk.md#kinesis-using-sdk-java-get-data) オペレーションを使用するか、Kinesis Client Library を介してアクセスできます。

**注記**  
データレコードは、現在の保持期間にストリームを追加した時間からアクセスできます。これは、その期間内のストリームのシャードの変更に関係なく当てはまります。ストリームの保持期間の詳細については、[データ保持期間を変更する](kinesis-extended-retention.md)を参照してください。

リシャーディングの過程で、親シャードは `OPEN` 状態から `CLOSED` 状態に、さらに `EXPIRED` 状態へと移行します。
+  **OPEN**: リシャーディングオペレーションに先立って、親シャードは `OPEN` 状態にあります。つまり、データレコードはシャードに追加したり、シャードから取得したりできます。
+  **CLOSED**: リシャーディングオペレーション後に、親シャードは `CLOSED` 状態に移行します。つまり、データレコードはシャードに追加されなくなります。このシャードに追加されることになっていたデータレコードは、子シャードに追加されるようになります。ただし、データレコードは引き続き、制限された時間内にシャードから取得できます。
+  **EXPIRED**: ストリーム保持期間の有効期限が切れると、親シャードのすべてのデータレコードが期限切れとなり、アクセスできなくなります。この時点で、シャード自体は `EXPIRED` 状態に移行します。`getStreamDescription().getShards` を呼び出してストリーム内のシャードを列挙しても、返されるシャードのリストには 状態のシャードは含まれません。`EXPIRED`ストリームの保持期間の詳細については、[データ保持期間を変更する](kinesis-extended-retention.md)を参照してください。

リシャーディング後、ストリームが再び `ACTIVE` 状態になるとすぐに、子シャードからのデータの読み取りを開始できます。ただし、リシャーディング後に残った親シャードには、リシャーディング前にストリームに追加されてまだ読み取られていないデータがそのまま格納されている可能性があります。親シャードからすべてのデータを読み取る前に、子シャードからデータを読み取った場合は、特定のハッシュキーが原因で、読み取ったデータがデータレコードのシーケンス番号に基づいた順序に並ばない可能性があります。したがって、データの順序が重要である場合は、リシャーディング後そのデータを使い切るまで、親シャードからのデータの読み取りを続行する必要があります。子シャードからのデータの読み取りは必ずその後で開始してください。`getRecordsResult.getNextShardIterator` が を返した場合は、親シャード内のすべてのデータを読み取ったということです。`null`