Checking access…

Built on Google Cloud
Executive summary

Recommendation at a glance

Operator location data, demographics and Maps POI already reside in GCP, but in a ; web/app browsing data remains in the on-prem NWK data lake. The current pipeline is duplicated across on-prem and GCP codebases, and daily location×web matching has no reliable, privacy-safe mechanism.

Consolidate on an all-Google lakehouse centred on BigQuery. A nightly on-prem edge job filters ineligible records and ships the raw eligible extract over Interconnect into a restricted GCS bucket. From there, Cloud DLP (Sensitive Data Protection) hashes and tokenizes identifiers using prebuilt de-identification templates, and a BQ Load job materializes the masked data into the BQ Lakehouse. From the lakehouse, BQ Enterprise Slots (100 reserved slots × 4hr/day) run the Omni Enterprise 5-step category pipeline — orchestrated by Cloud Composer — joining and aggregating the result against location, demographics and Maps POI data ingested zero-copy from the other team's BigQuery project via a listing. Aggregated output is pushed physically to the client and Eureka.

One codebase instead of two; a daily match delivered as an SLA-backed product; on-demand analytics answered in minutes inside BigQuery; and structural, not procedural, privacy end to end.

Top highlights

What matters most in this design

1
Location, demographics, POI and browsing data converge in a single governed platform — no more cross-environment engineering.
2
BQ Enterprise Slots (100 slots × 4hr/day, $17.60/day fixed) run the Omni Enterprise category pipeline — 6.6× cheaper than BQ On-Demand and 1.7× cheaper than Dataproc Serverless at 50% subscriber coverage.
01 · Architecture

Target state on the Google stack

Raw data moves up from the NWK lake into a restricted GCS bucket once a day; location, demographics and Maps POI data are ingested zero-copy from a different team's BigQuery project via a BigQuery Analytics Hub listing; masking, joining and aggregation all happen inside GCP. From there, data leaves GCP in two different ways: a physical, aggregated-only push to the client, and a second, separate zero-copy BigQuery Analytics Hub grant — published directly off the lakehouse — that lets Eureka and vendors query curated or aggregated data directly without a copy ever leaving the platform. Numbers map to the component cards below; red outlines mark the critical builds; red arrows mark physical egress, teal dashed arrows mark zero-copy sharing (both in, from the other team, and out, to Eureka/vendors).

ON-PREM · NWK DATA LAKE Web/App browsing events raw, remains on-prem (interim) 1 Nightly edge job eligibility filter only no masking on-prem raw eligible extract → Parquet 2 · STS over Interconnect GOOGLE CLOUD Location data different team's BigQuery · tokenized Demographics different team's BigQuery 8 Maps POI different team's BigQuery 3 GCS Bucket raw landing · restricted CMEK · SA-only IAM <48h lifecycle 4 Cloud DLP hash + tokenize MDN whitelist / eligibility check Sensitive Data Protection API 5 BQ Enterprise Slots 5-step category pipeline 100 slots × 4hr/day $17.60/day · fixed cost BQ Load (DLP-masked) → 5-step SQL pipeline on reserved slots 7 Analytics Hub Location, Demographics & Maps POI — zero-copy listing from another team's BQ 6 BigQuery Lakehouse curated (tokenized) + gold (24h) — published directly as Analytics Hub listings partitioned + clustered · k-anon Ad-hoc Analytics BigQuery Studio · notebooks on-demand slots · guardrails CONSUMERS 11 Client Delivery S3 push (STS) · SFTP aggregated only 12 Eureka Aggregated data + Analytics Hub listing 13 Vendor Access Aggregated data + Analytics Hub listing 9 Cloud Composer daily DAGs · GCS arrival sensors · SLA alerts · backfills — orchestrates every production job 10 Governance & privacy Dataplex catalog + DQ · Cloud KMS · policy tags · VPC-SC perimeter · CMEK Phase 3: Pub/Sub + Datastream replace the nightly file transfer — BQ Enterprise Slots process streaming windows continuously (14) Red arrow = physical copy leaves GCP · teal dashed = zero-copy Analytics Hub grant, no data moves
Critical build / configure Eureka / vendor facing GCP managed service On-prem (interim) Enrichment source Red arrow = physical egress Teal dashed = zero-copy Analytics Hub grant
02 · Components

What each section does — and what you must build

Cards outlined in red are the critical path: get these right and everything else is configuration.

1Nightly edge job CRITICAL BUILD

Runs inside the NWK lake. Applies eligibility filters only (opt-outs, ineligible MDNs/URLs) and writes the raw, filtered result as date-partitioned Parquet. No hashing, tokenization or masking happens on-prem — that work moves into GCP (component 4) so there is one governed place it runs, not two.

