重複許容レイヤーのテーブル 重複排除済みレイヤーのテーブル PK value updated_at 001 B 2023-12-04 002 B 2023-01-04 003 A 2023-11-04 全量レコードを対象に 重複排除したテーブルを CTASで作成 PK value updated_at 001 A 2022-01-12 002 A 2022-10-05 003 A 2023-11-04 001 B 2023-12-04 002 B 2023-01-04 パフォーマンス Hiveテーブル
重複許容レイヤーのテーブル 重複排除済みレイヤーのテーブル PK value updated_at 001 B 2023-12-04 002 B 2023-01-04 003 A 2023-11-04 全量レコードを対象に 重複排除したテーブルを CTASで作成 データ量の増加に伴いスキャン量が増加 →Athenaでリソース不足のエラーが多発 PK value updated_at 001 A 2022-01-12 002 A 2022-10-05 003 A 2023-11-04 001 B 2023-12-04 002 B 2023-01-04 … … … 001 ZZ 2026-01-05 パフォーマンス Before: データ量の増加に伴うAthenaの処理能力の限界
差分更新の実装 18 PK value updated_at 差分テーブル 重複許容レイヤーのテーブル 重複排除済みレイヤーのテーブル PK value updated_at 001 A 2022-01-12 002 A 2022-10-05 003 A 2023-11-04 001 B 2023-12-04 002 B 2023-01-04 PK value updated_at 001 B 2023-12-04 002 B 2023-01-04 003 A 2023-11-04 パフォーマンス Hiveテーブル Icebergテーブル
004 A 2026-01-02 001 ZZ 2026-01-04 重複許容レイヤーのテーブル 重複排除済みレイヤーのテーブル PK value updated_at 001 A 2022-01-12 002 A 2022-10-05 003 A 2023-11-04 001 B 2023-12-04 002 B 2023-01-04 004 A 2026-01-02 001 ZZ 2026-01-04 PK value updated_at 001 B 2023-12-04 002 B 2023-01-04 003 A 2023-11-04 新規追加された ファイルをコピー raw table layer delta table layer 差分テーブル パフォーマンス MERGE INTOのsource tableのスキャン量を減らすために差分テーブルを作成 After: 差分更新の実装 Crawler
差分データはMERGE INTO後に削除することでスキャン量を一定に保つ 20 PK value updated_at 004 A 2026-01-02 001 ZZ 2026-01-04 重複許容レイヤーのテーブル 重複排除済みレイヤーのテーブル PK value updated_at 001 A 2022-01-12 002 A 2022-10-05 003 A 2023-11-04 001 B 2023-12-04 002 B 2023-01-04 004 A 2026-01-02 001 ZZ 2026-01-04 PK value updated_at 001 ZZ 2026-01-04 002 B 2023-01-04 003 A 2023-11-04 004 A 2026-01-02 MERGE INTOが成功したら削除すること でスキャン量を一定に保つ raw table layer delta table layer MERGE INTOで更新 (実装はdbtのincremental更新を 用いてシンプルに) 差分テーブル パフォーマンス After: 差分更新の実装
リソース * ロールの組み合わせの数の爆発が発生 リソースの単位が細かい • 「個人情報を含む列はアクセス禁止」などカラムレベルで細かく制御したい。 • リソース * ロールの組み合わせの数がさらに増える。 そもそも...なぜデータ基盤の権限設計は難しいのか? 28 id type email 156 A [email protected] 890 B [email protected] id type email 156 A [email protected] 890 B [email protected] Policy • master_a_memberのemailを許可 • master_b_memberのemailを許可 • … id type email 156 A [email protected] 890 B [email protected] master_a_member id type email 123 X [email protected] 999 Y [email protected] master_b_member ガバナンス Policy • master_a_memberのemailを禁止 • master_b_memberのemailを禁止 • … カラムを直接書くと膨大な量になる Before
テーブルに対しては「どんな情報であるか」だけを考える。 • ロールに対しては「どんな情報にアクセスして良いか」だけを考える。 • →認知負荷を下げられる。テーブル追加の度にPolicyを更新しなくて良い。 After: Tagを使った抽象化で管理をシンプルに 29 id type email 156 A [email protected] 890 B [email protected] id type email 156 A [email protected] 890 B [email protected] id type email 156 A [email protected] 890 B [email protected] master_a_member id type email 123 X [email protected] 999 Y [email protected] master_b_member 「どんな情報であるか」のTagを付与 ガバナンス LF Permission • Tag: pii=limitedのSELECTを許可 LF Permission • Tag: pii=limitedのSELECTを禁止 pii=limited pii=limited 「どんな情報であるか」にアクセスして良いかを記述 After