如何在AWS Kinesis中使用ExplicitHashKey进行循环流分配

时间:2017-06-16 16:03:35

标签: amazon-kinesis amazon-kcl

我正在尝试通过Amazon Kinesis(每秒订购10,000点)抽取大量数据。

为了通过我的分片每秒最大化记录,我想通过分片循环我的请求(我的应用程序逻辑不关心单个消息的分片是什么)。

对于我发送给PutRecords端点的列表中的消息,我似乎可以使用ExplicitHashKey参数执行此操作 - 但是,Amazon文档实际上并没有描述如何使用ExplicitHashKey,除了以下的oracular语句: / p>

http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html

  

Records数组中的每条记录都可能包含一个可选参数,   ExplicitHashKey,它覆盖分区键到分片映射。   此参数允许数据生成者明确确定   存储记录的分片。有关更多信息,请参阅添加   Amazon Kinesis Streams中包含PutRecords的多条记录   开发者指南。

(上面文档中的声明有一个链接到文档的另一部分,它根本不讨论ExplicitHashKeys)。

有没有办法使用ExplicitHashKey在分片中循环数据?

参数的有效值是什么?

1 个答案:

答案 0 :(得分:7)

为每个分片分配一个从0到2 ^ 128 - 1的128位整数的连续范围。

您可以通过AWS CLI找到分配给流中给定分片的整数范围:

aws kinesis describe-stream --stream-name name-of-your-stream

输出如下:

{
    "StreamDescription": {
        "RetentionPeriodHours": 24, 
        "StreamStatus": "ACTIVE", 
        "StreamName": "name-of-your-stream", 
        "StreamARN": "arn:aws:kinesis:us-west-2:your-stream-info", 
        "Shards": [
           {
                "ShardId": "shardId-000000000113", 
                "HashKeyRange": {
                    "EndingHashKey": "14794885518301672324494548149207313541", 
                    "StartingHashKey": "0"
                }, 
                "ParentShardId": "shardId-000000000061", 
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49574208032121771421311268772132530603758174814974510866"
                }
            }, 
           { ... more shards ... }
       ...

您可以将记录的ExplicitHashKey设置为分片的哈希键范围内任何位置的整数值的字符串十进制表示,以强制将其发送到该特定分片。

请注意,由于您的分片上的先前合并和拆分操作,可能会有许多分片重叠HashKeyRanges。当前打开的分片是没有SequenceNumberRange.EndingSequenceNumber元素的分片。

您可以通过识别每个感兴趣的分片范围内的128位整数来循环一组分片中的循环请求,并循环将该数字的字符串表示分配给每个记录的ExplicitHashKey。 / p>

作为旁注,您还可以计算给定PartitionKey将评估的哈希值:

  1. 计算分区键的MD5总和。
  2. 将MD5和解释为十六进制数并将其转换为基数10.这将是该分区键的哈希键。然后,您可以查找散列键所属的分片。