2

次の方法でSimpleDBを使用しようとしています。

いつでも 48 時間分のデータを simpledb に保持し、さまざまな目的でクエリを実行したいと考えています。各ドメインには 1 時間分のデータがあるため、simpledb には常に 48 のドメインが存在します。新しいデータは常にアップロードされるため、最も古いドメインを削除し、新しい時間ごとに新しいドメインを作成します。

各ドメインのサイズは約 50 MB で、すべてのドメインの合計サイズは約 2.2 GB です。ドメイン内のアイテムには、次のタイプの属性
識別子があります - 長さ約 50 文字 -- アイテムごとに 1つの
タイムスタンプ - タイムスタンプ値 -- アイテムごとに 1
serial_n_data - 500 ~ 1000 バイトのデータ -- アイテムごとに 200

データのアップロードとクエリに python boto ライブラリを使用しています。ドメインで約 200 の属性を持つ 1 アイテム/秒を送信します。

このデータのアプリケーションの 1 つとして、48 のドメインすべてからすべてのデータを取得する必要があります。クエリは、すべてのドメインに対して「SELECT * FROM domain」のようになります。8 つのスレッドを使用してデータのクエリを実行し、各スレッドがいくつかのドメインを担当します。
例: ドメイン 1-6 スレッド 1
ドメイン 7-12 スレッド 2 など

データ全体を取得するのに 13 分近くかかります。これには boto の select メソッドを使用しています。これよりもはるかに高速なパフォーマンスが必要です。クエリ処理を高速化するための提案はありますか? 物事をスピードアップできる、使用できる他の言語はありますか?

4

3 に答える 3

5

より多くのスレッドを使用する

スレッド/ドメインの比率を 1/6 から 30/1 に近い値に反転することをお勧めします。SimpleDB から大量のデータを取得するのにかかる時間のほとんどは、待機に費やされます。この状況では、スレッド数を増やすとスループットが大幅に向上します。

SimpleDB の制限の 1 つは、1 MB のクエリ応答サイズの上限です。これは、1 つのドメインで 50MB を引き下げるには、少なくとも 50 の選択 (元のページ + 追加の 49 ページ) が必要であることを意味します。次のリクエストには現在のレスポンスからの NextToken が必要なため、これらは順番に発生する必要があります。各 Select に 2 秒以上かかる場合 (応答が大きく、要求量が多い場合は珍しくありません)、各ドメインに 2 分を費やします。すべてのスレッドが 6 つのドメインのそれぞれを順番に繰り返し処理する必要がある場合、約 12 分かかります。ドメインごとに 1 つのスレッドで、簡単に約 2 分に短縮できます。

しかし、それよりもはるかに優れたことができるはずです。SimpleDB は同時実行のために最適化されています。ドメインごとに 30 スレッドを試して、各スレッドが 1 時間のうちにクエリを実行できるようにします。これは結局のところログ データであるためです。例えば:

SELECT * FROM domain WHERE timestamp between '12:00' and '12:02'

(明らかに、実際のタイムスタンプ値を使用します) 30 個のクエリはすべて、応答を待たずに開始できます。この方法では、ドメインごとに少なくとも 50 のクエリを作成する必要がありますが、すべてを順番に作成する代わりに、より多くの同時実行性を得ることができます。最高のスループットが得られるスレッド数を自分でテストする必要があります。選択条件を 1 分刻みに分割して、ドメインごとに最大 60 個まで試してみることをお勧めします。それが機能する場合は、完全に並列クエリが作成され、すべてのフォローアップ ページが削除される可能性が高くなります。503 ServiceUnavailable エラーが発生した場合は、スレッドを縮小します。

ドメインは SimpleDB のスケーラビリティの基本単位であるため、データを分割する便利な方法があると便利です。同時実行性を利用するだけです。13 分ではなく、同じリージョンの EC2 で実行されているアプリのデータを 13 秒で取得できたとしても驚かないでしょう。ただし、実際にかかる時間は、他の多くの要因によって異なります。

コストに関する懸念

補足として、あなたが問題を提起していなくても、あなたがしていることのコストについて言及しておく必要があります. CreateDomain と DeleteDomain は負荷の高い操作です。通常、あまり頻繁に使用することはお勧めしません。毎回約 25 秒のボックス使用量が課金されるため、1 時間ごとにボックスを作成および削除すると、ドメイン管理だけで月額約 70 ドルが加算されます. 言及した50MBよりも桁違いに多くのデータをドメインに保存できます。そのため、削除する前にデータをさらに蓄積させたい場合があります。クエリにタイムスタンプが含まれている場合 (またはタイムスタンプを含めるように作成できた場合)、ドメインに余分な GB の古いデータが含まれていても、クエリのパフォーマンスはまったく損なわれない可能性があります。いずれにせよ、GetAttributes と PutAttributes が大きなドメイン サイズでパフォーマンスに影響を与えることは決してありません。選択索引をうまく活用しないでください。確認するには、クエリをテストする必要があります。それは単なる提案です。概念的には、作成/削除の方がクリーンであることがわかります。

また、一度に 200 個の属性を書き込むのは、ボックスの使用法に癖があるため、コストがかかります。書き込み用のボックスの使用量は、属性の数の 3 乗に比例します。時間単位の式は次のとおりです。

0.0000219907 + 0.0000000002 N^3

基本料金に属性ごとの料金を加えたもの (N は属性の数)。あなたの状況では、1 回のリクエストで 200 個の属性すべてを書き込むと、ボックスの使用料金は 100 万アイテムあたり約 250 ドル (256 属性を書き込む場合は 100 万ドルあたり 470 ドル) になります。各リクエストをそれぞれ 50 個の属性を持つ 4 つのリクエストに分割すると、PutAttributes のボリュームは 4 倍になりますが、ボックスの使用料金は 100 万アイテムあたり約 28 ドルに減少します。リクエストを分解できる場合は、実行する価値があるかもしれません。それができない場合 (リクエストの量やアプリの性質が原因で)、SimpleDB はコストの観点から非常に魅力的ではないことを意味します。

于 2010-06-23T19:39:35.960 に答える
0

私はあなたのチャーリーと同じ問題を抱えていました。コードをプロファイリングした後、パフォーマンスの問題を SSL に絞り込みました。それがほとんどの時間、つまりCPUサイクルを費やしている場所のようです。

httplib ライブラリ (boto が SSL に使用する) で、パケットが特定のサイズを超えない限りパフォーマンスが向上しないという問題を読みましたが、これは Python 2.5 用であり、既に修正されている可能性があります。

于 2012-01-26T00:58:30.000 に答える
0

SBBExplorer はマルチスレッドの BatchPutAttributes を使用して、大量のデータを Amazon SimpleDB にアップロードする際に高い書き込みスループットを実現します。SDB Explorer では、複数の並列アップロードが可能です。帯域幅がある場合は、多数の BatchPutAttributes プロセスを並列キューで一度に実行することで、その帯域幅を最大限に活用できます。これにより、処理にかかる時間が短縮されます。

http://www.sdbexplorer.com/

于 2012-03-19T05:56:03.783 に答える