Cloud-Native Synthetic Data Generator for Data Pipeline Testing

godaddy · Tech · 2025 · source Agentic: no · promotional bias: med · source-backed · extracted with prompt 0.5.5 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Enterprise data-platform testing and synthetic data generation

GoDaddy needed realistic test data for data pipelines without copying production data into lower environments or forcing engineers to handcraft datasets for many schemas.

Constraints:

Architecture

GoDaddy built a cloud-native synthetic data generator that uses GoCode, its internal LLM API, to interpret submitted schemas and create Databricks Labs Datagen templates, then runs Spark jobs on EMR Serverless to generate schema-conformant Parquet data at scale. The Data Lake API records schema and target metadata in DynamoDB, DLMS orchestrates validation, idempotency, retries, and EMR submission, and generated outputs are delivered directly into producer-owned S3 buckets with status tracking.

Diagram confidence: explicit (topology described by the source).

flowchart LR
  producer-or-consumer-client["producer or consumer client"] --> data-lake-api["Data Lake API"]
  data-lake-api --> dynamodb-status-store["DynamoDB status store"]
  data-lake-api --> dlms-orchestrator["DLMS orchestrator"]
  dlms-orchestrator --> lambda-job-submitter["Lambda job submitter"]
  lambda-job-submitter --> gocode-template-engine["GoCode template engine"]
  gocode-template-engine --> template-validation-layer["template validation layer"]
  lambda-job-submitter --> emr-serverless-spark["EMR Serverless Spark"]
  template-validation-layer --> emr-serverless-spark
  gocode-template-engine --> emr-serverless-spark
  emr-serverless-spark --> producer-s3-bucket["producer S3 bucket"]
  emr-serverless-spark --> quality-validation-checks["quality validation checks"]
  quality-validation-checks --> dynamodb-status-store
  producer-s3-bucket --> producer-or-consumer-client
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
producer or consumer client Submits schema definitions, target locations, and generation parameters for synthetic data. Data Lake API
Data Lake API Receives schema-generation requests and persists schema metadata, owner, target S3 location, desired state, and status. producer or consumer client, DynamoDB status store, DLMS orchestrator
DynamoDB status store Tracks schema metadata, desired state, job status, timestamps, row counts, output paths, and errors. Data Lake API, DLMS orchestrator
DLMS orchestrator Coordinates authentication, validation, idempotency checks, retries, and job submission for each schema version. Data Lake API, DynamoDB status store, Lambda job submitter
Lambda job submitter Constructs the EMR job specification with schema references, generated template, and Spark parameters. DLMS orchestrator, GoCode template engine, EMR Serverless Spark
GoCode template engine Uses GoDaddy's internal LLM API to infer semantic field meaning and render Datagen/Spark templates. Lambda job submitter, template validation layer, EMR Serverless Spark
template validation layer Checks generated templates against schema constraints and known-good patterns before execution. GoCode template engine, EMR Serverless Spark
EMR Serverless Spark Runs distributed Spark jobs that synthesize realistic records using partitioning, streaming, batching, and schema constraints. Lambda job submitter, GoCode template engine, template validation layer, producer S3 bucket
producer S3 bucket Receives generated Parquet output in producer-owned paths using bucket policies or assumed roles. EMR Serverless Spark, producer or consumer client
quality validation checks Validate schema compliance, constraints, statistical distributions, and referential integrity of generated data. EMR Serverless Spark, DynamoDB status store

Data flow

A producer or consumer submits a schema and generation parameters through the Data Lake API. The API persists metadata and desired state in DynamoDB, DLMS starts the workflow, a Lambda builds the EMR job specification, GoCode renders a strongly typed Datagen/Spark template from the schema, EMR executes partitioned Spark generation, and the resulting compressed Parquet files are written to the producer's S3 prefix while status updates flow back through DynamoDB and DLMS.

3 supporting quotes
“A producer or consumer registers a schema with the data lake. The system stores metadata, orchestrates a data-generation workflow, renders GoCode-based templates into executable code”article, stated
“Data Lake API writes a new record to DynamoDB: schema, owner, target S3, desired state, and an initial status (e.g., SUBMITTED).”article, stated
“Spark job (EMR) uses the generated code to synthesize realistic, schema-conformant records at scale (partitioning, skew handling, nullability, referential integrity). Data is serialized to Parquet with proper compression and column types. 7. Write to S3”article, stated

Why this architecture

The architecture deliberately uses the LLM for schema understanding and template creation, not for per-row generation, because GoDaddy needed LLM-level semantic inference with traditional distributed-generation economics, security, and throughput.

