Sabtu–Minggu — Hands-on Data Catalog, Lineage & Governance Policy
Sabtu 4 jam + Minggu 4 jam. Kelanjutan langsung minggu_5.md bagian “Mini Project: Data Catalog, Lineage & Governance Layer untuk E-Commerce Pipeline” — upgrade dari materi/minggu_4/latihan_dq_streaming_mini_project.md.
Repo yang sama: tetap
ecommerce-etl-pipeline. Tidak ada rename atau folder pipeline baru — minggu ini murni menambah lapisan dokumentasi & tooling governance di atas apa yang sudah dibangun.
Tujuan Belajar
- Setup OpenMetadata via Docker dan meng-ingest metadata dari warehouse Postgres yang sudah ada
- Melengkapi metadata manual: deskripsi bisnis, tag PII, ownership di UI catalog
- Mendokumentasikan lineage end-to-end (raw CSV → Spark → star schema → warehouse)
- Menulis
GOVERNANCE.mdyang mencakup ownership, quality policy, PII handling, dan access policy
Untuk Instruktur
Beda dari sesi hands-on minggu-minggu sebelumnya, sesi ini lebih berat ke dokumentasi & konfigurasi UI dibanding menulis kode — wajar dan sesuai sifat governance (00_overview.md). Kalau resource laptop peserta terbatas untuk menjalankan OpenMetadata (butuh ~6-8GB RAM untuk Docker), opsi fallback: fokuskan waktu ke Bagian 2 (lineage diagram manual + GOVERNANCE.md) yang tidak bergantung tool apapun, dan Bagian 1 cukup dipahami konsepnya + dicoba di environment dengan resource lebih besar kalau ada.
Bagian 1 (Sabtu, 4 jam): Setup OpenMetadata & Ingest Metadata
Setup (±1 jam)
mkdir -p governance && cd governance
curl -sL -o docker-compose-openmetadata.yml \
https://github.com/open-metadata/OpenMetadata/releases/download/1.5.0-release/docker-compose.yml
docker compose -f docker-compose-openmetadata.yml up -d
Tunggu beberapa menit (banyak service internal yang harus siap), lalu buka http://localhost:8585 — login default admin@open-metadata.org / admin (ganti password ini kalau dipakai di luar konteks belajar lokal).
Ingest Metadata dari Postgres (±1.5 jam)
Opsi A — lewat UI (lebih visual, cocok untuk eksplorasi pertama kali):
- Settings → Services → Databases → Add New Service → pilih
Postgres - Isi koneksi: host
host.docker.internal, port5432, databasepostgres, username/password sesuaipg-belajar(Minggu 1) - Add Ingestion → pilih
Metadata Ingestion→ jalankan sekali (manual trigger) - Setelah selesai, buka Explore → cari
fact_sales/dim_customer/dst. — skema (technical metadata,hari_2_data_catalog_metadata.md) sudah otomatis terisi dari introspeksi database
Opsi B — lewat CLI/YAML (lebih reproducible, bisa disimpan sebagai kode di repo):
# governance/postgres_ingestion.yaml
source:
type: postgres
serviceName: ecommerce-warehouse
serviceConnection:
config:
type: Postgres
username: postgres
password: belajar
hostPort: host.docker.internal:5432
database: postgres
sourceConfig:
config:
type: DatabaseMetadata
sink:
type: metadata-rest
config: {}
workflowConfig:
openMetadataServerConfig:
hostPort: http://localhost:8585/api
authProvider: openmetadata
securityConfig:
jwtToken: "<ambil dari Settings > Bots > ingestion-bot di UI OpenMetadata>"
pip install "openmetadata-ingestion[postgres]"
metadata ingest -c governance/postgres_ingestion.yaml
Opsi B lebih disarankan untuk repo portfolio — file postgres_ingestion.yaml yang tersimpan di git sendiri adalah bentuk dokumentasi (“begini cara metadata di-refresh”), sesuatu yang tidak didapat kalau ingestion cuma dilakukan sekali lewat klik UI.
Lengkapi Metadata Manual (±1.5 jam)
Untuk tiap tabel (fact_sales, dim_customer, dim_product, dim_date) di UI OpenMetadata, isi (business metadata, hari_2_data_catalog_metadata.md):
| Field | Isi untuk fact_sales (contoh) |
|---|---|
| Description | “1 baris = 1 item produk dalam 1 invoice (grain: order item level). is_return=True menandakan pembatalan/retur (invoice diawali ‘C’).” |
| Owner | Nama kamu (atau tim hipotetis “Data Engineering Team”, sesuai hari_4_stewardship_quality_governance.md) |
| Tags | PII (karena mengandung customer_id) — lihat cara tag kolom spesifik di bawah |
| Glossary Term | Kalau OpenMetadata glossary sudah di-setup: “Net Revenue = revenue dari baris is_return=False saja” |
Tag PII di level kolom (bukan cuma level tabel) — buka kolom customer_id di fact_sales/dim_customer, tambahkan tag PII.Sensitive (tag bawaan OpenMetadata) — ini yang nanti dirujuk di GOVERNANCE.md Bagian 2 sebagai bukti kolom PII sudah teridentifikasi & terdokumentasi secara sistematis, bukan cuma disebutkan di teks bebas.
Deliverable Sabtu
- OpenMetadata jalan,
fact_sales/dim_customer/dim_product/dim_datesudah ter-ingest (technical metadata otomatis terisi) - Business description terisi untuk keempat tabel
customer_id(difact_salesdandim_customer) sudah ditag PII- Owner terisi untuk keempat tabel
- Screenshot halaman salah satu tabel (untuk dipakai di README, sesuai
minggu_5.md)
Bagian 2 (Minggu, 4 jam): Dokumentasi Lineage & GOVERNANCE.md
Tahap 2: Lineage Diagram (±1.5 jam)
Sesuai hari_3_data_lineage.md, buat table-level lineage diagram manual (draw.io/dbdiagram.io), simpan sebagai governance/lineage_diagram.png dan diagrams/data_lineage.png (boleh file yang sama, direferensikan dari 2 tempat). Ilustrasi referensi:
Opsional (bonus, tidak wajib): kalau ingin coba lineage otomatis, integrasikan OpenLineage dengan Airflow (apache-airflow-providers-openlineage) — begitu terpasang, tiap run DAG otomatis memancarkan event lineage ke OpenMetadata/Marquez tanpa perlu digambar manual. Ini di luar cakupan wajib mini project (setup tambahan cukup signifikan), tapi baik diketahui ada sebagai opsi produksi yang lebih robust dibanding diagram statis — dibahas konsepnya di hari_3_data_lineage.md.
Tahap 3: Tulis GOVERNANCE.md (±2 jam)
Buat governance/GOVERNANCE.md dengan judul # Data Governance — ecommerce-etl-pipeline, diikuti 4 bagian berikut:
1. Data Ownership
## Data Ownership
| Dataset | Owner | Steward | Custodian |
|--------------|-----------------------|---------|---------------------------|
| fact_sales | Data Engineering Team | (kamu) | Platform Team (hipotetis) |
| dim_customer | Data Engineering Team | (kamu) | Platform Team (hipotetis) |
| dim_product | Data Engineering Team | (kamu) | Platform Team (hipotetis) |
| dim_date | Data Engineering Team | (kamu) | Platform Team (hipotetis) |
Lihat `materi/minggu_5/hari_4_stewardship_quality_governance.md` untuk definisi tiap peran.
2. Data Quality Policy
## Data Quality Policy
Semua data yang masuk `fact_sales` harus lolos `great_expectations/expectations/ecommerce_suite.json`
sebelum di-load ke warehouse (fail-fast, lihat `dags/ecommerce_etl_dag.py`). Ringkasan aturan:
- **Completeness**: `customer_id`, `invoice` tidak boleh null
- **Uniqueness**: kombinasi `invoice` + `stock_code` tidak boleh duplikat
- **Validity**: `unit_price > 0`, `quantity != 0`, `country` sesuai allowlist
- **Consistency**: `revenue == quantity * unit_price`
Proses eskalasi kalau check gagal: lihat `materi/minggu_5/hari_4_stewardship_quality_governance.md`
bagian "Proses Eskalasi".
3. PII Handling Policy
## PII Handling Policy
Kolom PII yang teridentifikasi (tag `PII` di OpenMetadata, lihat `governance/`):
- `customer_id` (direct identifier)
- `country` dikombinasikan dengan pola transaksi (quasi-identifier) — lihat
`materi/minggu_5/hari_5_compliance_privacy.md`
Aturan:
- `customer_id` di-**pseudonymize** (hash + salt tersimpan terpisah) untuk data yang diekspor
ke tim di luar Data Engineering (mis. tim data science eksternal)
- Tidak ada ekspor data mentah (raw) ke pihak eksternal tanpa proses masking/anonymization
- Retensi: data mentah (`data/raw/`) disimpan maksimal 2 tahun (kebijakan hipotetis, sesuaikan
dengan kebutuhan bisnis/regulasi sungguhan)
4. Access Policy (Hipotetis)
## Access Policy (Hipotetis)
| Role | fact_sales/dim_* (agregat) | customer_id asli | Raw data |
|---|---|---|---|
| Data Engineer | Full access | Full access | Full access |
| Analyst | SELECT only | Pseudonymized only | Tidak ada akses |
| Eksternal/Vendor | Agregat saja (via laporan) | Tidak ada akses | Tidak ada akses |
Sesuaikan isi tabel/kebijakan di atas dengan keputusan kamu sendiri — yang penting format dan kelengkapan (4 bagian: ownership, quality policy, PII handling, access policy) sesuai spesifikasi minggu_5.md, bukan menyalin persis contoh ini.
Update README.md (±30 menit)
Tambahkan section baru “Data Governance”:
- Screenshot halaman tabel di OpenMetadata (metadata & tag PII terisi)
- Link ke
GOVERNANCE.md - Diagram lineage end-to-end (
diagrams/data_lineage.png)
Struktur Repo Final (Update dari Minggu 4)
ecommerce-etl-pipeline/
├── README.md
├── GOVERNANCE.md # baru
├── dags/
│ └── ecommerce_etl_dag.py
├── spark_jobs/
│ ├── clean_transform.py
│ └── build_star_schema.py
├── great_expectations/
│ ├── build_suite.py
│ └── expectations/
│ └── ecommerce_suite.json
├── streaming-demo/
│ ├── producer.py
│ └── consumer.py
├── governance/ # baru
│ ├── docker-compose-openmetadata.yml
│ ├── postgres_ingestion.yaml
│ └── lineage_diagram.png
├── data/
│ ├── raw/
│ └── warehouse/
├── Dockerfile
├── docker-compose.yml
└── diagrams/
├── star_schema.png
├── pipeline_architecture_v2.png
└── data_lineage.png # baru
Kriteria “Selesai” untuk Minggu 5
- OpenMetadata jalan dan berhasil meng-ingest metadata dari warehouse Postgres
- Keempat tabel (
fact_sales,dim_customer,dim_product,dim_date) punya business description, owner, dan tag PII di kolom yang relevan diagrams/data_lineage.pngmenunjukkan alur lengkap dari raw CSV sampai warehouse (dan opsional sampai streaming demo)GOVERNANCE.mdberisi 4 bagian lengkap: ownership, data quality policy, PII handling policy, access policy- Bisa menjelaskan ke orang lain: kenapa
customer_idbutuh pseudonymization (bukan anonymization) untuk kasus tim data science yang butuh grouping per customer (hari_5_compliance_privacy.md), dan siapa yang bertanggung jawab kalaudata_quality_checkgagal (hari_4_stewardship_quality_governance.md)
Kalau semua tercentang, lanjut ke minggu_6.md — repo yang sama akan dimigrasikan ke cloud platform (object storage, IAM, cloud data warehouse), di mana kebijakan akses & PII handling yang sudah didokumentasikan minggu ini akan diterapkan secara teknis sungguhan lewat IAM policy cloud provider.