当前位置: 首页 > 知识库问答 >
问题:

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

谯志诚
2023-03-14

我正试图通过Amazon Kinesis(每秒订购10000点)传输大量数据。

为了通过我的碎片最大化每秒的记录,我想在碎片上循环我的请求(我的应用程序逻辑不关心碎片的单个消息会传递到哪里)。

看起来我可以使用我发送到PutRecordsendpoint的列表中的消息的ExplichHashKey参数来执行此操作-但是Amazon留档实际上并没有描述如何使用ExplichHashKey,除了以下的oracular语句:

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

Records数组中的每个记录可能包括一个可选参数ExplicitHashKey,该参数重写分区键到碎片的映射。此参数允许数据生产者明确确定存储记录的碎片。有关更多信息,请参阅《Amazon Kinesis Streams开发人员指南》中的“使用PutRecords添加多个记录”。

(上面文档中的语句有一个指向留档另一个部分的链接,该部分根本不讨论ExplwitHashKeys)。

有没有一种方法可以使用ExplicitHashKey在碎片之间循环数据?

参数的有效值是什么?

共有1个答案

万俟招
2023-03-14

每个碎片被分配一个从0到2^128-1的128位整数序列范围。

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

aws驱动描述流--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 ... }
       ...

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

请注意,由于先前对碎片进行了合并和拆分操作,可能有许多碎片具有重叠的HashKeyRanges。当前打开的碎片是没有SequenceNumberRange的碎片。EndingSequenceNumber元素。

您可以通过识别每个感兴趣的分片范围内的128位整数来在一组分片之间循环请求,并循环将该数字的字符串表示形式分配给每个记录的ExplwitHashKey

作为补充说明,您还可以通过以下方式计算给定分区键的哈希值:

  1. 计算分区键的MD5和
  2. 将MD5和解释为十六进制数,并将其转换为以10为基数。这将是该分区键的哈希键。然后,您可以查找该散列键属于哪个碎片
 类似资料:
  • 问题内容: 使用以下代码显示我的Twitter个人资料中的朋友列表。我想一次只加载一个特定的数字,例如20,然后在底部为第1-2-3-4-5页的页面提供分页链接(但是,除以限制) **更新**** 这项工作有效,只需要抵消从开始的输出即可。在想什么? 问题答案: 一个非常优雅的解决方案是使用:

  • 问题内容: 如何在bash for循环中使用变量?如果我只是使用标准的for循环,它会达到我的期望 这很好。它循环遍历4次,包括0到3,包括打印我的消息并将计数放在末尾。 当我使用以下for循环尝试相同的操作时,它似乎等于一个字符串,这不是我想要的。 输出: 我试过了 和 他们俩都不做我所需要的。希望有人可以帮助我。预先感谢bash专家对for循环的帮助。 问题答案: 一种方法是使用: 请注意 设

  • 问题内容: 假设我们尝试将可能引发检查异常的lambda应用于Java 8流: 这不会编译。 一种解决方法是将检查后的异常嵌套在其中,但是这会使以后的异常处理变得复杂,而且很丑陋: 另一种解决方法可能是转换限制功能,以普通的旧的foreach 循环是比较友好的检查的异常。 但是幼稚的方法失败了: 更新资料 为何在的地方贴了一个回答该问题的技巧。作为副答案本身并不能真正回答该问题。我认为这不足以使这

  • 机器人必须每隔60秒做一件事。我尝试使用create_task,但它不起作用(bot启动了,但什么也没发生)。如何实现这一点?

  • 问题内容: 当我在 while循环中 使用 try和catch 块时,我的程序有一个无限 循环 。 当我输入一个整数时,它运行良好并要求另一个输入,但是当我输入一个字符时,它将进入无穷循环。为什么会这样呢? 问题答案: 遇到无效输入时,由于nextInt()不使用无效令牌,因此程序进入无限循环。因此,导致该异常的任何令牌都将保留在该位置,并在下次尝试使用nextInt()时继续引发异常。 可以通过

  • 本文向大家介绍如何在PowerShell foreach并行循环中使用PSCustomObject?,包括了如何在PowerShell foreach并行循环中使用PSCustomObject?的使用技巧和注意事项,需要的朋友参考一下 要在Foreach并行循环内使用PSCustomObject ,我们首先需要考虑如何在循环内使用变量。 因此,让我们看看是否可以在$out变量中存储或更改值。 示例