20

毎秒約 1000 メッセージのレートでライブ クリックストリーム データを取得し、それを Amazon Redshift に書き込むことを目的とした概念実証アプリを作成しています。

他の人が主張するパフォーマンスのようなものを得るのに苦労しています(たとえば、ここ)。

2 x dw.hs1.xlarge ノード (+ リーダー) を持つクラスターを実行しています。負荷を実行しているマシンは、64 ビット Ubuntu 12.04.1 を実行している Redshift クラスターと同じ VPC 上の EC2 m1.xlarge インスタンスです。

私は Java 1.7 (Ubuntu リポジトリの openjdk-7-jdk) と Postgresql 9.2-1002 ドライバーを使用しています (主に、ビルドを容易にする Maven Central で唯一のドライバーであるためです!)。

最後のテクニックを除いて、ここに示されているすべてのテクニックを試しました。

COPY FROM「リアルタイム」でデータをロードしたいので使用できません。そのため、S3 または DynamoDB を介してステージングすることは実際にはオプションではなく、Redshift はCOPY FROM stdin何らかの理由でサポートしていません。

これはログからの抜粋で、個々の行が約 15/秒の速度で挿入されていることを示しています。

2013-05-10 15:05:06,937 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Beginning batch of 170
2013-05-10 15:05:18,707 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Done
2013-05-10 15:05:18,708 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Beginning batch of 712
2013-05-10 15:06:03,078 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Done
2013-05-10 15:06:03,078 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Beginning batch of 167
2013-05-10 15:06:14,381 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Done

私は何を間違っていますか?他にどのようなアプローチを取ることができますか?

4

4 に答える 4

22

Redshift (別名 ParAccel) は分析データベースです。目標は、非常に大量のデータに対して分析クエリを迅速に回答できるようにすることです。そのために、Redshift はデータを列形式で保存します。各列は個別に保持され、列の前の値に対して圧縮されます。通常、特定の列には多くの反復データや類似データが保持されるため、この圧縮は非常に効果的です。

このストレージ アプローチは、要求された列のみを読み取る必要があり、読み取るデータは非常に圧縮されるため、クエリ時に多くの利点があります。ただし、これには、挿入が遅くなる傾向があり、より多くの労力が必要になるという代償があります。また、完全に順序付けされていない挿入は、テーブルが VACUUM されるまでクエリのパフォーマンスが低下する可能性があります。

したがって、一度に 1 つの行を挿入すると、Redshift の動作に完全に反することになります。データベースは、データを各列に連続して追加し、圧縮を計算する必要があります。これは、多数の zip アーカイブに 1 つの値を追加するのと少し似ています (正確ではありません)。さらに、データが挿入された後でも、VACUUM を実行してテーブルを再編成するまで、最適なパフォーマンスは得られません。

データを「リアルタイム」で分析したい場合は、実用的な目的のために、おそらく別のデータベースやアプローチを選択する必要があります。ここに私の頭のてっぺんから3があります:

  1. 「小さい」バッチ ウィンドウ (5 ~ 15 分) を受け入れ、少なくとも毎日 VACUUM を実行するように計画します。
  2. Vertica など、小さな挿入に対応する分析データベース (さらに $) を選択します。
  3. Acunu Cassandra など、単一パス分析を可能にする「NoSQL」DB を試してください。
于 2013-05-20T12:40:29.603 に答える
2

Redshift では、同じ INSERT ステートメントで複数のリクエストをまとめてバッチ処理することで、1 秒あたり 1000 行を挿入できました (この場合、各 INSERT で最大 200 の値のタプルをバッチ処理する必要がありました)。Hibernate のような ORM レイヤーを使用する場合、バッチ処理用に構成できます (たとえば、http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.htmlを参照) 。

于 2013-11-13T20:03:12.033 に答える
1

トランザクションごとに 75,000 レコードのトランザクションに書き込みをバッチ処理することで、2,400 回の挿入/秒を達成できました。ご想像のとおり、各レコードは小さく、1 レコードあたりわずか約 300 バイトです。

EC2 インスタンスにインストールされた MariaDB にクエリを実行し、Maria がインストールされている同じ EC2 インスタンスから RedShift にレコードを挿入しています。

アップデート

5 つの並列スレッドで MariaDB からデータをロードし、各スレッドから RedShift に書き込むように、書き込みの方法を変更しました。これにより、パフォーマンスが 12,000 回以上の書き込み/秒に向上しました。

そうです、正しく計画すれば、RedShift 書き込みから優れたパフォーマンスを得ることができます。

于 2016-02-14T02:43:06.753 に答える