AWS Kinesis 中的分区键是啥?

Posted

技术标签:

【中文标题】AWS Kinesis 中的分区键是啥?【英文标题】:What is partition key in AWS Kinesis all about?AWS Kinesis 中的分区键是什么? 【发布时间】:2018-07-02 03:58:33 【问题描述】:

我正在阅读有关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 在这里的真正含义是什么?它在后台做什么?我读了它的documentation,但不明白它的意思。

【问题讨论】:

【参考方案1】:

分区键仅在流中有多个分片时才重要(但它们始终是必需的)。 Kinesis 计算分区键的 MD5 哈希来决定在哪个分片上存储记录(如果您描述了流,您会看到哈希范围作为分片描述的一部分)。

那么为什么这很重要?

每个分片每秒只能接受 1,000 条记录和/或 1 MB(请参阅PutRecord doc)。如果您写入单个分片的速度超过此速率,您将获得ProvisionedThroughputExceededException

使用多个分片,您可以扩展此限制:4 个分片可以为您提供 4,000 条记录和/或每秒 4 MB。当然,也有一些注意事项。

最大的是必须使用不同的分区键。如果您的所有记录都使用相同的分区键,那么您仍在写入单个分片,因为它们都将具有相同的哈希值。如何解决这个问题取决于您的应用程序:如果您从多个进程写入,那么使用进程 ID、服务器的 IP 地址或主机名可能就足够了。如果您从单个进程写入,那么您可以使用记录中的信息(例如,唯一的记录 ID)或生成随机字符串。

第二个注意事项是分区键计入总写入大小,并存储在流中。因此,虽然您可以通过在记录中使用一些文本组件来获得良好的随机性,但您会浪费空间。另一方面,如果你有一些随机的文本组件,你可以从中计算出你自己的哈希值,然后将其字符串化为分区键。

最后,如果您使用PutRecords(如果您要写入大量数据,则应该这样做),请求中的个别记录可能会被拒绝,而其他记录可能会被接受。发生这种情况是因为这些记录进入了已达到写入限制的分片,您必须重新发送它们(延迟后)。

【讨论】:

分片可以容纳的数据有限制吗?如果我的应用程序中只有 1 个分区键但有 100 个分片怎么办? @SuhailGupta - 正如我所说,“你必须使用不同的分区键。”如果您对每条记录使用相同的分区键,那么每条记录都将转到单个分片,并且您将被限制为 1,000 条记录或该分片每秒 1 Mb 的限制。 每条记录使用不同的分区键插入是什么意思?为什么我要为每条记录使用相同的分区键? @SuhailGupta - 这回答了你的问题吗? 根据 AWS 文档,通常分区键的数量必须比可用的分片数量大得多。所以假设一个场景,我有 2 个可用的分片和 500 个传感器,每个传感器每秒都将 100 字节的数据推送到数据流,如果我使用 sensor-id 作为分区键,md5 哈希不会生成 500不同的价值观?那么这 500 个不同的值如何映射到两个创建的分片中的任何一个。我知道每个分片都有一个开始和结束哈希键,但是一旦创建分片就会分配。【参考方案2】:

接受的答案解释了什么是分区键以及它们在 Kinesis 中的用途(以决定将数据发送到哪个分片)。不幸的是,它没有解释为什么首先需要分区键。

理论上,AWS 可以为每条记录创建一个随机分区键,从而实现近乎完美的传播。

使用分区的真正原因是“排序/流式传输”。 Kinesis 维护每个分片的顺序(序列号)。

换句话说,通过将 X 和之后的 Y 流式传输到分片 Z,可以保证 X 将在 Y 之前从流中提取(当从所有分片中提取记录时)。 另一方面,通过将 X 流式传输到分片 Z1,然后将 Y 流式传输到分片 Z2,不能保证排序(从所有分片中提取记录时)。 Y 肯定会在 X 之前被拉到。

分片“流式传输”功能在许多情况下都很有用。

(例如,视频服务使用用户名和电影名称作为分区键将电影流式传输给用户)。

(例如,处理常见事件流并应用聚合)。

在不需要排序(流式传输)或分组(例如聚合)的情况下,生成随机分区键就足够了。

【讨论】:

这是否意味着 500 的分片限制是单个流可用于分区排序的限制?或者,如果里面什么都没有,这些碎片会生死存亡吗?

以上是关于AWS Kinesis 中的分区键是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 AWS kinesis 流中的分区键总数?

AWS CDK 中的哪个类可以选择为 Kinesis 传输流配置动态分区

aws kinesis firehose 中的复制命令不起作用

Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中

无法从 Spring Cloud Stream Kinesis binder 链中的任何提供商加载 AWS 凭证

使用 AWS Java DynamoDB 流 Kinesis 适配器处理 DynamoDB 流