2017-08-02 7 views
1

我正在嘗試調用dynamodb寫入操作來寫入60k條記錄。改進DynamoDB寫入操作

我試圖將1000個寫入容量單位用於預置寫入容量。但是我的寫作操作仍然花費很多時間。另外,當我檢查指標時,我仍然可以看到消耗的寫入容量單位爲每秒10個左右。

我的記錄大小肯定小於1KB。

有沒有一種方法可以加速dynamodb的寫入操作?

+1

你是單線程寫操作嗎?您可以通過發送並行請求來提高性能。另外,請確保請求正在跨不同的分區鍵更新數據,以便它們將負載分散到多個分區。 –

+0

如果我沒有錯,在dynamodb的情況下,並行寫入與batchWrite操作相同。 –

+0

您是否收到任何'ProvisionedThroughputExceededException'錯誤?如果沒有,你沒有發送足夠的請求。並行發送多個batchWrite請求以獲得吞吐量的全部好處。異步可能也適用。 –

回答

1

與大多數數據庫一樣,DynamoDB的性能高度依賴於它的使用方式。

從您的問題來看,您可能只使用一個DynamoDB分區。每個分區容量爲can support up to 1000 write,最高可達10GB的數據。

但是,您還提到您的指標每秒只顯示10個寫單位。這是非常低的。檢查AWS控制檯中表格可見的所有指標。這是DynamoDB頁面下的每個表的選項卡。檢查節流和任何錯誤。檢查消耗的容量是否低於圖表上的預置容量。

您的過程中可能存在其他一些瓶頸。

+0

我已經在表格的唯一主鍵上創建了分區。我使用單個記錄而不是batchWrite。使用batchWrite會改變我的統計數據嗎? –

+0

如果客戶端和DynamoDB之間存在高延遲,batchWrite會有所幫助。試一試,併爲其他人評論結果。 –

1

看起來您可以每秒發送更多請求。您可以執行更多的要求,但如果你在一個循環中發送的請求是這樣的:

for item in items: 
    table.putItem(item) 

你需要介意每個請求的往返延遲。

您可以使用兩個技巧:

  • 從多個線程/機器首先,上傳數據。

  • 其次,你可以使用BatchWriteItem方法,讓你寫多達25個項在一個請求:

的BatchWriteItem操作提出或刪除一個或 多個表的多個項目。對BatchWriteItem的單個調用可以寫入多達16 MB的 數據,其中可以包含多達25個放置或刪除請求。 要寫入的單個項目可能大至400 KB。

1

所以這裏是我的想法。

我改變了我的電話以使用batchWrite,而且我的消耗寫容量單位已經顯着增加,達到286個寫容量單位。 此外,完整的寫入操作在幾分鐘內完成。 正如所有上述答案中所提到的,使用putItem加載大量數據存在延遲問題,並且會影響您的消耗容量。 batchWrite總是更好。