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 CDK 中的哪个类可以选择为 Kinesis 传输流配置动态分区
aws kinesis firehose 中的复制命令不起作用
Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中