web-dev-qa-db-ja.com

AWS Kinesisのパーティションキーとは何ですか?

私はAWS Kinesisについて読んでいました。次のプログラムでは、TestStreamという名前のストリームにデータを書き込みます。このコードを10回実行し、10個のレコードをストリームに挿入しました。

var params = {
    Data: 'More Sample data into the test stream ...',
    PartitionKey: 'TestKey_1',
    StreamName: 'TestStream'
};

kinesis.putRecord(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});

すべてのレコードが正常に挿入されました。ここでpartition keyとはどういう意味ですか?バックグラウンドで何をしていますか? ドキュメント を読みましたが、その意味がわかりませんでした。

24
Suhail Gupta

パーティションキーは、ストリームに複数のシャードがある場合にのみ重要です(ただし、常に必要です)。 KinesisはパーティションキーのMD5ハッシュを計算して、どのシャードにレコードを保存するかを決定します(ストリームを記述する場合、シャードの説明の一部としてハッシュ範囲が表示されます)。

なぜこれが重要なのでしょうか?

各断片は、1,000レコードおよび/または1秒あたり1 MBのみを受け入れます( PutRecord docを参照)。このレートよりも速い速度で単一のシャードに書き込むと、ProvisionedThroughputExceededExceptionが得られます。

複数のシャードを使用する場合、この制限をスケーリングします。4つのシャードは、4,000レコードおよび/または4 MB /秒を提供します。もちろん、注意点があります。

最大のものは、異なるパーティションキーを使用する必要があることです。すべてのレコードが同じパーティションキーを使用する場合、それらはすべて同じハッシュ値を持つため、単一のシャードに書き込みを行っています。これを解決する方法はアプリケーションによって異なります。複数のプロセスから作成している場合は、プロセスID、サーバーのIPアドレス、またはホスト名を使用すれば十分です。単一のプロセスから記述している場合は、レコードに含まれる情報(一意のレコードIDなど)を使用するか、ランダムな文字列を生成できます。

2番目の注意点は、パーティションキーが合計書き込みサイズに対してカウントされ、ストリームに格納されることです。したがって、レコード内のテキストコンポーネントを使用することで、おそらく適切なランダム性を得ることができますが、スペースを浪費することになります。一方、ランダムなテキストコンポーネントがある場合、それから独自のハッシュを計算し、パーティションキーのハッシュを文字列化できます。

最後に、 PutRecords を使用している場合(大量のデータを書き込む場合)、リクエスト内の個々のレコードは拒否され、他のレコードは受け入れられます。これは、これらのレコードがすでに書き込み制限にあるシャードに移動したために発生し、(遅延後に)再送信する必要があります。

35
kdgregory

受け入れられた回答は、パーティションキーとは何か、およびそれらがKinesisで何に使用されるのかを説明します(どのシャードにデータを送信するかを決定するため)。残念ながら、そもそもパーティションキーが必要な理由は説明されていません。

理論的には、AWSは各レコードに対してランダムなパーティションキーを作成し、ほぼ完璧な広がりをもたらします。

パーティションが使用される本当の理由は、「順序付け/ストリーミング」のためです。 Kinesisは、各シャードの順序(シーケンス番号)を維持します。

つまり、Xをストリーミングし、その後YをシャードZにストリーミングすることにより、XがYの前にストリームからプルされることが保証されます(すべてのシャードからレコードをプルする場合)。一方、Xを共有Z1にストリーミングし、その後YをシャードZ2にストリーミングすることにより、順序付けは保証されません(すべてのシャードからレコードをプルする場合)。 YはXの前に確実にプルされます。

シャードの「ストリーミング」機能は、多くの場合に役立ちます。

(たとえば、ユーザー名と映画名をパーティションキーとして使用して映画をユーザーにストリーミングする動画サービス)。

(たとえば、ユーザーのグループからのイベントのストリームで作業し、集計を適用します)。

順序付け(ストリーミング)が不要な場合は、ランダムパーティションキーを生成するだけで十分です。

0
Tomer