Spark/SQL filtering job; output contract (schema registry) versioned with the GCP side; no crypto library to maintain on-prem.

2Transfer: STS + Interconnect CRITICAL CONFIG

Storage Transfer Service agent pools pull the nightly Parquet drop over Dedicated/Partner Interconnect into the GCS bucket. Checksummed, resumable, bandwidth-capped. Ingress to GCP is free — you pay only the circuit.

agent pool on-prem, transfer job with manifest + checksum validation, private Google access, alert on missed transfer window.

3GCS Bucket

The landing place for the raw daily extract: a dedicated, tightly-scoped (not a general-purpose data lake bucket). It holds unmasked data only briefly — service-account-only IAM (no human read access), CMEK encryption at rest, VPC-SC perimeter, and a lifecycle policy that force-deletes objects within ~48 hours of successful processing. This short exposure window plus the perimeter is what makes it safe for raw data to touch GCP at all.

dedicated bucket per environment, IAM bound to the BQ Load job and DLP service accounts only, Pub/Sub event notification for arrival sensing, automatic lifecycle deletion.

4Cloud DLP — de-identification CRITICAL BUILD

The masking step runs as a : , called from the pipeline immediately after landing. Its de-identification templates provide CryptoHashConfig (one-way hash) and CryptoDeterministicConfig (format-preserving, reversible-with-key tokenization) out of the box, wrapped with a Cloud KMS key — no custom tokenization library to write or maintain. The same stage applies the eligibility/whitelist check against the reference table before anything is written to a durable zone.

DLP de-identification template (deterministic encryption for MDN, using a KMS-wrapped crypto key); whitelist reference table in BQ; pipeline step that calls the DLP API per batch.

5BQ Enterprise Slots — category pipeline CRITICAL BUILD

After Cloud DLP masks the raw extract, a BQ Load job materializes it into the lakehouse's curated zone. From there, BQ Enterprise Slots (100 reserved slots, Enterprise Edition at $0.044/slot-hr) run the 5-step Omni Enterprise category pipeline as BigQuery SQL jobs: (1) URL taxonomy lookup, (2) MSISDN identification scan, (3) web day-level aggregation into 5 tables, (4) foot traffic day-level aggregation into 5 tables, (5) category-level rollup. All steps run in a single 4-hour slot window per day ($17.60/day fixed — costs do not scale with data volume). Intermediate tables persist for 12 months with active/long-term BQ storage pricing (~$80/month steady-state). Cloud Composer orchestrates the slot reservation, job sequencing, and SLA alerting.

BQ Enterprise Slots reservation (100 slots, commitment-free or 1-year CUD); 5-table schema for web + foot day-agg intermediate layers; Composer DAG with arrival sensor, DQ gates between steps, retry logic, and slot release on completion.

6BigQuery lakehouse CRITICAL CONFIG

Single analytical home. Zones: (native tables, date-partitioned, clustered on tokenized MDN / geohash — materialized via Cloud DLP + BQ Load job, then processed by the BQ Enterprise Slots category pipeline), (24h aggregates, k-anonymity enforced). The GCP↔on-prem daily match is a plain BQ join on the shared token; the raw zone no longer persists here since raw data lives only briefly in the GCS bucket (component 3). The lakehouse also publishes curated and gold zones to Eureka (component 12) and vendors (component 13) — no separate sharing box in between.

dataset layout per zone/environment, partition expiry, policy tags on sensitive columns, authorized views for consumers, one Analytics Hub listing per consumer (Eureka, each vendor) published straight off this dataset.

7BigQuery Analytics Hub — cross-team ingestion CRITICAL BUILD

Location data, demographics and Maps POI are owned and maintained by a in their own BigQuery project — this pipeline doesn't copy or re-host that data. Instead, that team exposes it as a , and the BQ Enterprise Slots category pipeline (component 5) subscribes to the listing and reads it directly for the join and aggregation steps, zero-copy. There's nothing to build on the source side beyond agreeing the listing's schema and refresh cadence with the owning team; this pipeline only needs a subscription and read access on its own billing project.

subscribe to the owning team's data exchange listing, grant the BQ category pipeline service account read access on the subscribed dataset, agree refresh cadence/SLA with the source team, schema-change alerting.

8Maps POI enrichment

Maps POI reference data (POI-to-lat/long mapping) also lives in the other team's BigQuery project, refreshed there from the Google Maps Places API, and reaches this pipeline through the same Analytics Hub listing as location data and demographics (component 7) — not a separate build here.

