【Redshift】約1TBのデータをS3にUNLOADしてみた

# 背景・目的
AthenaでPartition Indexの検証を行うため、以前、[こちら](https://qiita.com/zumax/items/38f1723908ea94be2eaf)で用意したRedshiftのデータを再利用し環境を準備します。
また、UNLOADに要する時間を短縮するには、「1.何がポイントか？」、「2.どれだけ効果があるか」を検証します。

# サマリ
- 以前、[こちら](https://qiita.com/zumax/items/84534883f8ba8ffd0a41)で試したUNLOADコマンドで、S3にデータをコピーしました。
- 今回の検証で利用したデータのサイズは、949GB。
- 検証では、スライス数とRowgroupsizeの組み合わせで6パターン試しました。
- 結果は下表に記載しました。
    - Rowgroupsizeによる違いは、ほとんど見られませんでした。

|パターン（スライス数-Rowgroupsize） |クラスタ数（スライス数） | Rowgroupsize |処理時間| 
|:-- |:-- |:-- |:-- |
|8スライス-32MB | 2（8） |32MB| 2h 30m|
|8スライス-128MB | | 128MB| 2h 30m |
|16スライス-32MB | 4（16）| 32MB|2h 4m|
|16スライス-128MB | | 128MB| 2h 2m|
|32スライス-32MB | 8(32)| 32MB| 1h 51m|
|32スライス-128MB | | 128MB|1h 51m |

- UNLOAD時間を短縮するポイントとして、ノード数（スライス数）を増やすこと。
- スライス数を倍になることで、おおよそ10%〜20%程度、速度が向上するようでした。

# 実践
## S3バケット作成
- 事前にバケットを作成しておきます。

## パーティションキーの選定
- 以下のクエリを実行し、パーティションキー候補のカーディナリティを確認しておきます。
    - パーティション数は、2,526になります。
    - レコード数の最小は、62,168件、最大は7,494,332件でした。

```
select l_shipdate,count(1)  from lineitem  group by l_shipdate order by 2 limit 1

===
l_shipdate  count
1992-01-02	62168

~~~~

select l_shipdate,count(1)  from lineitem  group by l_shipdate order by 2 desc limit 1

===
l_shipdate  count
1997-07-03	7494332

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/596c949a-6662-bab0-2867-9efb7a0c95aa.png)

## UNLOAD
1.以下のコマンドで、UNLOADします。
```
UNLOAD ('select * from lineitem')
TO 's3://{バケット名}/lineitem'
IAM_ROLE 'arn:aws:iam::{アカウント}:role/{IAMロール}'
PARTITION BY (l_shipdate) INCLUDE
PARQUET 
MANIFEST 
ALLOWOVERWRITE
Rowgroupsize {32 mb 〜 128 mb}
MAXFILESIZE 256 mb
REGION 'ap-northeast-1'
```

- 以下のオプションでUNLOADしています。
    - パーティションキーに、l_shipdateを指定。
        - INCLUDEで、ファイル内に含める。
    - Parquetファイル
    - 1ファイル256MBを上限とする。
    - Overwriteを許可。（デフォルトでは、S3にファイルがある場合、失敗する。）
    - Rowgroupsizeは、32MBと128MBとする。
        - 大きくすることで、行グループの数を減らしNW通信量が減らすことができる。

2.結果を確認します。想定通りカラム名=値でS3パスが出来ていました。
```
// manifestファイルが作成されています。
$ aws s3 ls {バケット名}/lineitem_8_128/ | grep -i manifest
2022-04-12 01:25:25    4515382 manifest
$ 


// S3パスは、l_shipdate=日付で出来ていました。
$ aws s3 ls {バケット名}/lineitem_8_128/ | head
                           PRE l_shipdate=1992-01-02/
                           PRE l_shipdate=1992-01-03/
                           PRE l_shipdate=1992-01-04/
                           PRE l_shipdate=1992-01-05/
                           PRE l_shipdate=1992-01-06/
                           PRE l_shipdate=1992-01-07/
                           PRE l_shipdate=1992-01-08/
                           PRE l_shipdate=1992-01-09/
                           PRE l_shipdate=1992-01-10/
                           PRE l_shipdate=1992-01-11/

// S3パスは、2526件（2527件- manifestファイル1件）で事前に調べた件数と一致しています。
$ aws s3 ls {バケット名}/lineitem_8_128/ | wc -l
    2527
$
```

3.ロードに要した時間は、[サマリ](https://qiita.com/zumax/items/7dacdccc6f46754f30fc#%E3%82%B5%E3%83%9E%E3%83%AA)にまとめました。

# 考察
- やはり、スライス数を増やし、並列度が増えることでUNLOADの速度は向上するようでした。
- 一気にUNLOADしたい場合は、Redshiftのスライス数を一時的に増やし（拡張し）、そのあと縮退するような運用にすると良いかもしれません。
- この結果が、何かの参考になれば幸いです。

# 参考
https://qiita.com/zumax/items/84534883f8ba8ffd0a41

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html

https://qiita.com/zumax/items/38f1723908ea94be2eaf