Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Organization

Redshiftのコストカットを、データ転送SaaS「trocco」を使ってやってみる

概要

  • RedshiftをS3(Parquet)+Athenaで置き換える
    • 容量に対するコスパを上げる
    • 同時実行数に対する耐障害性を上げる
  • データ統合SaaSのtroccoを使えば作業時間5分で出来た

背景

弊社では以前、DWHにRedshiftを使っていました。
しかしデータ量=ノード数が増えすぎたため、AWS料金が高額になり、問題となっていました。

弊社のDWH環境では、クエリ実行時間に対するパフォーマンスよりも、データ量に対するコストパフォーマンスの方が重要でした。
そのためRedshift上にデータロードする高速クエリ実行環境ではなく、S3に保存したデータをAthenaからクエリ実行出来る環境の方が合っていたのです。

この記事ではビッグデータ転送SaaSであるtroccoを使って、Redshift上のデータをS3に退避し、Athenaからクエリ実行する方法をご紹介します。
Untitled (7).png

対象

  • Redshiftをお使いで、以下の課題感を持っている方
    • Redshiftの料金を抑えたい
    • Redshiftのクエリ同時実行数が増えすぎて負荷がヤバい
    • Athena試してみたい
  • troccoって聞いたことあるけど、何が出来るんだろう?と思っている方

準備するもの

所要時間は、作業時間5分、転送時間60分程です。

  • Redshiftクラスタ
    • 今回は試験用の小さいクラスタを用意しました(dc2.xlarge * 6 nodes)
    • 1億レコードくらいの行動ログデータ(user_id,user_agent,timestamp)を突っ込んで試します
    • 転送元テーブル接続
  • S3バケット
    • データ保存先のバケットを用意しておいて下さい
  • IAM User
    • S3バケット
  • troccoアカウント
    • 無料のトライアルが可能ですのでこちらからお申し込み下さい

流れ

  1. troccoでRedshiftのデータをS3にParquet形式で吐き出す
    • Athenaのクエリパフォーマンスを上げるため、列指向ファイルフォーマットのParquet形式で吐き出します
    • パスにdate=2019-03-29のようなHiveのダイナミックパーティションも付与してあげまれば、スキャン量が減り、コスパが良くなります
  2. S3上のデータをGlue Crawlerでデータカタログ化(テーブル作成)
  3. Athenaでクエリ実行

1. troccoでRedshiftのデータをS3にParquet形式で吐き出す

1-1. 転送設定を作成

troccoトップページを開き、転送元にRedshiftを、転送先にS3 Parquetを選択し、転送設定を作成します。
qiita_step_1.png
すると転送設定の作成画面に遷移します。
qiita_step_2.png

1-2. 転送元Redshiftの設定を入力

「接続情報を追加」を押し、予め用意したRedshiftの接続情報を、フォームに従って入力・保存します。
(AWSクレデンシャルの入力項目がありますが、今回はS3へのUNLOADは行わないため、用意したIAM Userか適当な文字列を入力して下さい)
qiita_step_3.png
設定は以下のように入力します。

項目
Redshift接続情報 再読込ボタンを押すと、登録した接続情報が出現するので選択して下さい
データベース名 転送するデータが保存してあるデータベース名を入力します
スキーマ 転送するデータが保存してあるスキーマ名を入力します
クエリ SELECT * FROM public.table_name LIMIT 10000 のように、転送するデータをクエリで指定します。

1-3. 転送先S3の設定を入力

次は転送先に関する設定を入力していきます。
先ほどと同じ要領で「接続情報を追加」を押し、予め用意したS3の接続情報(IAM Userクレデンシャル)を、フォームに従って入力・保存します。
転送設定作成 _ trocco - Google Chrome 2020-04-02 11.51.1.png

設定は以下のように入力します。

項目
S3接続情報 再読込ボタンを押すと、登録した接続情報が出現するので選択して下さい
バケット 予め用意した転送先バケット名を入力します
パスプレフィックス ログの出力先パスプレフィックスを指定します。ここではqiita-20190326/と入力しておきます。
リージョン S3のリージョンを入力します。今回は東京リージョンにバケットを作ったので、 ap-northeast-1 と入力します。
圧縮方式 今回は圧縮ありで Snappy を選びました。他にもGzipなど計6種の圧縮方法に対応しています

※パスプレフィックスではtest_log/date=$current_date$のように変数を埋め込むことも出来ます。転送日時を使って日付のパーティションを切るような用途で使えます。

1-4. プレビュー

ここまでで、設定は完了です。保存してプレビューに進みます。
自動データ設定で列名・データ型などが正しく認識されていることが確認できました。
qiita_step_5.png

1-5. 詳細設定(Glueデータカタログへの登録設定)

プレビュー画面の下の方に詳細設定がありますが、RedshiftのSSL設定とか、S3 Parquetのブロックサイズとかを変更したければこちらをいじります。
また、Athenaでのクエリ実行に必須である「Glueデータカタログ」への登録も自動化出来ます
qiita_step_6.png
※JSON型、タイムスタンプ型の列がある場合はここで「カラム設定」を行う必要があります

1-6. スケジュール・通知設定

定期実行したり、エラー時にSlack通知したり出来るみたいですが、今回はスキップで。

1-7. ジョブ実行

設定が完了したら、右上のボタンから「実行」を押して、転送ジョブを実行します。
1億レコードですが、だいたい20分くらいでParquet形式での保存が完了しました。
qiita_step_7.png

2. S3上のデータをGlue Crawlerでデータカタログ化(テーブル作成)

本来ならこの部分の作業が発生すると思っていたのですが、trocco側で自動でテーブル作成を行ってくれるので、作業不要でした(^_^;)

3. Athenaでクエリ実行

ここまででAthenaでクエリ実行を行う環境が整っているはずです。テーブルが追加されています。
Athenaのコンソールを開き、左メニューのDatabaseから対象のデータベース・テーブルを選択し、Preview tableを押すとデータが見れます。
Athena - Google Chrome 2020-04-02 12.57.54.png

まとめ

RedshiftのデータをParquet形式で保存するにはいくつかの方法があります。
その中でも、この方法では下記のメリットがあると思います。

  • データカタログへの登録まで自動化出来る
  • 開発・実装・環境構築作業が一切いらない
  • ジョブ管理も行う必要がない
  • Redshift以外にも40種を超えるデータをParquetで出力できる

以上、Redshift→S3+Athenaの移行がわずか5分程度の設定作業で実現できました。

参考

今回利用したプラグイン
* embulk-input-redshift
* embulk-output-s3_parquet

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?