6

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

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

看来我可以使用 ExplicitHashKey 参数为我发送到 PutRecords 端点的列表中的消息执行此操作 - 但是亚马逊文档实际上并没有描述如何使用 ExplicitHashKey,除了以下的 oracle 声明:

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

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

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

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

参数的有效值是多少?

4

1 回答 1

11

每个分片都被分配一个从 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.

作为旁注,您还可以通过以下方式计算给定的哈希值PartitionKey

  1. 计算分区键的 MD5 和。
  2. 将 MD5 和解释为十六进制数并将其转换为基数 10。这将是该分区键的哈希键。然后,您可以查找该哈希键属于哪个分片。
于 2017-06-16T17:52:22.393 回答