web-dev-qa-db-ja.com

データを(増分的に)Amazon Redshiftにロードする、S3 vs DynamoDB vs Insert

その使用状況に関するレポートを送信する必要があるWebアプリがあり、その目的のためにデータウェアハウスとしてAmazon RedShiftを使用したいのですが、データを収集するにはどうすればよいですか?

ユーザーは毎回アプリを操作します。それを報告したいので、いつファイルをS3に書き込む必要がありますか?そしていくつ?私が意味することは:-情報をすぐに送信しない場合、接続が失われたために情報が失われる可能性があります。各ユーザーインタラクションでS3にファイルを書き込むと、RedShiftにコピーした後に管理、ソート、削除する必要のある数百のファイル(各ファイルには最小限のデータしかありません)になります。良い解決策。

何が欠けていますか?代わりにDynamoDBを使用する必要がありますか、代わりにRedshiftへの単純な挿入を使用する必要があります!?
DynamoDBにデータを書き込む必要がある場合、コピー後にホールドテーブルを削除する必要があります。ベストプラクティスは何ですか?

いずれにせよ、RedShiftでデータの重複を避けるためのベストプラクティスは何ですか?

ヘルプに感謝します!

25
Ofer Velich

Amazon Redshiftに取り込む前に、イベントログをaggregateすることをお勧めします。

利点は次のとおりです。

  • Redshiftのparallelの性質をより適切に使用します。 [〜#〜] copy [〜#〜] S3(または大きなDynamoDBテーブルから)の大きなファイルのセットでは、much小さなファイルの個々のINSERTまたはCOPYよりも高速です。

  • データをRedshiftにロードする前に、データをpre-sort(特にソートがイベント時間に基づいている場合)できます。これはまた、ロードパフォーマンスを改善し、テーブルの [〜#〜] vacuum [〜#〜] の必要性を減らします。

イベントを集約してRedshiftにロードする前に、イベントを複数の場所に蓄積できます。

  • S3へのローカルファイル-最も一般的な方法は、クライアント/サーバーでログを集計し、x MBまたはy分ごとにS3にアップロードすることです。この機能をサポートしているログアペンダーは多数あり、コードを変更する必要はありません(たとえば、 FluentD または Log4J )。これは、コンテナ構成でのみ実行できます。欠点は、一部のログが失われるリスクがあり、これらのローカルログファイルはアップロード前に削除できることです。

  • DynamoDB-@Swamiが説明したように、DynamoDBはイベントを蓄積する非常に良い方法です。

  • Amazon Kinesis -最近リリースされたサービスは、さまざまなクライアントおよびサーバーから中央にイベントをストリーミングするための良い方法でもあります迅速で信頼できる方法で場所を特定します。イベントは挿入順になっているため、後でRedshiftに事前ソートされたイベントを簡単にロードできます。イベントはKinesisに24時間保存されます。たとえば、パフォーマンスを向上させるために、kinesisからの読み取りとRedshiftへの読み込みを1時間ごとにスケジュールできます。

これらすべてのサービス(S3、SQS、DynamoDB、およびKinesis)を使用すると、イベントを直接プッシュできますエンドユーザー/デバイスから、中間Webサーバーを経由する必要なし。これにより、サービスの高可用性(増加した負荷またはサーバー障害の処理方法)とシステムのコスト(使用した分だけを支払うだけで、ログのためだけにサーバーを十分に活用する必要はありません)を大幅に改善できます。

たとえば、モバイルデバイスの一時的なセキュリティトークンを取得する方法については、こちらをご覧ください: http://aws.Amazon.com/articles/461161549939949

これらのサービスと直接対話できるようにする別の重要なツールセットは、さまざまな [〜#〜] sdk [〜#〜] sです。たとえば、 Java。NETJavaScriptiOS および Android です。

de-duplication要件について;上記のほとんどのオプションでは、集約フェーズでそれを行うことができます。たとえば、Kinesisストリームから読み取る場合、イベントに重複がないことを確認できますが、配置する前にイベントの大きなバッファーを分析できますデータストアに。

ただし、このチェックはRedshiftでも実行できます。データをステージングテーブルにCOPYしてから、 SELECT INTO よく整理され、ソートされたテーブルにすることをお勧めします。

実装できるもう1つのベストプラクティスは、毎日(または毎週)テーブルパーティションを作成することです。 1つの大きな長いイベントテーブルを作成したいが、クエリの大部分が1日(たとえば、最終日)に実行されている場合でも、同様の構造(events_01012014、events_01022014、events_01032014)でテーブルのセットを作成できます...)。その後、SELECT INTO ... WHERE date = ...このテーブルのそれぞれに。複数の日からデータをクエリする場合は、 NION_ALL を使用できます。

44
Guy

考慮すべきオプションの1つは、DynamoDBで時系列テーブルを作成し、DynamoDBで毎日または毎週テーブルを作成して、すべてのユーザーインタラクションを記述することです。期間(日、時間、または週)の終わりに、ログをRedshiftにコピーできます。

詳細については、DynamoDB時系列表で次のパターンを参照してください。 http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns

そしてこのブログ:

http://aws.typepad.com/aws/2012/09/optimizing-provisioned-throughput-in-Amazon-dynamodb.html

Redshift DynamoDBコピーの場合: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html

お役に立てれば。

ローカルディスクのCSVファイルにデータを書き込んでから、Python/boto/psycopg2スクリプトを実行してAmazon Redshiftにデータをロードできます。

私の CSV_Loader_For_Redshift で私はちょうどそれをします:

  1. boto Pythonモジュールとマルチパートアップロードを使用して、データを圧縮してS3にロードします。

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
    bucket = conn.get_bucket(bucket_name)
    k = Key(bucket)
    k.key = s3_key_name
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr )
    
  2. psycopg2 COPYコマンドを使用して、Redshiftテーブルにデータを追加します。

    sql="""
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
    
2
Alex B

既に受け入れられている回答がありますが、AWSは Kinesis Firehose という新しいサービスを開始しました。これは、ユーザー定義の間隔、s3への一時アップロード、redshiftへのアップロード(SAVE)、再試行、エラー処理、スループット管理など.

これがおそらく最も簡単で信頼性の高い方法です。

2
Froyke

ここでは少し利己的で、イベント分析プラットフォームである Snowplow を正確に説明しています。クライアントからイベントログを収集し、それをS3で集約するこの驚くべきユニークな方法を使用します。

このためにCloudfrontを使用します。できることは、S3バケットの1つでピクセルをホストし、そのバケットをオリジンとしてCloudFrontディストリビューションの背後に配置することです。同じCloudFrontのS3バケットへのログを有効にします。

クライアントでそのピクセルを呼び出すたびに、URLパラメーターとしてログを送信できます(Googleアナリティクスと同様)。これらのログは、コピーを使用して強化し、Redshiftデータベースに追加できます。

これにより、ログの集約の目的が解決されます。このセットアップは、それらすべてを処理します。

また、 Piwik を調べることもできます。これは、オープンソースの分析サービスであり、ニーズに合わせて変更できるかどうかを確認できます。

1
Sambhav Sharma