【问题标题】: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,但不明白它的意思。

【问题讨论】:

    标签: node.js amazon-web-services stream amazon-kinesis


    【解决方案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 的分片限制是单个流可用于分区排序的限制?或者,如果里面什么都没有,这些碎片会生死存亡吗?
    猜你喜欢
    • 2020-03-29
    • 2015-09-29
    • 1970-01-01
    • 2019-10-04
    • 2019-06-20
    • 1970-01-01
    • 2019-03-18
    • 2019-10-24
    • 2020-02-25
    相关资源
    最近更新 更多