キネシスデータストリームシャード間の一様データ分布



概要


Kinesisシャードの間でデータを分配する方法についてですが、前進する前にKinesisデータストリームの基本的理解を理解するために、kinesis documentationを通して進みます.私は、Keresisデータストリームのための消費者としてラムダを使用したので、私はラムダの文脈でものを議論します.
KinesisストリームとAWSラムダについてこのarticleを読んでください.

問題


キネシスデータストリームはshardsの集合です.各シャードはデータレコードのシーケンスを持っています.各々のデータレコードは、Kineesisデータストリームにより割り当てられるsequence numberを有する.
Kenesisストリームパーティションキーにレコードを置くには、各レコードに対して指定する必要があります.MD 5ハッシュ関数は、128ビットの整数値にパーティションキーをマップし、シャドーのハッシュキー範囲を使用して関連データレコードをシャードにマップするために使用されます.

パーティションキーがランダムでない場合は問題が発生し、MD 5ハッシュ関数はレコードのパーティションキーを特定のshardのハッシュキー範囲にマッピングします.

上記のイメージにおいて、shard - chen 2が他のshardより多くの記録を持っているのを見ることができます.
メッセージの不均一な分布はラムダのイテレータ年齢を増加させ、データを失う可能性がある.保持期間を増やすと、キネシスの操作コストが増加する.
Iterator age is the time between when the last record in a batch was recorded and when Lambda reads the record. 

Iterator age depends on other parameters, such as Lambda function execution duration, shard count, and batch size. 

For more information, see AWS Lambda CloudWatch Metrics.

Kinesis can retain data up to 7 days and the default retention period is 1 day.

解決策


シャドーのデータを一様に分配する方法は二つあります.
  • 各レコードにユニークなパーティションキーを割り当てます.この方法では、一様な配布のより良いチャンスがあります.
  • は各レコードにExplicitHashKeyを割り当てます.このようにして、パーティションキーは必要ありません、そして、我々はメッセージが我々の選択のシャードでダンプされることを確認することができます.Pythonでは、shards情報を得るためにlist shardsメソッドを使用できます.この形式で情報を返します.
  • {  "Shards": [
                {
                    "ShardId": "shardId-000000000000",
                    "HashKeyRange": {
                        "StartingHashKey": "0",
                        "EndingHashKey": "170141183460469231371588410571"
                    },
                    "SequenceNumberRange": {
                        "StartingSequenceNumber": "496103516369698317099491240188243335841720557371394"
                    }
                },
                {
                    "ShardId": "shardId-000000000001",
                    "HashKeyRange": {
                        "StartingHashKey": "170141183460469231371588410571",
                        "EndingHashKey": "340282asdasd6337460743176821144"
                    },
                    "SequenceNumberRange": {
                        "StartingSequenceNumber": "49610351636992132529573630114381723961608490082063351826"
                    }
                },
                {
                    "ShardId": "shardId-000000000002",
                    "HashKeyRange": {
                        "StartingHashKey": "34028236692093846346337460743176821145",
                        "EndingHashKey": "51042355038140769519506191114765231717"
                    },
                    "SequenceNumberRange": {
                        "StartingSequenceNumber": "49610351637014433274772160737523259679881138443569332258"
                    }
                }
            ]
    }
    
    各shardはハッシュキーの範囲を持っているので、その情報を使用することにより、シャードのstartinghashkeyとendinghashkeyの間にあるキーを生成できます.この手法を用いることにより、Kineesisデータストリームシャード間の一様なデータ分布を達成するために、各シャードに1つずつレコードを置くラウンドロビンアルゴリズムを実装することができます.

    最後の思考


    この話で議論されるアプローチはキネシスシャードの間の均一なデータ配布を達成する1つの方法です.改善することができるか私が逃した何かについてのフィードバックを共有してください.ありがとう

    資源


    https://docs.aws.amazon.com/streams/latest/dev/introduction.html