即使有足够的分片,Kinesis ProvisionedThroughputExceededException

问题描述 投票:0回答:3

我们在 Kinesis 流上写入数据时一直面临 ProvisionedThroughputExceededException 问题。

案例1: 我们使用单个 m4.4xlarge(16 核,64GB mem)实例在流上写入数据,传递来自 Jmeter 的 3k 请求,EC2 实例每秒为我们提供 1100 个请求,因此我们选择 2 个分片流(即 2000 eps)。 结果,我们能够成功地将数据写入流,没有任何损失。

案例2: 为了进一步测试,我们创建了 10 个 EC2 m4.4xlarge(16 核、64GB mem)集群和 11 个分片流(基于一个分片 1000eps 的简单计算,因此 10 个分片 + 1 个配置)。 当我们使用来自 Jmeter 的不同请求案例(如 3、10、3000 万)测试 EC2 集群时。我们在日志文件中收到了 ProvisionedThroughputExceededException 错误。

在 Jmeter 端 EC2 集群为我们提供了 7500eps,我相信具有 11000eps 容量的 7500eps 流不应返回此类错误。

您能帮我理解这个问题背后的原因吗?

amazon-web-services amazon-ec2 amazon-kinesis
3个回答
2
投票

听起来 Kinesis 并没有在您的分片中均匀地散列/分布您的数据 - 有些是“热”的(得到

ProvisionedThroughputExceededException
),而另一些是“冷”的。

要解决这个问题,我建议

  1. 使用
    ExplicitHashKey
    参数可以控制数据进入哪些分片。 PutRecords 文档 有一些关于此的基本信息(但没有应有的那么多)。
  2. 此外,请确保您的分片在哈希空间中均匀分布(适当的开始/结束哈希键)。

最简单的模式就是为每个分片拥有一个预定义的 ExplicitHashKey,并让您的 PutRecords 逻辑为每个记录迭代它 - 完美均匀的分布。无论如何,请确保您的记录哈希算法将在分片中均匀分布记录。

基于使用 ExplicitHashKey 的另一种替代/扩展是让哈希空间的一个子集专用于“溢出”分片 - 在您的情况下,1 个特定的 ExplicitHashKey 值映射到一个分片 - 当您开始在正常分片上受到限制时,将记录发送到那里以便重试。


0
投票

检查你的生产者端,你确定你正在将数据插入到不同的分片中吗? PutRecordRequest 调用中的“PartitionKey”值可能会帮助您。


0
投票

我认为您需要为记录传递不同的“分区键”以在不同“分片”之间共享数据。 即使您创建了多个分片并且所有记录都使用相同的分区键,那么您仍然会写入单个分片,因为它们都具有相同的哈希值。在这里查看更多信息PartitionKey

© www.soinside.com 2019 - 2024. All rights reserved.