15

この質問はすでに AWS フォーラムに投稿されていますが、まだ回答がありませんhttps://forums.aws.amazon.com/thread.jspa?threadID=94589

短いアイテム (約 1 億 2000 万個) の長いリストの最初のアップロードを実行して、後で一意のキーで取得しようとしていますが、DynamoDb の完璧なケースのようです。

ただし、現在の書き込み速度は非常に遅く (100 回の書き込みあたり約 8 ~ 9 秒)、最初のアップロードはほとんど不可能です (現在のペースでは約 3 か月かかります)。

回答を求めて AWS フォーラムを読み、次のことをすでに試しました。

  1. 単一の「put_item」呼び出しから 25 アイテムのバッチ書き込み (推奨される最大バッチ書き込みサイズ) に切り替えましたが、各アイテムは 1Kb 未満です (これも推奨されます)。25 個のアイテムでも 1Kb 未満であることは非常に一般的ですが、保証されていません (DynamoDB では 1 つのアイテムのサイズのみが重要であるため、問題にはなりません)。

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

  3. disable_ssl() を呼び出して SSL を無効にしました (100 レコードあたり 1 秒短縮)。

それでも、100 項目のテスト セット (25 項目に対して 4 回のバッチ書き込み呼び出し) では、インデックス作成に 8 秒以上かかることはありません。すべてのバッチ書き込みリクエストには約 2 秒かかるため、最初のリクエストが瞬時に行われ、その後のリクエストが遅くなるわけではありません。

私のテーブル プロビジョニング スループットは 100 書き込みユニットと 100 読み取りユニットで、これまでのところ十分なはずです (念のため、より高い制限も試してみましたが、効果はありません)。

また、リクエストのシリアル化にいくらかの費用がかかることも知っているので、おそらくキューを使用してリクエストを「蓄積」できますが、それは本当にbatch_writesにとってそれほど重要ですか? 単一のリクエストでも時間がかかりすぎるため、それは問題ではないと思います。

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

私のアプリケーションが実行されているサーバーも問題ありません.CPU負荷が屋根を通り抜けることがあることを読んだことがありますが、私の場合はすべて問題ありません.ネットワークリクエストに時間がかかりすぎているだけです.

私は今立ち往生しています - 他に試すことができるものはありますか? 十分な情報が提供されていない場合は、お気軽にお問い合わせください。

どうやら同じ問題に関する他の最近のスレッドがここにあります(ただし、これまでのところ回答はありません)。

このサービスは超高速であるはずなので、最初はその問題に本当に戸惑いました。

4

3 に答える 3

11

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

私の提案は、PHP で EC2 インスタンス (サーバー) を作成し、スクリプトとすべてのファイルをブロックとして EC2 サーバーにアップロードし、そこからダンプを実行することです。EC2 サーバーは、DynamoDB サーバーに対して猛烈な速度を持っている必要があります。

自分で LAMP を使用して EC2 をセットアップすることに自信がない場合は、それらをすべて実行できる新しいサービス「Elastic Beanstalk」があります。アップロードが完了したら、サーバーを燃やすだけです。うまくいけば、「無料利用枠」の価格体系内ですべてを実行できます:)

接続の長期的な問題は解決しませんが、3 か月のアップロードは短縮されます。

于 2012-05-21T11:17:32.167 に答える
1

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

于 2012-06-01T19:10:09.050 に答える
0

AmazonDynamoDB クラスでバッチ メソッドを使用して、php sdk を使用することに成功しました。EC2 インスタンスから 1 秒あたり約 50 アイテムを実行できました。このメソッドは、send メソッドを呼び出すまでリクエストをキューに入れることによって機能します。send メソッドを呼び出すと、Curl を使用して複数の同時リクエストが実行されます。ここにいくつかの良い参考文献があります:

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

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

Elastic Map Reduceを使用してHIVE sqlを使用して、CSVファイルからデータを一括ロードすることもできると思います。EMR は、複数のマシンを使用して作業負荷を分散し、高い同時実行性を実現できます。

于 2012-07-02T14:36:19.973 に答える