DBU markup on every run
You pay platform units on top of the VMs you already rent. The markup scales with usage, not with value.
Your workspace, notebooks, job definitions and catalog stay exactly where they are, untouched. flow-switch.io only reroutes the compute for your jobs: they are converted automatically and run on your own Spark runtime, in your own cloud account, so you stop paying DBUs for job execution.
That is net of our fee — here is the arithmetic →Enterprise data platforms end up paying twice for compute: once to the cloud, once to the vendor on top. Meanwhile the jobs themselves have not changed in years.
You pay platform units on top of the VMs you already rent. The markup scales with usage, not with value.
Notebooks, job specs and cluster policies are tied to a single vendor. Moving anything means rewriting everything.
Autoscaling that never scales down, jobs nobody owns, and a monthly invoice no one can attribute to a team.
Finance asks for a 30% platform saving. Engineering has no lever that does not risk the nightly load.
The job wrapper reads your existing job definitions and emits an equivalent workload for the flow-switch.io runtime. Sources and sinks stay exactly where they are.
Read-only access to job definitions, cluster configs and run history. Nothing leaves your tenant.
Jobs, schedules and cluster policies are translated into portable Spark workloads with the same dependencies and secrets wiring.
Both platforms run the same workload against the same input. We compare row counts, schemas and runtime before anything is cut over.
Move one pipeline group at a time. Roll back to the original job at any point — the definition is never deleted.
One short file per job. It points at the job definition — wherever it lives — states the compute you want it to run on, and keeps the way back open.
Nothing else in your repository changes: the notebook, the transformations and the table names are untouched.
# flow-switch.io job wrapper - the only file that gets added.# Notebooks, code and schedules stay exactly as they are.apiVersion: flow-switch.io/v1kind: WrappedJobmetadata: name: sap-daily-ingest team: data-platform # tags runs for cost attributionspec: source: # read-only; nothing is edited repo: github.com/acme/data-platform job: resources/sap_daily_ingest.job.yaml runtime: driver: { cores: 3, memory: 10g } executors: { count: 2, cores: 3, memory: 10g } auth: azureWorkloadIdentity: sap-daily-ingest-uami # federated via Azure MI, no secrets stored rollback: toDatabricks: true # one command to switch backApache Spark 4.0 as released. No proprietary runtime, no closed extensions to reverse engineer when something breaks.
Deployed into your AKS/EKS/GKE cluster, your VNet, your subscription. We never hold your data or your keys.
Every run is tagged to a team, pipeline and cost centre. Finance gets the breakdown without a spreadsheet exercise.
Reads and writes the same Delta tables in the same storage, so downstream consumers stay where they are. Converted jobs address those tables by path rather than through Unity Catalog — the FAQ covers exactly what that changes.
Trigger from Airflow, ADF, Dagster or the built-in scheduler. Existing DAGs keep their shape.
Spark UI, structured run logs and metrics exported to the monitoring stack you already run.
Measured on an 80,000,784-row, 5-table SAP → Delta Lake benchmark across three workload shapes — see the matrix below. Per-run figures are compute-only and exclude our fee; the pricing section restates them net. Your numbers depend on job mix; the assessment models them before you commit.
Identical PySpark code, identical dataset, identical VM SKUs where the platform exposes them. DBU quantities come from billed usage records, not estimates.
8M-row slice · no joins · measures per-run overhead: scheduling and I/O setup
−79.8% cost vs Serverless · −63.8% vs Classic
| Metric | Databricks Serverless auto-scaled · $0.50/DBU, all-in | Databricks Classic Job 2× D4ds_v4 · $0.30/DBU + VM | flow-switch.io on AKS 2× D4ds_v4 · VM only, no DBU |
|---|---|---|---|
| Duration | 29.5 s | 76.5 s | 52.7 s |
| DBU cost | $0.1726 | $0.0327 | no DBU |
| VM cost | — | $0.0635 | $0.0080 |
| Total, warm compute | $0.1726 | $0.0961 | $0.0080 |
| Total, incl. spin-up | $0.1726 | $0.0961 | $0.0348 |
| Avg / peak CPU | sandboxed | 30.3% / 33.7% | 43.2% / 67.1% |
| Avg / peak memory | sandboxed | 59.4% / 73.6% | 20.3% / 39.4% |
| Network moved | — | 0.102 GB | 0.078 GB |
1959.8 s vs 2107.6 s — flow-switch.io came in 7% ahead of Classic on identical work and identical VM SKUs. Spin-up, disk cache and scheduling differences wash out once a job is execution-bound.
It finished the saturation run ~7× faster by scaling out — and billed 3.633 DBU for it, roughly 6× the flow-switch.io cost for the same result.
Peak CPU hit 99–100% and peak memory 83–92%. Pool averages look lower only because the driver node idles: the Classic worker averaged 92.6% and the flow-switch.io executor 79.8%.
Open-source Spark has no Databricks disk cache. A naive DISK_ONLY persist to compensate ran 76% slower (405 s vs 230 s), so we did not adopt it. Classic keeps the memory-efficiency edge.
Full run records, queries and raw samples are available under NDA — ask on the call.
flow-switch.io is installed into infrastructure you already own and audit. There is no data plane on our side.
We would rather tell you where we are than imply a badge we do not hold. The audit scope is deliberately small: because the runtime is deployed inside your tenant, no customer data reaches flow-switch.io systems, so the controls under audit cover our own engineering and access processes rather than a platform holding your data. In the meantime we answer security questionnaires directly and share the architecture pack under NDA.
Security questionnaire, architecture pack and reference calls available on request.
One meter, priced three ways. The assessment measures your converted job count and the per-run Databricks counterfactual from billed usage records. That measurement is the quote — and afterwards, the invoice.
We deliver the platform into your organisation as inner source. Your team runs it from day one and keeps running it if we disappear.
We deploy and operate the runtime inside your own cloud account. No data plane on our side, no change to where your data lives.
Hosted by us, as SaaS. The fastest way to run a real workload — and deliberately the least economical at scale.
70% Classic / 30% Serverless, derived from the published batch_long run: $0.1589 → $0.0589 per run against Classic, $0.3156 → $0.0589 against Serverless, spin-up included on both sides.
| Line | Databricks today | On flow-switch.io |
|---|---|---|
| Classic workloads | $840,000 | $311,000 |
| Serverless workloads | $360,000 | $67,000 |
| Infrastructure subtotal | $1,200,000 | $378,000 |
| flow-switch.io fee — 25% of realised saving | — | $206,000 |
| Total you pay | $1,200,000 | $584,000 |
Net saving $616,000 — 51.3% of the bill, after our fee
Net saving is gross saving multiplied by one minus our share. At the 62.9% gross saving we measure against Classic, any fee above ~20% of savings breaks a "half the bill" claim; on a mixed estate the ceiling is 27%. We set 25% so the headline stays true on the estates we actually see.
The fee is capped as a share of your previous Databricks jobs bill. If savings run higher than modelled, you keep the difference rather than paying us more for it.
There is a minimum annual commitment. Below it the migration costs you more in change process than it returns, and we would rather say that on the first call.
Nobody believes a synthetic Databricks price for a workload that has not run there in a year. Share-of-savings converts to a fixed fee at first renewal, escalating with run volume — not with savings.
Updates are not only security patches. Every release targets cost per run on jobs you have already moved, so the fee you pay in year three should be buying a cheaper bill than it bought in year one.
If the assessment does not model a net saving after our fee, we tell you on the call and there is no engagement. We would rather lose the deal than defend a number later.
The assessment output is the quote. Bring your job list to the call and we will scope it.
45 minutes. Your job mix, your constraints, whether this is a fit at all.
We model wrapper coverage and expected savings against your actual run history.
One pipeline group runs in shadow mode next to production until the diffs are clean.
Team-by-team cutover with rollback available at every step.
Commercial terms follow the assessment, in one of the three shapes above — nothing is committed before the numbers are yours.
No. The job wrapper translates job and cluster definitions; the Spark code itself runs unchanged. Where an API has no open-source equivalent, the assessment flags it before you commit.
Nothing. Most teams move a subset first and run both platforms side by side indefinitely. The original job definitions are never deleted.
Nowhere new. The runtime is deployed into your cloud account and reads and writes the same storage accounts as before. What changes is how a moved job addresses those tables, not where they live — the next answer covers it.
Today a converted job addresses Delta tables by storage path rather than through Unity Catalog. The files, the format and the storage account are unchanged, so the tables stay readable by everything that reads them now, Databricks included — most teams keep them registered in UC as external tables so names and downstream queries do not move. What does change on a moved job is where governance is enforced: storage permissions on the runtime’s managed identity take the place of UC table grants, and UC will not capture lineage or apply row filters and column masks for that job. Native Unity Catalog support is on the roadmap, and we would rather not put a date on it here. The assessment flags every job where this matters, and governance-critical pipelines are usually the ones we recommend leaving on Databricks.
Your platform team owns it, with our support. Everything is standard Kubernetes and open-source Spark, so it stays operable without us.
Yes — that is the point of publishing the method alongside them. DBU figures come from billed usage records rather than estimates, spin-up is included on every column, and the workload is the same PySpark code on all three computes. We will walk through the run records with your team and re-run the matrix on your own job shapes during the assessment.
Assessment to first shadow run is typically two weeks. Full rollout depends on how many pipeline groups you move and how fast your change process allows.
Three shapes, depending on who runs the platform. In-house: a fixed delivery fee plus an annual subscription that keeps the runtime current — releases target cost per run, not only security patches — priced against what building it yourself would cost. In your tenant: 25% of realised savings, metered per run against a Databricks counterfactual from billed usage records, capped as a share of your previous bill and converting to a fixed fee at renewal. Cloud: a published per-vCPU-hour rate, listed next to the underlying VM rate so you can see the multiple. In all three the fee comes out of savings we can show you — if the assessment does not model a net saving after our fee, we say so on the call and there is no engagement.
45 minutes with an engineer, not an SDR. Come with a rough count of jobs and clusters and you will leave with an estimate of what is convertible.
The calendar has not loaded: it comes from Calendly, and nothing is fetched from them until you agree.
Or skip it entirely and mail us — we will send times by hand.