2012-05-21 77 views
15

這個問題已經被張貼在AWS論壇,但尚未亞馬遜DynamoDB(PHP API)仍然沒有答案https://forums.aws.amazon.com/thread.jspa?threadID=94589可笑緩慢寫入

我想執行的項目短一長列的初始上傳(大約1.2億),以後通過唯一密鑰檢索它們,這對於DynamoDb來說似乎是一個完美的例子。然而,我目前的寫入速度非常慢(大約每100次寫入8-9秒),這使得初始上傳幾乎不可能(按照當前的速度大約需要3個月)。

我已閱讀AWS論壇尋找答案,已經嘗試了以下幾件事:

  1. 我從單一的「put_item」切換調用的25個項目批次寫入(推薦最大批量寫入大小),我的每件物品都小於1Kb(這也是推薦的)。即使我的25個項目也低於1Kb,這是非常典型的,但它不能保證(無論如何,因爲我知道只有單個項目的大小對於DynamoDB非常重要)。

  2. 我使用最近引入的歐盟地區(我在英國),直接通過調用set_region('dynamodb.eu-west-1.amazonaws.com')指定其入口點,因爲顯然沒有其他方法在PHP API中做到這一點。 AWS控制檯顯示該表在適當的區域,因此可以工作。

  3. 我已經通過調用disable_ssl()(每100條記錄獲得1秒)來禁用SSL。

儘管如此,100個項目的測試集(25個項目的4個批量寫入調用)永遠不會少於8秒的索引。每批寫入請求大約需要2秒鐘,所以它不像第一個是即時的,因此後續請求很慢。

我提供的表格吞吐量是100個寫入和100個讀取單元,到目前爲止應該是足夠的(嘗試更高的限制以及以防萬一,沒有影響)。

我也知道在請求序列化時有一些開銷,所以我可以使用隊列來「積累」我的請求,但是對於batch_writes真的很重要嗎?我認爲這不是問題,因爲即使是單個請求也需要很長時間。

我發現有些人修改API中的cURL頭文件(特別是「Expect:」)以加速請求,但我認爲這不是一種正確的方式,並且API自從建議已發佈。

我的應用程序運行的服務器也很好 - 我讀過有時CPU負載會經過屋頂,但在我的情況下一切正常,這只是網絡請求花費太長時間。

我現在卡住了 - 還有什麼我可以嘗試嗎?如果我沒有提供足夠的信息,請隨時索取更多信息。

還有其他最近的線程,顯然在同一個問題上here(儘管目前爲止還沒有答案)。

這項服務應該是超快的,所以我一開始就對這個問題感到困惑。

+0

聽起來像你需要像SQL Server這樣的關係數據庫。只需要'SqlBulkCopy'這個數據。如果你問的話,SQL Server就是網絡規模。 –

+0

我不需要關係數據庫(這是一個沒有實際關係的平面索引),但是,如果我沒有其他選項,我正在考慮撤回到mySQL或Solr。但是現在我仍然渴望理解這種方法有什麼問題。 – Yuriy

+0

您的論壇帖子已回覆到:https://forums.aws.amazon.com/thread.jspa?messageID=365597#365597 –

回答

10

如果你從你的本地計算機上傳,速度會由你和服務器之間的流量/防火牆的各種等受到影響。如果我給DynamoDB打電話,每個請求只需要0.3秒,因爲有時間來往澳大利亞。

我的建議是建立自己與PHP的EC2實例(服務器),將腳本上傳所有文件到EC2服務器作爲一個塊,然後從那裏做轉儲。 EC2服務器對DynamoDB服務器起到了極快的速度。

如果你不自信一些設置EC2與LAMP,那麼他們有一個新的服務「彈性魔豆」,可以做到這一切爲您。當你完成上傳,簡單地燒服務器 - 希望你可以做所有他們的「自由層」的定價結構:)內

不能解決連接的長期問題,但三月份會減少上傳!

+0

感謝您的回答。我沒有嘗試Beanstalk,但試圖使用Elastic MapReduce來代替 - 這裏還有一個問題,我創建了另一個問題:http://stackoverflow.com/questions/10683136/amazon-elastic-mapreduce-mass-insert-從s3到dynamodb是難以置信的慢 – Yuriy

+0

就像你在澳大利亞提到的那樣,它對你而言仍然不到0.5秒,所以從倫敦到愛爾蘭我不會有2秒的時間。我們的聯繫非常好,迄今爲止我排除了這一點。 – Yuriy

+0

2秒是非常慢,但它可能是一個簡單的作爲服務器上的防火牆做一些「檢查」,或在路由器上執行其他「檢查」的防火牆。 (或者,憤世嫉俗,讓Amzon推動你向EC2推廣的方式,可能?!)正如我所說 - 這不是一個長期解決方案,只是爲了完成上傳。如果你想保留在本地,爲什麼不看Cassandra或Mongo?但如果你使用亞馬遜和支付,只需轉移服務器 - 它會讓他們高興:) – Robbie

1

我會嘗試多線程上傳來提高吞吐量。也許一次添加一個線程,看看吞吐量是否線性增加。作爲一個測試,你可以同時運行兩個當前的裝載機,看看它們是否都以你現在觀察的速度運行。

0

我不得不使用PHP SDK使用上AmazonDynamoDB類批次方法很好的成功。我能夠從EC2實例每秒運行約50項。該方法通過對請求進行排隊直到您調用send方法,此時它使用Curl執行多個同時請求。這裏有一些很好的參考:

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LoadData_PHP.html

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPItemOperationsExample.html

我想你也可以使用彈性的Map Reduce從一個CSV文件批量加載數據使用SQL HIVE。 EMR可以使用多臺機器來傳播工作負載並實現高併發性。

+1

謝謝,喬納森,但我已經重寫了功能使用本地索引關於HIVE,在涉及DynamoDB時也存在一個問題,它已經被亞馬遜證實(請參閱我的另一個問題和我自己發佈的答案):http://stackoverflow.com/questions/10683136 /亞馬遜彈性-MapReduce的質嵌件從-S3到dynamodb此結果令人難以置信的慢 – Yuriy