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 中的分区键是啥?的主要内容,如果未能解决你的问题,请参考以下文章