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](https://qiita-image-store.s3.amazonaws.com/0/61228/b87154f7-6c2d-23af-adbd-13893079af69.png)

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

## 準備するもの
所要時間は、作業時間5分、転送時間60分程です。

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

## 流れ
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を選択し、転送設定を作成します。
<img width="1680" alt="qiita_step_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/61228/0d09b8a4-1b11-e615-7753-7ad6f8759acb.png">
すると転送設定の作成画面に遷移します。
<img width="1680" alt="qiita_step_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/61228/7eec2788-9a82-fa7c-c3a8-e89438146ecc.png">

### 1-2. 転送元Redshiftの設定を入力
「接続情報を追加」を押し、予め用意したRedshiftの接続情報を、フォームに従って入力・保存します。
（AWSクレデンシャルの入力項目がありますが、今回はS3へのUNLOADは行わないため、用意したIAM Userか適当な文字列を入力して下さい）
<img width="926" alt="qiita_step_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/61228/d3985e4a-90f1-e0c9-135e-e383b5d587a5.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61228/fef4e9e1-dfc1-9955-da15-ca3fbf7058ea.png)

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

|項目|値|
|:--:|:--:|
|S3接続情報|再読込ボタンを押すと、登録した接続情報が出現するので選択して下さい|
|バケット|予め用意した転送先バケット名を入力します|
|パスプレフィックス|ログの出力先パスプレフィックスを指定します。ここでは`qiita-20190326/`と入力しておきます。|
|リージョン|S3のリージョンを入力します。今回は東京リージョンにバケットを作ったので、 `ap-northeast-1` と入力します。|
|圧縮方式|今回は圧縮ありで `Snappy` を選びました。他にもGzipなど計6種の圧縮方法に対応しています|
※パスプレフィックスでは`test_log/date=$current_date$`のように変数を埋め込むことも出来ます。転送日時を使って日付のパーティションを切るような用途で使えます。

### 1-4. プレビュー
ここまでで、設定は完了です。保存してプレビューに進みます。
自動データ設定で列名・データ型などが正しく認識されていることが確認できました。
<img width="1920" alt="qiita_step_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/61228/e795c245-8ddc-4172-506a-2e619c3c9495.png">

### 1-5. 詳細設定（Glueデータカタログへの登録設定）
プレビュー画面の下の方に詳細設定がありますが、RedshiftのSSL設定とか、S3 Parquetのブロックサイズとかを変更したければこちらをいじります。
また、Athenaでのクエリ実行に必須である**「Glueデータカタログ」への登録も自動化出来ます**。
<img width="1920" alt="qiita_step_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/61228/49d2613c-229a-3614-2271-6a8491fda376.png">
※JSON型、タイムスタンプ型の列がある場合はここで「カラム設定」を行う必要があります

### 1-6. スケジュール・通知設定
定期実行したり、エラー時にSlack通知したり出来るみたいですが、今回はスキップで。

### 1-7. ジョブ実行
設定が完了したら、右上のボタンから「実行」を押して、転送ジョブを実行します。
1億レコードですが、だいたい20分くらいでParquet形式での保存が完了しました。
<img width="1920" alt="qiita_step_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/61228/f3eed859-570e-9318-0710-8a649438b0aa.png">

## 2. S3上のデータをGlue Crawlerでデータカタログ化（テーブル作成）
本来ならこの部分の作業が発生すると思っていたのですが、trocco側で自動でテーブル作成を行ってくれるので、作業不要でした(^_^;)

## 3. Athenaでクエリ実行
ここまででAthenaでクエリ実行を行う環境が整っているはずです。テーブルが追加されています。
Athenaのコンソールを開き、左メニューのDatabaseから対象のデータベース・テーブルを選択し、Preview tableを押すとデータが見れます。
![Athena - Google Chrome 2020-04-02 12.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61228/436a97a7-3336-2e7e-1277-e183fcf02f9f.png)


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

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

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

## 参考
今回利用したプラグイン
* [embulk-input-redshift](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-redshift)
* [embulk-output-s3_parquet](https://github.com/civitaspo/embulk-output-s3_parquet)