📥 STEP 13: Redshiftへのデータロード
COPYコマンドを使いこなし、S3から効率的にデータをロードしよう
📋 このステップで学ぶこと
- COPYコマンドの基本と詳細オプション
- S3からのデータ取り込み方法(CSV、JSON、圧縮)
- バルクロードの最適化テクニック
- エラーハンドリングとトラブルシューティング
- 実践演習:100万件のデータロード
🎯 このステップのゴール
このステップを終えると、COPYコマンドを使って大量データを高速にロードできるようになります。INSERT文との違いを理解し、最適化テクニックを身につけましょう。
🎯 1. COPYコマンドの基本
COPYコマンドとは
COPYコマンドは、Redshiftに大量データを高速にロードするための専用コマンドです。INSERT文と比べて圧倒的に速いため、Redshiftでは「データロード=COPYコマンド」と覚えてください。
💡 例え話:引っ越し業者 vs 自分で運ぶ
INSERT vs COPY の比較
📊 処理時間の比較(実測値)
| データ量 | INSERT文 | COPYコマンド | 速度差 |
|---|---|---|---|
| 1万件 | 30秒 | 2秒 | 15倍 |
| 10万件 | 5分 | 10秒 | 30倍 |
| 100万件 | 45分 | 1分 | 45倍 |
| 1000万件 | 7時間 | 10分 | 42倍 |
結論:Redshiftでは、常にCOPYコマンドを使いましょう!
COPYコマンドが速い理由
⚡ 5つの高速化ポイント
- 並列処理:全ワーカーノードが同時にデータをロード
- 直接S3接続:各ノードが直接S3からデータを取得
- バルク処理:1件ずつではなく、まとめて処理
- 圧縮対応:gzip、bz2などの圧縮ファイルを直接ロード
- 最適化I/O:ディスク書き込みを最適化
基本的なCOPYコマンド構文
COPYコマンドの仕組み
🔄 データロードの流れ
📄 2. S3からのデータ取り込み
CSV形式のロード
📝 基本的なCSVロード
📝 各オプションの意味
💡 よくある形式の例
JSON形式のロード
📝 JSON Lines形式(1行1JSON)
⚠️ JSONパス指定(キー名が異なる場合)
圧縮ファイルのロード
🗜️ 圧縮のメリット
- 転送時間短縮:S3からの転送量が減る
- S3料金削減:保存容量が減る
- ネットワーク負荷軽減:帯域を効率的に使用
📝 gzip圧縮ファイルのロード
📝 その他の圧縮形式
複数ファイルの並列ロード
💡 例え話:複数車線の高速道路
📝 プレフィックスで複数ファイルを指定
注意:s3://my-bucket/data/sales(/なし)とs3://my-bucket/data/sales/(/あり)は異なります。/なしは「sales」という名前のファイルを指します。
マニフェストファイルの使用
📝 ロードするファイルを明示的に指定
マニフェストを使う場面:
- フォルダ内の一部のファイルだけロードしたい
- 複数のS3バケットからロードしたい
- ロードするファイルを厳密に制御したい
⚡ 3. バルクロードの最適化
最適化の4つのポイント
1️⃣ ファイルを分割
1つの大きなファイルより、複数の小さなファイルの方が速い。推奨:100MB〜1GB/ファイル
2️⃣ 圧縮する
gzip圧縮で転送量を削減。S3からの転送が速くなる。推奨:gzip
3️⃣ 並列度を上げる
ファイル数 ≥ ノード数 × スライス数。全スライスが並列処理できる。
4️⃣ ソート順を揃える
SORTKEYの順番でデータをソートしてからロード。VACUUM不要。
最適なファイル分割数の計算
📊 計算式
💡 具体例:10GBのデータをロード
圧縮形式の比較
| 形式 | 圧縮率 | 解凍速度 | 推奨度 | コメント |
|---|---|---|---|---|
| gzip | 高い(70-80%削減) | やや遅い | ⭐⭐⭐ | 最も一般的、バランス良い |
| zstd | 高い(75-85%削減) | 速い | ⭐⭐⭐ | 最新、高速かつ高圧縮 |
| lzop | 低い(50-60%削減) | 最速 | ⭐⭐ | 速度重視の場合 |
| bzip2 | 最高(80-90%削減) | 遅い | ⭐ | 圧縮率重視、時間かかる |
STATUPDATE と COMPUPDATE
📊 STATUPDATE:統計情報の更新
🗜️ COMPUPDATE:圧縮エンコーディングの設定
🔧 4. エラーハンドリング
エラー許容設定
⚠️ MAXERROR:エラーを許容してロード継続
エラーログの確認
📋 STL_LOAD_ERRORSテーブル
📋 ロード履歴の確認
よくあるエラーと対処法
❌ エラー1:Access Denied
原因:
- IAM Roleに権限がない
- S3バケットのアクセス許可が不足
- S3パスが間違っている
対処法:
- IAM RoleにAmazonS3ReadOnlyAccessをアタッチ
- S3バケットポリシーを確認
- S3パスを再確認(大文字小文字に注意)
❌ エラー2:Extra column(s) found
原因:CSVのカラム数がテーブルのカラム数より多い
対処法:
- テーブル定義を確認:
SELECT * FROM pg_table_def WHERE tablename = 'sales'; - CSVのカラム数を確認:
head -1 sales.csv | tr ',' '\n' | wc -l - IGNOREHEADERオプションを確認
❌ エラー3:Invalid digit, Value, or Sign
原因:データ型が合わない(例:文字列を数値列にロード)
対処法:
- エラー行を確認:
SELECT * FROM stl_load_errors ORDER BY starttime DESC LIMIT 1; - CSVのデータをクレンジング(空文字、特殊文字の除去)
- 一時的にMAXERRORでエラーを許容してロード
❌ エラー4:Delimiter not found
原因:指定した区切り文字がファイルに存在しない
対処法:
- ファイルの区切り文字を確認:
head -1 sales.csv - DELIMITERオプションを修正
- タブ区切りなら
DELIMITER '\t'
トランザクション管理
🔄 COPYコマンドの原子性(Atomicity)
💪 5. 実践演習:100万件のデータロード
100万件の売上データをRedshiftに効率的にロードしてください
要件:
- 100万件のサンプルデータを作成
- データを複数ファイルに分割(最適化)
- gzip圧縮してS3にアップロード
- COPYコマンドでRedshiftにロード
- ロード時間を測定
【解答例】
1. サンプルデータ作成(Python)
2. データを8ファイルに分割&圧縮
3. S3にアップロード
4. Redshiftにテーブル作成
5. COPYコマンドで高速ロード
6. 結果確認
⏰ 演習終了後は必ずクラスターを一時停止!
Redshiftコンソール → クラスター選択 → アクション → クラスターを一時停止
📝 STEP 13 のまとめ
✅ このステップで学んだこと
- COPYコマンドは大量データを高速にロードする専用コマンド
- INSERT文より20〜50倍高速
- CSV、JSON、圧縮ファイルなど様々な形式に対応
- ファイルを分割して並列ロードすると最速
- エラーハンドリングでMAXERRORやSTL_LOAD_ERRORSを活用
💡 重要ポイント
- Redshiftへのデータロードは常にCOPYコマンドを使う
- ファイル数 = ノード数 × スライス数 × 2〜4 が最適
- gzip圧縮で転送量を削減
- 初回ロードはCOMPUPDATE ON、追加ロードはOFF
- エラーはSTL_LOAD_ERRORSで確認
🎯 次のステップの準備
次のSTEP 14では、「Redshiftクエリ最適化」を学びます。
ディストリビューションキー、ソートキー、EXPLAIN、VACUUMなどで性能を最大化しましょう!
📝 理解度チェック
COPYコマンドがINSERT文より速い理由を3つ挙げてください。
【解答例】
- 並列処理:全ワーカーノードが同時にデータをロードする
- 直接S3から読み込み:各ノードが直接S3からデータを取得、ネットワーク帯域を最大活用
- バルク処理:1件ずつ処理せず、大量データをまとめて処理する
以下のCOPYコマンドの各オプションの意味を説明してください。
【解答】
- CSV:CSV形式のファイル
- GZIP:gzip圧縮されたファイル
- IGNOREHEADER 1:最初の1行(ヘッダー行)をスキップ
- MAXERROR 100:100件までのエラーを許容(101件目でロード失敗)
10GBのデータを2ノード(各2スライス)のRedshiftクラスターにロードする場合、最適なファイル分割数を計算してください。
【解答】
❓ よくある質問
・1GB(圧縮後):1〜2分
・10GB(圧縮後):5〜10分
・100GB(圧縮後):30分〜1時間
最適化(ファイル分割、圧縮)でさらに高速化できます。
対策:MAXERRORオプションで一部のエラーを許容、または事前にサンプルデータでテスト。
追加ロードで圧縮エンコーディングが変わると、既存データと新データで圧縮方式が異なり、クエリ性能が低下する可能性があります。そのため、追加ロードではCOMPUPDATE OFFを推奨します。
・RedshiftとS3が同じリージョン:データ転送料金なし
・RedshiftとS3が別リージョン:$0.02/GB
コスト削減のため、RedshiftとS3は必ず同じリージョンに配置しましょう。
SELECT * FROM stl_load_errors ORDER BY starttime DESC LIMIT 10;ファイル名、行番号、エラー理由が確認できます。
学習メモ
クラウドデータ基盤(AWS・GCP) - Step 13