在动态流上写入数据时,我们面临着ProvisionedThroughputExceededException问题。
案例1:我们被使用单个m4.4xlarge (16核,64 us mem)实例在流上写入数据,传递来自Jmeter的3k请求,EC2实例为我们提供每秒1100个请求,因此我们选择了2个碎片流(即2000年的)。因此,我们能够成功地在流上写入数据,而不会造成任何损失。
案例2:为了进一步测试,我们已经创建了10个 m4.4xlarge (16核,64 so mem)集群和11个碎片流(基于对一个碎片的简单计算,我们创建了10个EC2 +1)。当我们测试EC2集群时,来自Jmeter的不同请求案例,比如3,10,3000万。我们收到日志文件上的ProvisionedThroughputExceededException错误。
在千分尺方面,EC2集群为我们提供了7500股,我相信7500股股的容量是11000便士,不应该返回这样的错误。
你能帮我理解一下这个问题背后的原因吗?
发布于 2016-07-08 06:55:24
这听起来像是Kinesis没有在你的碎片上平均地散列/分发你的数据--有些是“热”的(获取ProvisionedThroughputExceededException),而另一些则是“冷”的。
为了解决这个问题,我建议
ExplicitHashKey参数,以便控制数据到哪个碎片。PutRecords文档在这方面有一些基本的信息(但不像应该的那样多)。最简单的模式是为每个碎片设置一个预定义的ExplicitHashKey,并让您的PutRecords逻辑对每个记录进行迭代--非常均匀的分发。在任何情况下,请确保记录哈希算法将记录均匀分布在各个碎片上。
另一个基于使用ExplicitHashKey的替代/扩展是将散列空间中的一个子集专门用于“溢出”碎片--在您的示例中,将一个特定的ExplicitHashKey值映射到一个碎片--当您开始在普通碎片上进行节流时,将记录发送到那里进行重试。
发布于 2016-04-26 08:43:57
检查您的生产者端,您确定您正在向不同的碎片插入数据吗?"PartitionKey“值在PutRecordRequest调用中可能对您有所帮助。
发布于 2019-06-10 20:03:11
我认为您需要传递不同的“分区键”,以便在不同的“碎片”之间共享数据。即使您已经创建了多个碎片,并且您的所有记录都使用相同的分区键,那么您仍然在写入单个碎片,因为它们都具有相同的散列值。请在这里查看更多PartitionKey
https://stackoverflow.com/questions/36833830
复制相似问题