2016-04-25 42 views
0

在Kinesis流上寫入數據時,我們面臨ProvisionedThroughputExceededException問題。Kinesis ProvisionedThroughputExceededException即使在足夠的分片之後

案例1: 我們使用單m4.4xlarge(16核心,64GB MEM)實例寫在流遍數據從3K的JMeter要求,EC2實例爲我們提供了每秒1100的要求,所以我們選擇2碎片流(即2000 eps)。 因此,我們能夠成功寫入數據流而沒有任何損失。

情況2: 對於進一步的測試我們已經創建了10 EC2 m4.4xlarge(16芯,64GB MEM)簇和11分片流(基於簡單的計算1000eps一個碎片,所以10分片+ 1項規定) 。 當我們測試EC2集羣來自Jmeter的不同請求情況,如3,10,3千萬。我們在日誌文件上收到ProvisionedThroughputExceededException錯誤。

在Jmeter側EC2集羣提供給我們7500eps,我相信與7500eps流有11000eps容量不應該返回這樣的錯誤。

你能幫我理解這個問題背後的原因嗎?

回答

0

檢查你的製作人方,你確定你要插入數據到不同的碎片? PutRecordRequest調用中的「PartitionKey」值可能對您有所幫助。

0

這聽起來像Kinesis不是散列/散佈你的數據均勻分佈在你的碎片 - 有些是「熱」(獲得ProvisionedThroughputExceededException),而其他人是「冷」。

爲了解決這個問題,我建議

  1. 使用ExplicitHashKey參數,以便有過哪些碎片數據去控制。 PutRecords documentation有這方面的一些基本信息(但不是它應該)。
  2. 此外,請確保您的分片在散列空間(適當的開始/結束散列鍵)上均勻分割。

最簡單的模式就是爲每個分片擁有一個預定義的ExplicitHashKey,並讓您的PutRecords邏輯對每條記錄進行遍歷 - 完全均勻分佈。在任何情況下,請確保您的記錄散列算法將記錄均勻分佈在碎片上。

基於使用ExplicitHashKey的另一個選擇/擴展是讓你的哈希空間的一個子集專用於「溢出」分片 - 在你的情況下,將1個特定的ExplicitHashKey值映射到一個分片 - 當你開始被限制正常的碎片,發送記錄在那裏重試。