The Optimization Paradox Webinar
On-Demand
Close navigation menu icon in white

Catch what breaks now, not after it's live.

Once you've decided to move a workload, the code and config changes aren't optional, and some of them quietly introduce new inefficiency instead of fixing anything. Native tooling flags some compatibility issues. The rest surfaces only after something's already broken.

The same four checks apply to every workload you migrate, not just one. Native tooling catches some of what needs to change; it won't tell you whether a completed migration introduced a regression, or what else depends on the workload you just moved. Here's what that gap looked like for one real pipeline, then the breakdown for each check below.

Real example
+121% runtime, same pipeline logic
A migration that looked complete after passing QA. The join logic didn't change, but a partition skew that classic's larger cluster absorbed without issue became the bottleneck under serverless's tighter compute allocation. Nobody caught it until the nightly SLA started slipping: runtime went from 14 minutes to 31, a 121% jump, with the exact same pipeline logic.
Critical Questions to Answer

What breaks, why, and how to catch it.

Each question below is one of the checks a workload needs during and right after it moves, how far Databricks native tooling gets you toward catching it, and what only Unravel can tell you.

Code & config

What code or config actually needs to change for this workload?

Every workload carries some combination of environment variables, init scripts, unsupported languages, DBFS mounts, or cache calls that classic clusters tolerate and serverless doesn't. None of it is a reason to avoid serverless, but each one is a specific line of code or config that has to change before the job runs correctly, and missing one is exactly what makes a migration look done in QA and then misbehave once it's live.

Yes
Little to no unsupported code or config
Low-risk migration. Move it and watch for the checks below.
NO
Uses env vars, init scripts, unsupported languages, or caching
Rework first. Each dependency needs its serverless equivalent before this job runs correctly.
Answerable by
Native Databricks
◐ Partial
Docs list what's unsupported, but nothing scans this workload's actual code to tell you which specific lines need to change.
Unravel
✓ Yes
Scans the workload's code and config for every unsupported pattern, env vars, init scripts, language, caching, before you touch a single line.
Migration readiness

Is this a good low-risk candidate to migrate now, or should it wait?

Not every workload is equally ready today, even if all of them would benefit from serverless eventually. A workload with heavy custom configuration, sensitive concurrency patterns, or dependencies on still-maturing serverless support is a worse candidate to migrate right now than one that's simple and stable. Sequencing which workloads move first, and which wait, matters as much as the code changes themselves.

Yes
Simple, stable, few dependencies
Good candidate now. Low complexity means low migration risk.
NO
Complex, sensitive, or immature dependencies
Hold for now. Migrate simpler workloads first and revisit this one as serverless support matures.
Answerable by
Native Databricks
✕ No
Databricks doesn't rank or sequence your workloads by migration risk. That judgment call is entirely on you.
Unravel
✓ Yes
Scores each workload's migration readiness, so you know which ones are safe to move first and which should wait.
Regression check

Did the last change introduce new inefficiency?

A migration can pass every functional test and still get slower or more expensive, because serverless's compute allocation and scaling behavior aren't identical to classic's. Partition skew, shuffle behavior, and scaling responsiveness can all play out differently under serverless even when the underlying job logic hasn't changed at all, and a passing QA suite catches correctness, not a performance regression.

Yes
Runtime and cost hold steady vs. the classic baseline
No regression. This change is safe to keep.
NO
Runtime or cost got worse after the change
Regression introduced. Something in this change needs a closer look before it ships further.
Answerable by
Native Databricks
✕ No
The Jobs UI shows this run's duration, not a before-and-after comparison against the pre-migration baseline.
Unravel
✓ Yes
Compares each migrated workload's runtime and cost against its own pre-migration baseline automatically, so a regression shows up immediately instead of in an SLA complaint weeks later.
Dependency risk

Is anything this workload depends on going to break?

Workloads rarely run in isolation. Upstream tables, shared libraries, downstream jobs, and scheduled dependencies can all be affected by a migration even when the workload being migrated looks self-contained. A change that's safe for the job itself can still break something else that reads its output or shares its environment.

Yes
No shared dependencies, fully self-contained
Safe to migrate independently.
NO
Shared libraries, downstream jobs, or upstream dependencies
Check dependencies first. Map what else touches this workload before migrating it.
Answerable by
Native Databricks
◐ Partial
Job-level lineage is visible one job at a time, but nothing surfaces the full dependency chain automatically.
Unravel
✓ Yes
Maps a workload's upstream and downstream dependencies automatically, so you know what else is exposed before you migrate it.