| name | beam-dataflow-python |
| description | Apache Beam (Python SDK) and Google Cloud Dataflow. Use when creating, debugging, or reviewing Python data pipelines — batch/streaming, Protobuf, Flex Templates, windowing, stateful processing. |
Apache Beam & Dataflow (Python) Best Practices
Implement Way's architectural patterns and modern (2025+) best practices when building
Dataflow Python pipelines.
1. Unified Pipeline Architecture
- Mode-driven routing:
--mode streaming vs --mode batch flag conditionally
injects I/O connectors (Pub/Sub vs. BigQuery/GCS) and windowing; transform logic
is identical across modes
- Layered files:
pipeline.py (PTransform wiring) → transforms.py (DoFn impls)
→ state_machine.py / domain logic (pure Python, zero Beam imports)
- Event-time first: always develop around event time so backfills produce consistent
state
Reference: Way's Pipeline Patterns,
Community Best Practices
2. Runner v2 + Streaming Engine
Runner v2 is mandatory for Python SDK 2.45.0+; Streaming Engine is required for
Runner v2 streaming jobs.
Reference: runner-v2.md,
streaming-engine.md
3. Deployment: Docker + Flex Templates
setup.py is deprecated as of 2025. Docker is the only supported production
deployment pattern.
Reference: build-container-image.md,
run-custom-container.md,
using-custom-containers.md,
08-docker-custom-containers-flex-templates.md,
GCP Flex Template examples
4. Data Serialization (Protobuf-first)
Protobuf is Way's canonical schema across all environments (Pub/Sub, Beam shuffles,
BigQuery, cross-language). Maximize leverage from protos in every pipeline stage.
Reference: 13-protobuf-best-practices.md,
03-bigquery-io-optimization.md
5. BigQuery & I/O
Reference: managed-io.md,
managed-io-bigquery.md,
managed-io-kafka.md,
managed-io-iceberg.md,
03-bigquery-io-optimization.md
6. Testing & Logic Decoupling
- Extract domain logic: remove business logic from
DoFns into pure Python
classes with zero apache_beam imports
- Three-tier testing:
- Pure Python (80–90%):
pytest on domain logic — instant, no runner overhead
- Transform logic:
TestPipeline + assert_that for DoFn routing, State/Timer
APIs, and side-output correctness
- Integration: local end-to-end with mock I/O using Prism Runner (current
standard for high-fidelity stateful execution)
Reference: 01-testing-and-ci-cd.md,
Community Testing Patterns
7. Advanced Windowing, Triggers & PaneInfo
- Abstract window config: extract into configuration objects (e.g.,
StreamingSessionWindowConfig) to keep pipeline code readable
- Triggers + lateness: pair
AfterWatermark with explicit allowed_lateness;
throttle EARLY panes with Repeatedly(AfterProcessingTime(delay=...)) to avoid
pane explosion
- PaneInfo injection:
pane_info=beam.DoFn.PaneInfoParam in process() signature
EARLY: speculative aggregate — throttle output rate
ON_TIME: watermark has passed window end
LATE: correction after close — sinks must be idempotent using window bounds +
pane_info.index as primary key
Reference: 05-windowing-and-triggers.md
8. Stateful Processing & Thread Safety
- State + Timer APIs: use
ReadModifyWriteState, BagState, and TimerSpec
for complex per-key session logic that session windows cannot express
- Thread safety: streaming workers run ~12 threads per process; objects
initialized in
__init__ are shared — initialize non-thread-safe objects
(clients, parsers, connections) in setup(), not __init__
- Singleton pattern for expensive clients: use
setup() / teardown() lifecycle
hooks to manage connection pools and ML model loading
Reference: 09-state-and-timers.md,
thread-scaling.md
9. Resilience & Production Gotchas
- DLQ: wrap transforms with
.with_exception_handling() to route failed records
to a dead-letter sink; never let poison pills crash the pipeline
- Fusion trap: Dataflow fuses adjacent steps to reduce serialization overhead,
but fusing a CPU-heavy step with a fast step causes 3–5x throughput loss; break
fusion with
beam.Reshuffle() or a no-op GroupByKey between the steps
- Hot key sharding: distribute work across keys by appending a random shard
suffix before
GroupByKey, then strip it after aggregation
- Exactly-once misconception:
DoFn.process() may execute multiple times for
the same element (retries, speculative execution); only sinks get exactly-once
delivery guarantees — all API calls and external writes must be idempotent
- ML inference: use
RunInference transform — never load models inside
process(); models must be loaded in setup() and shared safely
Reference: 02-dead-letter-queues.md,
11-frontline-lessons-learned.md,
machine-learning.md
10. Cost Optimization
- Streaming Engine: reduces per-vCPU cost by offloading state to managed backend
- FlexRS (batch): mix preemptible VMs with on-demand; typically 40% cost
reduction for non-latency-sensitive batch
- C4A (ARM) workers:
--worker_machine_type=c4a-standard-8; 20–30% better
price/performance for CPU-bound transforms
- Vertical autoscaling:
--enable_vertical_memory_scaling; prevents OOM without
over-provisioning RAM across the fleet
- Shuffle Service (batch):
--experiments=shuffle_mode=service; offloads
GroupByKey shuffle to managed backend
worker_utilization_hint: --experiments=worker_utilization_hint=0.8; sets
the target CPU utilization for autoscaling decisions (0.0–1.0); tune down for
latency-sensitive streaming, up for throughput-bound batch
Reference: flexrs.md,
use-arm-vms.md,
vertical-autoscaling.md,
shuffle-for-batch.md,
right-fitting.md,
optimize-costs.md
Agent Reference Index
Do not guess syntax or patterns. Load exact procedures from these references.
Architecture & Core Strategy
Community Guides (2025+)
- Testing & CI: 01-testing-and-ci-cd.md
—
TestStream, PrismRunner, CI/CD setup
- Error Handling: 02-dead-letter-queues.md
—
with_exception_handling, side-output DLQ patterns
- BigQuery I/O: 03-bigquery-io-optimization.md
— Storage Write API syntax, schema mapping
- Autoscaling: 04-autoscaling-resource-management.md
— C4A workers, vertical autoscaling, FlexRS config
- Windowing: 05-windowing-and-triggers.md
— event-time windows, triggers,
allowed_lateness
- Cross-language: 06-cross-language-transforms.md
— Java connectors (KafkaIO) from Python
- DataFrames: 07-dataframe-api.md
— scalar/tabular operations with DataFrame API
- Docker/Flex Templates: 08-docker-custom-containers-flex-templates.md
— Dockerfile patterns, metadata.json, launch commands
- Stateful Logic: 09-state-and-timers.md
— State + Timer APIs, session management
- Beam YAML: 10-beam-yaml-declarative.md
— no-code ingestion routing
- Scale Debugging: 11-frontline-lessons-learned.md
— stuck pipelines, fusion breaking, hot keys
- Pythonic Patterns: 12-modern-pythonic-patterns.md
— Pydantic validation, structural pattern matching
- Protobuf Deep Dive: 13-protobuf-best-practices.md
— schema evolution, upb backend, coder registration, Editions
- Strategic Direction: 14-trends-and-strategic-direction.md
— Beam/Dataflow roadmap for 2026
Dataflow Deep-Dives
Dataflow Operations & Troubleshooting
Core SDK Fallback References