confirm Places-licensing terms carry through the shared listing; no ingestion job to write on this side.

9Cloud Composer CRITICAL CONFIG

Owns every production schedule: waits for the on-prem drop, runs DLP de-identification + BQ Load, triggers the BQ Enterprise Slots 5-step category pipeline, runs BQ aggregate SQL, validates, publishes both to Client Delivery and to the Analytics Hub listings. SLAs, retries, backfill, and alerting live here — not in cron scripts.

one DAG per product (daily match, category pipeline, POI refresh, client delivery, Analytics Hub publish), arrival sensors, slot reservation acquire/release steps, SLA-miss alerts to chat/email, backfill runbook.

10Governance & privacy layer CRITICAL CONFIG

Dataplex (catalog, lineage, data quality), Cloud KMS (DLP crypto keys, CMEK), policy tags (column-level access), VPC Service Controls (perimeter so data can't be exfiltrated even by a compromised credential, and so the GCS bucket can never be reached from outside the pipeline's service accounts).

VPC-SC perimeter first (before the GCS bucket goes live), KMS key rotation, Dataplex DQ rules on curated zone, policy-tag taxonomy that also governs Analytics Hub listing eligibility.

11Client Delivery CRITICAL BUILD

The data the operator's hedge-fund clients receive through this path is the 24-hour, k-anonymous gold-zone aggregate — never row-level or tokenized data, no exceptions. Delivered per-fund, once daily: via Storage Transfer Service (GCS→S3 is a native STS job type), or for clients who require it. This is the route for clients without a GCP footprint of their own; clients who do have one are better served by component 13.

STS S3 transfer job per fund (or shared job, per-fund prefix); SFTP push job (Cloud Run + paramiko/similar) for SFTP-only clients; delivery manifest + checksum in the completion notice.

12Eureka Delivery

Eureka builds and operates the client-facing dashboards, so Eureka needs its own access to the lakehouse — via a listing published directly off the lakehouse (component 6), the recommended default: zero-copy, revocable, and able to carry gold (and, where justified, curated) data without any file ever moving. No separate infrastructure to build beyond the listing itself.

Eureka-facing listing on the lakehouse's data exchange (component 6), scoped to gold by default; grant curated access only per documented need.

13Vendor Access

The same Analytics Hub mechanism, extended to who operate their own GCP project — hedge funds, distribution partners, the Omni product line. Rather than standing up a bespoke S3/SFTP feed per vendor, each gets its own revocable listing off the lakehouse (component 6), which can be gold-only or, for vetted partners with a signed data agreement, curated-level. This is the preferred path for any consumer that already lives in GCP; Client Delivery (component 11) remains the fallback for those who don't.

one listing per vendor with its own entitlement and audit trail; default gold-only, curated by exception with sign-off.

14Phase 3: streaming ingestion

When internet browsing data moves in fully: Pub/Sub (events) or Datastream (CDC) stream records directly into BQ via the Storage Write API. Cloud DLP de-identification runs on micro-batches; BQ Enterprise Slots process continuous windows rather than a daily batch. Nightly batch becomes just another window size — the SQL category pipeline is unchanged; only the trigger cadence shifts.

Pub/Sub topic + BQ subscription with DLP inspection, continuous Composer DAG trigger on record count thresholds, backfill of history via STS, dual-run validation before on-prem ETL retirement.
03 · Justification

Why this is the right architecture

Four principles drive the design, and every rejected alternative fails at least one of them.