3 supporting quotes
“we didn't need an LLM to generate every row — we needed it to understand the schema and create intelligent generation templates.”article, stated
“Each failed approach taught us something valuable: we needed a solution that combined the intelligence of LLMs with the scale of traditional data generation tools.”article, stated
“We pay LLM costs once per schema, not per row — a 99.9% cost reduction compared to pure LLM generation. * Domain awareness: The LLM can infer realistic patterns from column names and constraints (e.g., email fields get valid email formats,”article, stated

Models used: GoCode internal LLM API · Databricks Labs Datagen · Spark on EMR Serverless

Scale

Alternatives considered (roads not taken)

Manual test data creation

Rejected because: Engineers spent days writing JSON and SQL, and the approach could not scale to hundreds of schemas and millions of records.

“Engineers were spending days crafting JSON files and SQL scripts. This approach couldn't scale to our hundreds of schemas and millions of records.”article, stated

Production data sampling and anonymization

Rejected because: It introduced security and compliance risks and could not generate future-state scenarios.

“Copying and anonymizing production data seemed attractive but introduced security risks, compliance nightmares, and couldn't generate future-state scenarios.”article, stated

Off-the-shelf generators alone

Rejected because: Generic tools handled simple schemas but struggled with GoDaddy-specific relationships, constraints, and business logic.

“Tools like Faker and Mockaroo work well for simple schemas but struggled with our complex relationships, custom constraints, and GoDaddy-specific business logic.”article, stated

Pure LLM generation of entire datasets

Rejected because: Quality was promising, but the cost and latency of generating millions of rows were impractical.

“While the quality was impressive, the cost and latency of generating millions of rows made this approach impractical.”article, stated

Lambda-based data generation

Rejected because: Lambda worked for small datasets but timed out on million-row jobs, pushing the team to EMR Serverless.

“Our initial prototype used Lambda functions to generate data. This worked for small datasets but hit the 15-minute timeout limit”article, stated

Always-on EMR clusters

Rejected because: The team judged them too expensive for per-request generation and chose EMR Serverless with batching.

“Running EMR clusters for every generation request would be expensive. Solution: We adopted EMR Serverless with intelligent job batching, reducing costs by 80% compared to always-on clusters. ## Technical deep dive: How each component”article, stated
“We adopted EMR Serverless with intelligent job batching, reducing costs by 80% compared to always-on clusters.”article, stated

Patterns

synthetic-data-generation (data-generation)

GoDaddy generates production-like test datasets from schemas so pipeline teams can test without production data exposure.

“we’re building a cloud‑native synthetic data generator with AWS that turns data schemas into production-like datasets through an API call.”article, stated

structured-output-contract (reliability)

The LLM produces structured Datagen templates that are checked against schema constraints before execution.

“We implemented a validation layer that checks generated templates against schema constraints and a library of known-good patterns.”article, stated

batch-offline-processing (execution)

Large generation requests run as distributed EMR/Spark jobs and small requests are batched into shared jobs.

“Multiple small requests are batched into single EMR jobs to reduce overhead”article, stated
“Data is generated in parallel across partitions for maximum throughput”article, stated

cost-aware-routing (optimization)

The system routes intelligence to one-time template generation and routes row generation to cheaper distributed compute.

“LLMs understand business context and create realistic generation rules once, not for every row.”article, stated
“We pay LLM costs once per schema, not per row — a 99.9% cost reduction compared to pure LLM generation. * Domain awareness:”article, stated

data-quality-loop (reliability)

Generated datasets are validated for schema, constraints, statistics, and referential integrity before being trusted for pipeline tests.

“Multiple small requests are batched into single EMR jobs to reduce overhead ### Quality validation Generated data goes through multiple validation steps: 1.”article, stated
“Statistical validation: Compares distributions against expected patterns”article, stated

privacy-preserving-processing (security)

Synthetic data removes the need to copy sensitive production records into lower environments.

“copying production data into lower environments isn’t an option for privacy and security concerns.”article, stated
“Synthetic data contains no PII, making it safe for development and testing environments.”article, stated

observability-tracing (operations)

Every generation job records metadata and error information in DynamoDB for debugging and monitoring.

“Every job is tracked in DynamoDB with comprehensive metadata: timestamps, row counts, output paths, and detailed error messages.”article, stated

Tradeoffs

Use LLMs for template generation rather than row generation.

Chose LLM-generated Datagen templates executed by Spark over LLMs generating entire datasets directly.

Rationale: Template-time LLM use gives semantic understanding while avoiding per-row cost and latency.

“Pure LLM generation seems attractive but doesn't scale. Traditional generators lack intelligence. The hybrid approach gives you the best of both worlds.”article, stated
“LLMs understand business context and create realistic generation rules once, not for every row.”article, stated

Use EMR Serverless for generation jobs.

Chose EMR Serverless with Spark over Lambda functions for all generation.

Rationale: EMR Serverless supports long-running, horizontally scalable jobs after Lambda timed out on large datasets.

“We pivoted to EMR Serverless, which can run for hours and scale horizontally.”article, stated
“This required rewriting our generation logic in Spark but gave us virtually unlimited scale.”article, stated

Deliver output into producer-owned buckets.

Chose Cross-account write via bucket policy or assumed role over Central platform-owned storage or copied handoff.

Rationale: Producer-owned delivery aligns with ownership and zero-trust security practices but requires flexible permission handling.

“Producers maintain ownership of their buckets, with access granted through bucket policies or assumed roles rather than long-lived credentials.”article, stated
“Cross-account write is permitted via bucket policy or an assumed role (depending on org policy).”article, stated

Expose synthetic-data generation as an API-first self-service platform.

Chose Simple API calls hiding the underlying LLM, Spark, EMR, S3, and validation complexity over Specialist-operated generation workflows.

Rationale: Self-service lowers adoption friction for teams that need data without understanding synthetic-data internals.

“Make it self-service: The biggest adoption barrier is complexity. Our API-first approach means teams can generate data without understanding the underlying complexity.”article, stated

Gotchas (what bit them)

LLM-generated templates can be syntactically or logically invalid.

Root cause: The LLM may hallucinate code or constraints when translating schemas into generation templates.

Resolution: Validate templates against schema constraints and known-good patterns, then regenerate invalid outputs with more specific prompts.

“Early versions sometimes generated templates with syntax errors or impossible constraints (e.g., ages ranging from -10 to 300).”article, stated
“Invalid templates are regenerated with more specific prompts. ### Challenge 3: Cross-account S3 permissions[](https:”article, stated

Serverless functions are too small for million-row generation jobs.

Root cause: The Lambda prototype hit the 15-minute execution limit when data volume grew.

Resolution: Move generation to EMR Serverless and rewrite logic in Spark for long-running horizontal execution.

“This worked for small datasets but hit the 15-minute timeout limit when generating millions of rows.”article, stated
“We pivoted to EMR Serverless, which can run for hours and scale horizontally.”article, stated

Cross-account delivery can block synthetic-data adoption.

Root cause: Generated data must be written into producer-owned S3 buckets across AWS accounts, creating permission complexity.

Resolution: Support both bucket policies and assumed roles so producers can choose the model that fits their security posture.

“Writing generated data to producer-owned S3 buckets across AWS accounts introduced complex permission challenges.”article, stated
“We implemented a flexible permission model supporting both bucket policies and assumed roles”article, stated

Synthetic data can still miss production messiness.

Root cause: Generated data may not capture subtle real-world correlations, typos, incomplete records, or unexpected relationships.

Resolution: Treat synthetic data as one testing tool and periodically compare synthetic distributions with production patterns.

“Even the best synthetic data may miss subtle patterns or correlations present in production data.”article, stated
“Periodically compare your synthetic data distributions with production patterns to ensure realism.”article, stated

Always-on clusters make occasional generation requests too expensive.

Root cause: Running dedicated EMR capacity for every request wastes resources when demand is bursty.

Resolution: Use EMR Serverless and batch small requests into shared jobs.

“Running EMR clusters for every generation request would be expensive.”article, stated
“We adopted EMR Serverless with intelligent job batching, reducing costs by 80% compared to always-on clusters.”article, stated

Evaluation

The article evaluates the system through operational design checks, generated-data validation stages, and reported impact metrics from early use rather than a formal model benchmark.

Metrics: schema compliance · constraint validation · statistical validation · referential integrity · 90% reduction in time spent creating test data · 100% elimination of production data in test environments · 5x faster pipeline development cycles · 99.9% LLM-cost reduction versus pure LLM generation · 80% infrastructure-cost reduction versus always-on EMR clusters

4 supporting quotes
“Multiple small requests are batched into single EMR jobs to reduce overhead ### Quality validation Generated data goes through multiple validation steps: 1.”article, stated
“* 90% reduction in time spent creating test data * 100% elimination of production data in test environments * 5x faster pipeline development cycles ## What makes our approach unique[](https:”article, stated
“* 90% reduction in time spent creating test data * 100% elimination of production data in test environments * 5x faster pipeline development cycles ## What makes our approach unique[](https:”article, stated
“* 90% reduction in time spent creating test data * 100% elimination of production data in test environments * 5x faster pipeline development cycles ## What makes our approach unique[](https:”article, stated

Outcomes

The article reports billions-of-rows design intent, hundreds-of-schemas pressure, 99.9% LLM-cost reduction, 80% lower EMR cost versus always-on clusters, 90% lower test-data creation time, 100% removal of production data from test environments, and 5x faster pipeline development cycles.

3 supporting quotes
“turns data schemas into production-like datasets through an API call.”article, stated
“we've created a system that gives teams the best of both worlds: intelligent, context-aware data generation at a cost and scale that actually works for enterprise use.”article, stated
“impact Since launching, we've seen: * 90% reduction in time spent creating test data * 100% elimination of production data in test environments * 5x faster”article, stated