AWS Kinesis中的分区键是什么?

Suh*_*pta 28 stream amazon-web-services node.js amazon-kinesis

我正在读书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
});
Run Code Online (Sandbox Code Playgroud)

所有记录都已成功插入.partition key这里到底意味着什么?它在后台做什么?我阅读了它的文档,但不明白它的含义.

kdg*_*ory 41

分区键仅在流中有多个分片时才起作用(但总是需要它们).Kinesis计算分区键的MD5哈希值,以决定存储记录的分片(如果您描述流,您将看到哈希值作为分片描述的一部分).

那为什么这很重要?

每个分片只能接受1,000条记录和/或每秒1 MB(请参阅PutRecord doc).如果你以比这个速度更快的速度写入一个分片,你就会得到一个ProvisionedThroughputExceededException.

使用多个分片,您可以扩展此限制:4个分片可为您提供4,000条记录和/或每秒4 MB.当然,有一些警告.

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

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

最后,如果您正在使用PutRecords(如果您正在编写大量数据,则应该使用PutRecords),请求中的个别记录可能会被拒绝,而其他记录则被接受.发生这种情况是因为这些记录转到已经处于其写入限制的分片,并且您必须重新发送它们(在延迟之后).

  • 根据 AWS 文档,分区键的数量通常必须大于可用分片的数量。因此,假设一个场景,我有 2 个可用分片,并且 500 个传感器每个每秒将 100 字节数据推送到数据流,如果我使用传感器 ID 作为分区键,md5 哈希不会生成 500不同的价值观?那么这 500 个不同的值如何映射到两个创建的分片中的任何一个。我知道每个分片都有一个开始和结束哈希键,但在创建分片后就会分配该键。 (3认同)
  • 分片可以容纳的数据是否有限制?如果我的应用程序中只有 1 个分区键但有 100 个分片怎么办? (2认同)
  • 使用不同的分区键插入每条记录意味着什么?为什么要为每个记录使用相同的分区键? (2认同)

Tom*_*mer 8

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

理论上,AWS可以为每个记录创建一个随机分区键,这将导致近乎完美的传播。

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

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

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

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

(例如,处理一系列常见事件并应用汇总)。

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