Data gravity, respected

  • Location, demographics and Maps POI data (large, sensitive, already in a different team's BQ project) never moves — the BQ Enterprise Slots pipeline reads it zero-copy via an Analytics Hub listing. Only the raw eligible browsing extract travels up, into a restricted GCS bucket — nothing sensitive travels back down.
  • BigQuery Omni and federated queries cannot reach an on-prem Hadoop lake, so "query in place across both" is not technically available. Push-up extract is the only sound daily pattern.

BQ-native economics

  • BQ Enterprise Slots (100 slots, $0.044/slot-hr) are reserved and cost $17.60/day fixed — the cost doesn't scale with data volume. At 50% subscriber coverage (18.6 TB/day scanned), Dataproc Serverless would cost ~$30.70/day; BQ On-Demand ~$116/day. Enterprise Slots saves ~$34K over 5 years vs Dataproc.
  • BQ, STS, Composer, and Cloud DLP are all managed: no cluster patching, no idle VMs. On-demand analytics burst on BQ autoscaling without capacity planning.

One SQL codebase

  • The 5-step category pipeline is pure BigQuery SQL — URL taxonomy lookup, MSISDN scan, day-level aggregation, category rollup. No Spark or Beam to maintain. All steps share the same BQ slot reservation window, so adding a new category adds SQL rows, not infrastructure.

Privacy by design

  • Hashing & tokenization run inside Cloud DLP the moment data lands — never by hand, never in a bespoke library — with k-anonymity in gold and a VPC-SC perimeter around everything. Physical egress carries aggregated data only, to a named recipient (the client); everything else — Eureka, vendors — is zero-copy through Analytics Hub, so there is no file to lose. Anonymization is enforced structurally, not by policy documents.
Alternative consideredVerdictWhy rejected
Query on-prem lake federated from BigQueryNot possibleBQ federation covers Cloud SQL/Spanner/GCS; BQ Omni covers AWS/Azure only — no on-prem connector exists.
Pull location data down to on-prem for the matchRejectedMoves the largest, most sensitive dataset the wrong way; duplicates governance; violates data-gravity and privacy posture.
Lift the Hadoop cluster into Dataproc (always-on)RejectedRecreates cluster ops and idle cost in the cloud. Dataproc Serverless is cheaper but still scales with TB read — at 50% coverage Dataproc costs ~$30.70/day vs BQ Slots at $17.60/day fixed.
Keep dual codebases, sync outputs nightlyRejectedLogic drift between environments is already a known pain; doubles test surface and slows every change.
Tokenize/mask on the on-prem edge before transferSupersededWorks, but means maintaining a crypto library on-prem outside GCP's governed tooling. Centralizing on Cloud DLP in GCP is simpler to operate and audit — offset by tighter GCS bucket controls (component 3).
Raw extract → GCS → Cloud DLP → BQ Load → BQ Enterprise Slots pipeline✓ ChosenMinimal data movement, all-Google stack, masking via Cloud DLP, processing via pure BQ SQL on reserved slots, structural privacy, no Spark/Beam to maintain.

Why BQ Enterprise Slots over Dataproc Serverless or BQ On-Demand?

The Omni Enterprise category pipeline scans ~18.6 TB/day at 50% subscriber coverage (20 categories, ~82M subscribers in the union). BQ Enterprise Slots (100 slots × 4hr/day at $0.044/slot-hr) cost exactly $17.60/day regardless of data volume — the slot reservation is fixed. Dataproc Serverless must pay per vCPU-hour and per-TB BQ Read API charge, reaching ~$30.70/day at 50% coverage; every increase in coverage makes the gap wider. BQ On-Demand at $6.25/TB reaches ~$116/day at the same scale. Over 5 years (2026 H2 → 2030) with 20% YoY growth, BQ Enterprise Slots totals ~$53K vs ~$85K for Dataproc and ~$302K for BQ On-Demand.

DimensionBQ Enterprise Slots (chosen)Dataproc ServerlessBQ On-Demand
Daily cost at 50% coverage, 20 cats$17.60/day (fixed)~$30.70/day (scales with TB)~$116/day (scales with TB)
5-year infrastructure total~$53K~$85K~$302K
Cost scales with subscriber coverageNo — slots are fixedYes — TB read scales with subsYes — TB scan scales with subs
Runtime to add a new categorySQL rows only, same slot budgetMore vCPU-hours + TB readMore TB scanned, more cost
Language / codebasePure SQL — no Spark/BeamSpark/PySparkPure SQL
Intermediate storage (12-mo, 5 tables)~$80/month (BQ active + long-term)~$80/month (same BQ tables)~$80/month (same BQ tables)
04 · Run surfaces

Where production code runs vs where ad-hoc analysis happens

A hard boundary between the two keeps daily deliverables reliable and lets analysts move fast without breaking them.

Production — automated, no humans in the loop

BQ Enterprise Slots + BigQuery SQL, orchestrated by Composer

  1. → Cloud Build CI (tests, lint) → versioned SQL scripts to Artifact Registry.
  2. are the only thing allowed to launch prod jobs — on schedule or on GCS-arrival sensor.
  3. Jobs run as dedicated service accounts with least-privilege IAM; humans have no write access to prod datasets.
  4. Separate ; promotion only via CI. Failures page the on-call via Cloud Monitoring.
  5. DLP masking + BQ Load runs first; then the 5-step BQ Enterprise Slots category pipeline runs within a 4-hour reserved slot window. Set-based aggregation for ad-hoc analysis runs as on shared autoscale capacity.
Ad-hoc — interactive, on demand

BigQuery Studio on the curated & gold zones

  1. Analysts use : SQL workspaces + Python notebooks (Colab Enterprise) directly on BQ — no data extracts.
  2. Access via authorized views over curated/gold only; policy tags block raw token columns. Never on the raw zone.
  3. On-demand slots with max-bytes-billed guardrails and per-user custom quotas; heavy recurring analyses get promoted into the prod DAG.
  4. Cross-dataset match on demand = plain SQL join on the shared token in BQ; if a field isn't in the daily extract, request a parameterized one-off extract job — the standing feed is never widened ad hoc.
  5. Results shared via Analytics Hub or a governed export, not CSV email.
05 · Data privacy

How privacy is maintained

Identifiers

  • MDNs are hashed/tokenized by immediately on landing in GCP — before any durable, human-accessible zone is written. The GCS bucket that briefly holds raw data is SA-only IAM, CMEK-encrypted, VPC-SC-perimetered, and auto-deletes within ~48 hours.
  • The same DLP template/key tokenizes location-side MDNs, so joins work on tokens; no curated or gold table in BQ ever holds a clear MDN.
  • Eligibility/opt-out filtering happens (step 1) — ineligible records never leave the source at all.

Aggregation & outputs

  • Gold zone enforces (suppress groups below k) — matching the "24 hr aggregate + anonymize" steps in the original design.
  • External deliverables can add for formal guarantees.
  • The client (component 11) always gets gold-zone 24h aggregate only, physically delivered — no exception. Eureka and vendors (components 12, 13) consume via Analytics Hub grants that default to gold as well; a curated-level (tokenized, row-level) grant is possible but requires a documented privacy review and policy-tag entitlement first — it is never the default.

Platform controls

  • perimeter prevents data exfiltration even with leaked credentials; CMEK everywhere.
  • Column-level + row-level security; Dataplex lineage shows exactly where every field flows.
  • All access logged to Cloud Audit Logs; DLP scans curated zone for accidental PII leakage.
06 · Maintenance

How this is maintained day to day

Daily operations

  • Composer is the single pane: DAG status, SLA misses, retries. A missed on-prem drop alerts before consumers notice.
  • Dataplex data-quality rules gate promotion from raw → curated; bad batches quarantine to a dead-letter dataset with automatic reprocessing on fix.
  • Backfills are a Composer parameterized run over the GCS raw zone — no on-prem re-extract needed within retention.

Change management

  • Everything is code: pipelines, DAGs, SQL, IAM, and infrastructure (Terraform). PR review + CI is the only path to prod.
  • Schema contract between the on-prem edge job and the GCS bucket is versioned; additive changes only, enforced in CI.
  • Monthly: review BQ slot utilization & on-demand spend, storage lifecycle hit-rates, DQ trend, key rotation.

Because it's serverless BQ-native

  • No cluster patching, no capacity planning, no idle VMs — Google maintains BQ, STS, Pub/Sub runtimes. Enterprise Slots are reserved but serverless; they release automatically after the 4-hour window.
  • The maintenance surface is SQL + configuration — exactly what the team can own with 1–2 data engineers on rotation. No Spark or Beam runtimes to version-pin.
07 · Adoption

How and why this architecture should be used

How — phased

  • stand up VPC-SC perimeter + KMS, build the filtering-only edge job + STS transfer, configure the GCS bucket and Cloud DLP de-identification templates, BQ Load job materializes masked data into the lakehouse, BQ Enterprise Slots 5-step category pipeline live, Client Delivery live and Analytics Hub listings published for Eureka and any GCP-resident vendors, Composer DAG orchestrating end to end.
  • retire on-prem duplicate ETL for matched products; move POI + demographics joins fully into the reference layer; Analytics Hub replaces bucket drops.
  • streaming browsing ingestion (Pub/Sub/Datastream), historical backfill, dual-run validation, on-prem becomes source-only.

Why — for the business

  • Daily location × web matches become a reliable product with SLAs, not a best-effort script.
  • On-demand cross-dataset questions answered in minutes in BQ instead of multi-day cross-environment engineering.
  • Partner-ready: Analytics Hub gives governed, revocable sharing for enterprise customers (e.g., the Omni product line); S3/SFTP delivery meets hedge funds where their existing ingestion already lives.

Rules of the road

  • New data products start as ad-hoc analyses in BQ Studio; once run twice a week, they get promoted into a Composer DAG.
  • No pipeline outside Composer; no dataset without an owner, DQ rule, and policy tags; no clear identifiers, ever.
  • Widening the on-prem extract requires a privacy review — default answer is a one-off parameterized extract.

Platform Summary

📄 View Full Summary

Plain-English guide to all cost models, assumptions, strategies, and caveats across every product page.