← Back to home
Databricks

Why Your Databricks Estate Costs Too Much

Colin Olliver · 10 min read

When I joined the company, their Databricks platform was dying every 24 hours. The bill was through the roof. And Databricks themselves couldn't figure out why.

Six months later, we'd cut costs by €500k annually while doubling capacity. The platform ran stable. Pipelines that used to fail nightly started completing in half the time.

The problem wasn't Databricks pricing. It was architecture.

The Death Spiral

Here's what I walked into: a data platform processing telecom data for millions of subscribers, failing constantly, and burning money. Every morning started with firefighting. Every afternoon was spent trying to understand why basic operations were timing out.

The Databricks support team couldn't pinpoint the issue. They'd look at the logs, scratch their heads, and suggest we add more capacity. Which we did. Which made the bill worse and didn't fix the failures.

The real issues were architectural:

Each problem compounded the others. Over-provisioned clusters ran inefficient code, which failed often, which required manual reruns, which meant even more compute time on oversized infrastructure.

What Actually Fixed It

I didn't optimize. I re-architected.

Workload-Tuned Cluster Configurations

The first thing I did was separate workloads by type and tune cluster configurations accordingly.

Batch jobs got dedicated job clusters with aggressive autoscaling. Small driver nodes, beefy workers, configured to terminate immediately after completion. No more paying for idle interactive clusters running scheduled batch work.

Interactive workloads got their own pools with appropriate instance types. Data scientists don't need the same infrastructure as production ETL pipelines.

Streaming jobs got Delta Live Tables with proper autoscaling rules. They needed consistent performance, not spiky oversized capacity.

Cost dropped 40% immediately, just from right-sizing infrastructure to actual workload patterns.

Reusable Pipeline Templates

I built a library of pipeline templates. Bronze-silver-gold patterns. Common transformations. Standard error handling. Logging that actually helped debug issues.

New pipelines went from weeks of development to days. More importantly, they were built on proven patterns instead of copy-pasted spaghetti.

Less code meant fewer bugs. Fewer bugs meant fewer failures. Fewer failures meant less wasted compute on reruns.

Fault-Resilient Pipelines

I added automatic retries with exponential backoff. Checkpointing at every stage. Idempotent operations so reruns didn't create duplicate data.

Pipelines stopped dying from transient failures. When something did break, recovery was automatic instead of requiring manual intervention at 2am.

The reduction in on-call pages alone was worth the effort.

Pre-Processing Storage Layers

We started landing raw data in cheap blob storage before processing. Failed transformations could restart from the pre-processed layer instead of hitting source systems again.

This had a double benefit: faster reruns and less strain on upstream systems. The telecom databases stopped sending angry emails about our excessive query load.

Delta Lake and Unity Catalog

I rolled out Unity Catalog properly. Defined data contracts. Set up quality checks. Made schema evolution explicit instead of a surprise at 3am.

Delta Lake gave us ACID transactions and time travel. When bad data did get through, we could roll back instead of manually fixing downstream corruption.

Data quality improved dramatically. Fewer pipeline failures from unexpected schema changes or dirty data.

The Common Mistakes

After fixing the company's estate, I started seeing the same patterns everywhere. Most organizations make the same architectural mistakes.

Over-Provisioned Clusters

People treat cluster sizing like insurance. "Better safe than sorry" becomes "let's provision for 10x peak load."

The problem is you pay for every minute those clusters run. An oversized cluster that finishes a job in 20 minutes often costs more than a right-sized cluster that takes 30 minutes.

Use autoscaling. Start small. Let Databricks add capacity if needed. You'll be surprised how rarely it's needed.

No Job-Level Tuning

Organizations set up cluster policies at the workspace level and call it done. Every job inherits the same defaults.

But a 10GB aggregation doesn't need the same resources as a 10TB join. A Python notebook doing API calls doesn't need a Spark cluster at all.

Tune at the job level. Small jobs on small clusters. Big jobs on big clusters. Seems obvious, but most estates don't do this.

Monolithic Notebooks

I've seen 3000-line notebooks that do everything from data ingestion to ML model training. They're impossible to debug, impossible to reuse, and impossible to optimize.

Break them up. Separate concerns. Build libraries for shared logic. Use job orchestration instead of cramming everything into one notebook.

Smaller units of work are easier to tune, easier to retry on failure, and easier to run in parallel.

Ignoring Unity Catalog

Unity Catalog isn't just governance theater. It catches schema drift before it breaks pipelines. It provides lineage so you know what breaks when you change something. It enforces access controls so sensitive data doesn't leak.

Organizations that skip it end up building their own janky version of the same thing, or living with constant data quality fires.

Just use Unity Catalog. It's built-in. It works.

How Cost Savings Compound

The €500k annual savings at the company wasn't a single optimization. It was multiple improvements that multiplied each other.

Right-sized clusters reduced baseline costs. Fault tolerance meant fewer reruns. Reusable templates meant faster development and less buggy code. Better data quality meant fewer pipeline failures. Pre-processing storage meant faster recovery.

Each improvement was worth maybe 10-15% on its own. Together, they cut costs in half while doubling throughput.

The real leverage came from reliability. When pipelines stop failing, you stop paying for failed runs. You stop paying people to debug at odd hours. You stop paying for rush fixes and emergency capacity additions.

Stable platforms are cheap platforms.

What To Do About It

If your Databricks bill is too high, don't ask for a pricing discount. Fix your architecture.

Start with workload separation. Batch, streaming, and interactive workloads should run on different infrastructure with different configurations.

Build pipeline templates. Standardize the common patterns. Make the right way the easy way.

Add fault tolerance. Retries, checkpointing, idempotency. Make failures recoverable instead of catastrophic.

Use Unity Catalog. Set up data contracts. Catch quality issues early instead of late.

Add pre-processing layers. Land data cheap, transform it once it's safe.

Most importantly, measure everything. You can't optimize what you don't measure. Tag jobs, track costs per pipeline, identify the expensive outliers.

The teams that do this see 40-60% cost reductions within months. The ones that don't keep complaining about Databricks pricing while running the same inefficient architecture.

The Bottom Line

Databricks isn't cheap, but it's not the problem. The problem is how most organizations use it.

Over-provisioned infrastructure running inefficient code that fails constantly and requires manual intervention. That's expensive no matter what platform you're on.

Fix the architecture, and the costs fix themselves.

At the company, we went from daily failures and runaway costs to a stable platform that cost half as much while doing twice the work. No magic, no vendor negotiations, just better engineering.

That's what I do. If your Databricks estate is costing too much and you don't know why, I've probably seen the pattern before.

← Back to home