ストーリー
田
田中VPoE
Step 1でデータ戦略とアーキテクチャの全体像を学んだ。ここからは具体的なコンポーネントの設計に入る。まずはデータレイクだ
あなた
データレイクは「あらゆるデータをそのまま格納する場所」ですよね。S3やGCSに何でも放り込む
あ
田
田中VPoE
そうだ。ただし「何でも放り込む」だけだとデータスワンプになる。ディレクトリ構造、ファイルフォーマット、パーティショニング、アクセス制御。これらを戦略的に設計する必要がある
あなた
「とりあえずS3に入れておこう」はアンチパターンなんですね
あ
田
田中VPoE
まさにそうだ。データレイクの設計次第で、後段のDWHやMLパイプラインの効率が大きく変わる。特にファイルフォーマットとパーティショニング戦略は、クエリ性能に10倍以上の差を生むことがある
データレイクの設計原則
5つの設計原則
| 原則 | 説明 | 実装 |
|---|
| 不変性(Immutability) | 一度書き込んだデータは変更しない | Append-only、バージョニング |
| スキーマオンリード | 書き込み時にスキーマを強制しない | 読み取り時にスキーマを適用 |
| 階層構造 | 用途ごとにデータを整理 | Medallion(Bronze/Silver/Gold) |
| メタデータ管理 | データの所在と意味を追跡 | データカタログ、Glue Catalog |
| コスト最適化 | ストレージとクエリのコストを最小化 | ライフサイクルポリシー、圧縮 |
ストレージ設計
ディレクトリ構造
s3://company-data-lake/
│
├── bronze/ # 生データ(ソースそのまま)
│ ├── app_db/ # ソースシステム別
│ │ ├── orders/ # テーブル別
│ │ │ ├── year=2025/ # パーティション
│ │ │ │ ├── month=01/
│ │ │ │ │ ├── day=15/
│ │ │ │ │ │ ├── part-00000.parquet
│ │ │ │ │ │ └── _metadata.json
│ │ │ │ │ └── day=16/
│ │ │ │ └── month=02/
│ │ │ └── _schema/
│ │ │ └── schema_v1.json
│ │ ├── customers/
│ │ └── products/
│ ├── crm/
│ │ ├── accounts/
│ │ └── opportunities/
│ └── event_logs/
│ └── clickstream/
│
├── silver/ # クレンジング済みデータ
│ ├── orders/
│ ├── customers/
│ └── unified_events/
│
├── gold/ # ビジネスロジック適用済み
│ ├── revenue_mart/
│ ├── customer_360/
│ └── marketing_mart/
│
└── _system/ # システムメタデータ
├── audit_logs/
├── data_quality_reports/
└── lineage/
パーティショニング戦略
| 戦略 | 適用場面 | 例 | メリット |
|---|
| 日付パーティション | 時系列データ | year=2025/month=01/day=15/ | 日付範囲クエリが高速 |
| ソースパーティション | マルチソース | source=salesforce/ | ソース別の処理が容易 |
| リージョンパーティション | 地域別データ | region=jp/ | 地域別分析が効率的 |
| ハッシュパーティション | 均等分散 | partition=0/ 〜 partition=99/ | データスキューの回避 |
「パーティションの粒度は『最もよく使われるクエリパターン』に合わせる。日次バッチなら日付パーティション、リージョン別分析が多ければリージョンを第1パーティションにする」 — 田中VPoE
ファイルフォーマットの選択
主要フォーマット比較
| フォーマット | 形式 | 圧縮率 | クエリ性能 | スキーマ進化 | 適用場面 |
|---|
| Parquet | 列指向 | 高 | 高(列プルーニング) | 対応 | 分析クエリ、DWH連携 |
| ORC | 列指向 | 高 | 高 | 対応 | Hiveエコシステム |
| Avro | 行指向 | 中 | 中 | 強い | ストリーム処理、スキーマ変更が多い |
| JSON | テキスト | 低 | 低 | 柔軟 | ログ、API連携 |
| CSV | テキスト | 低 | 低 | なし | レガシー連携、インポート/エクスポート |
| Delta Lake | Parquet + ログ | 高 | 高 | ACID対応 | レイクハウス |
| Apache Iceberg | メタデータ層 | 高 | 高 | ACID対応 | レイクハウス(マルチエンジン) |
選択フローチャート
ファイルフォーマット選択:
データの用途は?
├── 分析クエリ(SELECT特定列) → Parquet / Iceberg
├── ストリーム処理 → Avro
├── ログの一時保存 → JSON(→ 後でParquetに変換)
├── ACID トランザクションが必要 → Delta Lake / Iceberg
└── レガシー連携 → CSV(最小限に)
データライフサイクル管理
ストレージクラスの活用(AWS S3)
| ステージ | 保持期間 | ストレージクラス | コスト(GB/月) |
|---|
| アクティブ | 0-30日 | S3 Standard | $0.025 |
| ウォーム | 30-90日 | S3 IA | $0.0125 |
| コールド | 90-365日 | S3 Glacier IR | $0.004 |
| アーカイブ | 1年以上 | S3 Glacier DA | $0.00099 |
ライフサイクルポリシー例
{
"Rules": [
{
"ID": "bronze-lifecycle",
"Filter": { "Prefix": "bronze/" },
"Status": "Enabled",
"Transitions": [
{ "Days": 90, "StorageClass": "STANDARD_IA" },
{ "Days": 365, "StorageClass": "GLACIER_IR" }
]
},
{
"ID": "gold-lifecycle",
"Filter": { "Prefix": "gold/" },
"Status": "Enabled",
"Transitions": [
{ "Days": 180, "StorageClass": "STANDARD_IA" }
]
}
]
}
セキュリティとアクセス制御
レイヤー別のアクセス制御
| レイヤー | 対象 | 制御方法 |
|---|
| バケットレベル | S3バケット全体 | バケットポリシー、パブリックアクセスブロック |
| プレフィックスレベル | ディレクトリ | IAMポリシーのResource条件 |
| 行・列レベル | テーブル内のデータ | Lake Formation、カラムマスキング |
| 暗号化 | 保存データ | SSE-S3、SSE-KMS |
まとめ
| ポイント | 内容 |
|---|
| 設計原則 | 不変性、スキーマオンリード、階層構造、メタデータ管理、コスト最適化 |
| ストレージ設計 | ソース別・テーブル別・日付パーティションのディレクトリ構造 |
| ファイルフォーマット | 分析にはParquet/Iceberg、ストリームにはAvro、ACID対応にはDelta Lake |
| ライフサイクル | ストレージクラスの段階的移行でコスト最適化 |
チェックリスト
次のステップへ
次は「データウェアハウスの設計」を学びます。BigQuery、Snowflake、RedshiftなどのクラウドDWHの特性と、効率的なデータモデリングを身につけましょう。
推定読了時間: 30分