2012-05-21 24 views
15

への書き込みこの質問は、既にAWSフォーラムに投稿さが、まだされている未解決のままhttps://forums.aws.amazon.com/thread.jspa?threadID=94589はとてつもなく遅いのアマゾンDynamoDBの(PHPのAPI)

私は(短期項目の長いリストの最初のアップロードを実行するためにしようとしています後でユニークキーでそれらを取得するために、DynamoDbの完璧なケースのようです。

しかし、私の現在の書き込み速度は、(それが現在のペースで約3ヶ月を取ると思います)、最初のアップロードがほとんど不可能になりた(100の書き込みあたりおよそ8-9秒)非常に遅いです。

私は答えを探しているAWSフォーラムを読んで、すでに次のことを試してみました:

  1. 私はシングル「put_item」から切り替えるには、25の項目(推奨最大一括書き込みサイズ)の一括書き込みに呼び出し、それぞれのアイテムは1Kbよりも小さい(これもお勧めです)。私のアイテムのうち25個が1Kb以下であっても非常に典型的ですが、保証されていません(そして、DynamoDBでは単一のアイテムサイズだけが重要であると理解しても問題ありません)。

  2. 最近紹介されたEU地域(私は英国)を使用して、set_region( 'dynamodb.eu-west-1.amazonaws.com')を呼び出すことでエントリポイントを直接指定しています。 PHP APIでそれを行う。 AWSコンソールは、適切な領域にテーブルがあることを示しています。

  3. は、私は()(100のレコードごとに1秒を獲得)disable_sslを呼び出すことにより、無効SSLを持っています。

なお、100項目のテストセット(25個のアイテムに対する4回のバッチ書込み呼び出し)は、インデックス作成に8秒以下かかることはありません。バッチ書込み要求はすべて約2秒かかります。そのため、最初の書込み要求が瞬間的ではないため、結果として要求が遅くなります。

マイテーブルプロビジョニングスループットはこれまでに十分であるべきである100の書き込み及び100個の読み出し単位である(ちょうど場合にも何の効果もより高い限界を試していません)。

また、私はおそらく私の要求を「蓄積」するためにキューを使用できるように、いくつかの費用は、要求の直列化であることを知っているが、batch_writesのために本当に問題でそのくらい?また、1回のリクエストでも時間がかかりすぎるので、問題はないと思います。

リクエストを高速化するためにAPIのcURLヘッダー(特に「Expect:」)を変更する人がいることがわかりましたが、それは適切な方法ではないと思っていますし、APIもそれ以降更新されていますアドバイスが投稿されました。

私のアプリケーションが実行されているサーバーは、同様に罰金です - 私は、CPUの負荷が屋根を通過するが、私の場合にはすべてがうまくあり、時には、それは時間がかかりすぎるだけでネットワーク要求だと読みました。

私は今止まっています - 他に何か試すことができますか?私が十分な情報を提供していない場合は、より多くの情報を求めてください。

が明らかに同じ問題に、他の最近のスレッドがあり、here(今のところしかし無応答)。

このサービスは超高速になっているはずなので、私はその問題の当初から本当に困惑しています。

+0

SQL Serverのようなリレーショナルデータベースが必要なようです。ちょうど 'SqlBulkCopy'のデータです。あなたが求めているのであれば、SQL ServerはWebスケールです。 –

+0

私はここでリレーショナルDBは必要ありません(実際の関係のないフラットなインデックスです)。しかし、私は他のオプションがない場合、私はmySQLまたはSolrに後退することを考えています。しかし今のところ私はまだそのアプローチに何が間違っているかを理解したいと思っています。 – Yuriy

+0

フォーラムの投稿が返信されました:https://forums.aws.amazon.com/thread.jspa?messageID=365597#365597 –

答えて

10

ローカルマシンからアップロードする場合、速度はあなたとサーバーの間のあらゆる種類のトラフィック/ファイアウォールなどの影響を受けます。私がDynamoDBを呼び出すと、各リクエストはオーストラリアに出入りする時間のために0.3秒かかります。

私はPHPでEC2インスタンス(サーバー)を作成し、そのスクリプトとすべてのファイルをブロックとしてEC2サーバーにアップロードし、そこからダンプを実行することをお勧めします。 EC2サーバーは、DynamoDBサーバーとの間に激しい速度を持っています。

あなた自身がLAMPでEC2をセットアップすることに自信がないなら、彼らはあなたのためにすべてを行うことができる新しいサービス "Elastic Beanstalk"を持っています。あなたがアップロードを完了したら、サーバを焼くだけでよいのですが、うまくいけば彼らの "フリー層"料金体系の中でそれをすべて行うことができます:)

長期的な接続の問題は解決しませんが、アップロード!

+0

あなたの答えをありがとう。私はBeanstalkを試していませんでしたが、代わりにElastic MapReduceを使用しようとしていました。私は別の質問を作成しました:http://stackoverflow.com/questions/10683136/amazon-elastic-mapreduce-mass-insert- from-s3-to-dynamodb-is-incredibly-slow – Yuriy

+0

オーストラリアからも言われているように、まだ0.5秒もありませんので、ロンドンからアイルランドまで私は2秒もかかりません。私たちの接続は非常に良いです、これまで私はそれを排除します。 – Yuriy

+0

2秒は非常に遅いですが、サーバー上のファイアウォールとして単純なものでも、「チェック」を行っているものや、ルータ上のファイアウォールが他の「チェック」をしているものもあります。 (あるいは、冷笑的で、AmzonがEC2を二人きりにする方法だろうか?)私が言ったように、これは長期的な解決策ではなく、アップロードを完了するためのものである。ローカルに保管したい場合は、カサンドラやモンゴを見てみましょう。しかし、あなたがAmazonを使っていて、支払いをしているのであれば、そこにサーバーを移してください。それは彼らを幸せにしてくれるでしょう:) – Robbie

1

スループットを向上させるためにマルチスレッドアップロードを試みます。スレッドを一度に1つずつ追加し、スループットが直線的に増加するかどうかを確認することもできます。テストとして、あなたの現在のローダーのうちの2つを同時に実行して、両方があなたが今観察している速度で動くかどうかを見ることができます。

0

AmazonDynamoDBクラスのバッチメソッドを使用してphp sdkを使用して成功しました。私はEC2のインスタンスから毎秒約50のアイテムを実行することができました。このメソッドは、sendメソッドを呼び出すまで要求をキューイングすることによって機能し、その時点でCurlを使用して複数の同時要求が実行されます。ここではいくつかの良い参照です:

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

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

私はあなたにも弾性地図CSVファイルから一括負荷データに削減使用してHIVEのSQLを使用することができると思います。 EMRは、複数のマシンを使用して作業負荷を分散し、並行性を高めます。

+1

ありがとう、ジョナサン、ローカルインデックスを使用してください.HiVEについては、Amazonで確認されているDynamoDBについても問題があります(私の別の質問と自己投稿の回答を参照してください):http://stackoverflow.com/questions/10683136/amazon-elastic-mapreduce-mass-insert-s3からdynamodb-is-信じられないほど遅い – Yuriy

関連する問題