Databricks Platform Architecture, Delta Lake, Unity Catalog and Compute (Data Engineer Associate)
The Databricks Data Intelligence Platform is a lakehouse: data lives once in open Delta Lake tables on cloud object storage, Unity Catalog governs every access to it, and you choose separate compute (all-purpose, job, serverless or SQL warehouses) for each workload. This lesson covers Section 1 of the Databricks Certified Data Engineer Associate exam guide: the platform's architecture (control plane and compute planes), how Delta Lake's transaction log delivers ACID writes, time travel and schema enforcement, how Unity Catalog organises and governs data, and how to pick compute by its characteristics, limitations and cost model.
On this page10 sections
- What the Databricks lakehouse is
- Control plane and compute planes
- Delta Lake: Parquet files plus a transaction log
- Time travel, RESTORE and VACUUM retention
- Schema enforcement and schema evolution
- Unity Catalog: metastores, namespace, lineage and volumes
- Compute types: all-purpose, job, serverless and SQL warehouses
- Serverless compute: benefits, limits and cost modes
- SQL warehouse types
- Access modes and compute cost levers
- Explain what a lakehouse is and why one governed copy of Delta data replaces a lake-plus-warehouse design
- Describe the control plane, the classic compute plane and the serverless compute plane, and what the workspace storage bucket holds
- Explain how the Delta transaction log gives atomic commits, snapshot reads and row-level DML, and use time travel, RESTORE and VACUUM retention settings correctly
- Choose between schema enforcement, mergeSchema, autoMerge and overwriteSchema by scope and by the change needed
- Describe Unity Catalog metastores, the three-level namespace, automatic lineage and volumes
- Select all-purpose, job, serverless compute or a SQL warehouse type, and the right access mode, for a workload
- Use DBU billing, the billing system table and cost levers such as auto termination, spot workers and pools to control compute cost
What the Databricks lakehouse is
The Databricks Data Intelligence Platform is a lakehouse: data is stored once, in open-format Delta Lake tables on low-cost cloud object storage, and given the reliability and performance of a data warehouse, so the same tables serve BI dashboards, SQL analytics, data engineering and machine learning under one governance layer, Unity Catalog.
The lakehouse answers a specific problem. Many companies ran two systems: a data lake (cheap, open files such as Parquet, read directly by data scientists, but with no transactions and coarse governance) and a data warehouse (reliable, fast SQL, but proprietary storage) fed by a copy of the lake. Two copies drift out of sync, dashboards lag the lake by the load schedule, and access rules are kept in two places. The lakehouse removes the second copy instead of making the copy faster.
| Design | Copies of the data | Reliable updates and reads | Governance | Open format for ML |
|---|---|---|---|---|
| Data lake (plain Parquet/CSV files) | One | No: no transactions, no row-level DML, readers can see partial writes | File/bucket permissions only | Yes |
| Lake plus separate warehouse | Two (lake and warehouse) | Yes in the warehouse only | Two places to maintain | Lake copy only; warehouse needs extracts |
| Lakehouse (Delta tables + Unity Catalog) | One | Yes: ACID commits, DELETE/UPDATE/MERGE, time travel | One place: Unity Catalog | Yes: Delta data files are Parquet |
Two building blocks carry the design. Delta Lake turns files in object storage into transactional tables, and Unity Catalog governs every way of reaching them, from SQL warehouses to notebooks. On top of these, compute is separate from storage: you pick the compute that suits each workload and they all read the same tables.
Control plane and compute planes
Databricks splits into a control plane, which runs in the Databricks account, and a compute plane, where your data is processed. Where the compute plane runs depends on the kind of compute.
- Control plane (Databricks account): the backend services Databricks manages, such as the web application, the job scheduler, cluster management and notebook/workspace configuration. It does not execute your queries.
- Classic compute plane (your cloud account): classic clusters, including all-purpose compute, job compute and classic and pro SQL warehouses, are launched in a virtual network inside your own cloud account. Your network rules, private connectivity to on-premises systems and custom networking apply here.
- Serverless compute plane (Databricks account): serverless SQL warehouses and serverless compute for notebooks, jobs and pipelines run in compute that Databricks owns, in the same region as the workspace, inside a network boundary for each workspace. You do not manage the instances.
| Plane | Runs in | What runs there |
|---|---|---|
| Control plane | Databricks account | Web app, job scheduler, cluster manager, workspace services |
| Classic compute plane | Customer's cloud account (customer VPC/VNet) | All-purpose and job clusters, classic and pro SQL warehouses |
| Serverless compute plane | Databricks account, workspace region, per-workspace network boundary | Serverless SQL warehouses; serverless notebooks, jobs and pipelines |
Workspace storage. A classic workspace is created with a storage bucket (or container) in your cloud account that holds the workspace's own system data: notebook and query results, job run results, cluster logs and similar internal data, and it can hold the default workspace catalog. It is separate from the storage locations that hold your Unity Catalog tables and volumes, it is not a backup of them, and Databricks documents that it must not be deleted or modified. Serverless workspaces use Databricks-managed default storage instead.
When a compliance question is phrased in terms of "whose cloud account" and "which network", answer by compute type: classic means your account and your network; serverless means the Databricks account in the workspace's region.
Delta Lake: Parquet files plus a transaction log
A Delta table is a directory of Parquet data files plus a transaction log in the _delta_log subdirectory, and the log, not the directory listing, defines what the table contains. Delta is the default table format on Databricks.
Each write is a commit: a numbered JSON file in _delta_log that records which data files were added and removed and any schema or metadata change. Periodic checkpoint files (Parquet) summarise the log so readers do not replay every JSON file. A table version is the set of files the log says are live after a given commit.
This design gives Delta its ACID guarantees:
- Atomic commits. A writer writes new data files first and then tries to commit. If the job fails before the commit, the files it wrote are referenced by no version, so readers never see them. A failed overwrite leaves the complete previous version visible, not a mix and not an empty table.
- Snapshot isolation. A query reads one committed version from start to finish, even while another job is writing.
- Row-level DML.
DELETE,UPDATEandMERGEwork by rewriting the affected files and committing the swap, which plain Parquet cannot do. A privacy request to delete one customer's rows is aDELETEstatement.
Two consequences follow. First, never edit a Delta table by adding or removing files in storage by hand: the log still references removed files (later reads fail) and one data file usually holds many unrelated rows, so deleting it deletes them too. Changes go through SQL or the DataFrame API so they are committed. The same goes for the old "write to a staging folder, then rename or swap it over the live path" trick: on cloud object storage a directory rename is a copy-and-delete of many objects, not an atomic commit, so readers can see missing or partial files mid-swap, and it still gives you no row-level DELETE. Second, files written by failed jobs or replaced by later commits stay in storage until VACUUM removes them.
Existing Parquet data can be converted in place with CONVERT TO DELTA, which builds a transaction log over the existing files.
Time travel, RESTORE and VACUUM retention
Because the log keeps every version, Delta can read and restore past versions: this is time travel, and how far back it reaches is set by two retention properties and by how VACUUM is run.
DESCRIBE HISTORY tablelists versions with their timestamp, operation and user.SELECT * FROM table VERSION AS OF 41orTIMESTAMP AS OF '2026-10-01'reads an old version without changing the table.RESTORE TABLE table TO VERSION AS OF 41(orTO TIMESTAMP AS OF) makes the current table match an earlier version. It does this by adding a new commit, so the restore itself appears in the history and can be undone.
DESCRIBE HISTORY sales.orders;
SELECT count(*) FROM sales.orders VERSION AS OF 41;
RESTORE TABLE sales.orders TO VERSION AS OF 41;
VACUUM deletes data files that the current version no longer references and that are older than the retention threshold, 7 days by default (the table property delta.deletedFileRetentionDuration, or a RETAIN clause). Delta refuses a shorter retention unless a safety check is turned off, because running jobs might still need the files.
Time travel to a version needs both its commit in the log and the data files it referenced:
| Property | Default | What it bounds |
|---|---|---|
delta.logRetentionDuration | 30 days | How long commit history is kept in the log (cleaned up automatically at checkpoints) |
delta.deletedFileRetentionDuration | 7 days | How old an unreferenced data file must be before VACUUM may delete it |
So with defaults and a weekly VACUUM, a 20-day-old version fails even though its commit is still in the log: its data files were vacuumed. To keep N days of time travel while still running VACUUM to control storage, set delta.deletedFileRetentionDuration to at least N days and keep delta.logRetentionDuration at least N days. Stopping VACUUM protects history but storage grows; OPTIMIZE compacts files but does not delete old ones; a clone does not stop VACUUM on the source from removing the source's files.
Schema enforcement and schema evolution
Delta schema enforcement (schema validation) rejects any write whose columns or types do not match the table, and because writes are atomic, a rejected write commits nothing. Changing the schema has to be asked for explicitly.
If an append brings a column the table lacks, the default result is a schema mismatch error, not silent dropping of the column and not automatic addition. The ways to change the schema differ in scope and in what they can change:
| Option | Scope | What it does |
|---|---|---|
.option("mergeSchema", "true") | That one write | Adds new columns from the DataFrame to the table (older rows read null); cannot change an existing column to an incompatible type such as STRING to BIGINT |
spark.databricks.delta.schema.autoMerge.enabled = true | Every write in the session, or on the cluster if set in its Spark config | Same evolution as mergeSchema, but for all jobs using that session/cluster |
.option("overwriteSchema", "true") with mode("overwrite") | That overwrite | Replaces data and schema together in one commit, so column types can change or columns be dropped; earlier versions stay available to time travel until VACUUM |
ALTER TABLE ... ADD COLUMNS | The table, explicitly | Adds columns by DDL before the write |
Pick by scope. When only one job should accept a new column and other jobs on the same cluster should keep failing on surprises, use the write option, not the session or cluster setting. When a column's type must change (for example STRING to BIGINT after casting in the DataFrame), mergeSchema is not enough: rewrite the table with overwrite mode plus overwriteSchema. overwriteSchema has no effect on an append.
df.write.mode("append").option("mergeSchema", "true").saveAsTable("crm.orders")
df.write.mode("overwrite").option("overwriteSchema", "true").saveAsTable("crm.customers")
Column mapping (delta.columnMapping.mode = 'name') is a separate feature that allows renaming and dropping columns as metadata changes; it does not make appends accept new columns. Schema evolution in streaming ingestion with Auto Loader is covered in the ingestion lessons.
Unity Catalog: metastores, namespace, lineage and volumes
Unity Catalog is the single governance layer for data and AI assets on Databricks: it holds the metadata, permissions, lineage and audit for tables, views, volumes, functions and models across every workspace attached to it.
Metastore. The metastore is Unity Catalog's top-level container. There is one metastore per region, and every workspace in that region can be attached to it. Attached workspaces see the same catalogs, schemas, objects and grants (unless an admin binds a catalog to specific workspaces). A workspace cannot attach to a metastore in another region, so a company with workspaces in two regions has two metastores.
Three-level namespace. Objects are addressed as catalog.schema.object, for example prod.silver.orders. A shorter name is completed from the session's current catalog and current schema, set with USE CATALOG and USE SCHEMA. Order matters: USE CATALOG also resets the current schema to default, even if it names the catalog you were already in. For example, if a session runs USE SCHEMA staging and then USE CATALOG dev, its current location is dev.default, not dev.staging: the schema choice was discarded by the later catalog switch. Fully qualified names avoid the question entirely and are the safer habit in production code.
USE CATALOG prod; -- current schema is now prod.default
USE SCHEMA silver; -- now prod.silver
SELECT * FROM orders; -- reads prod.silver.orders
Lineage. Unity Catalog captures lineage automatically at runtime from queries run on Unity Catalog objects, at table and column level, with no tracking code in the pipelines. The lineage graph in Catalog Explorer (and the lineage system tables) shows upstream and downstream tables plus the notebooks, jobs and dashboards that read or write them, which is how you find what a column change will affect. Do not confuse it with neighbouring features:
| Feature | What it records |
|---|---|
| Unity Catalog lineage | Which tables, columns, notebooks, jobs and dashboards read from or write to which |
DESCRIBE HISTORY | The table's own commits (operations that changed it), not who read it |
| Change data feed | Row-level changes (inserts, updates, deletes) between versions |
| Audit logs (system tables) | Actions taken by principals, such as logins and permission changes |
Volumes. A volume is a Unity Catalog object inside a schema that stores non-tabular files of any format (images, PDFs, CSV, JSON, libraries). Files stay files, are read and written by path under /Volumes/<catalog>/<schema>/<volume>/, and are governed by Unity Catalog privileges, the same model as tables. Databricks recommends volumes over DBFS mounts (/mnt paths), which Unity Catalog does not govern. Loading files into binary table columns changes them from files into rows, and workspace files are for code and small project assets, not governed data.
Managed versus external tables and privileges such as GRANT and REVOKE belong to the governance domain and are taught there.
Compute types: all-purpose, job, serverless and SQL warehouses
Databricks compute comes in four families, and the right one depends on whether the work is interactive or scheduled, SQL-only or code, and whether it must run in your own network.
| Compute | Created by and lifetime | Built for | Cost model |
|---|---|---|---|
| All-purpose compute (classic) | Created by a user (UI, CLI, API); runs until terminated or auto-terminated; can be restarted and shared | Interactive notebook development and debugging, often by several people | Higher DBU rate |
| Job compute (classic) | Created by Lakeflow Jobs when a run starts and terminated when it ends | Scheduled production workloads on classic compute | Lower DBU rate than all-purpose |
| Serverless compute for notebooks, jobs and pipelines | Managed by Databricks; starts quickly with no cluster to configure | Teams that want no infrastructure management and fast start | Serverless DBUs; jobs can choose performance optimized or standard mode |
| SQL warehouses (serverless, pro, classic) | Created by an admin/user; scale and stop on their own settings | SQL queries, BI dashboards, SQL editor; not PySpark notebooks | SQL DBU rates by warehouse type |
All-purpose versus job compute. A scheduled production job running on an always-on all-purpose cluster pays the higher rate all day. Moving it to a Lakeflow Jobs task on job compute cuts cost without changing code, because the cluster exists only for the run and is billed at the lower jobs rate. Auto termination or autoscaling on the all-purpose cluster trims waste but keeps the higher rate.
Sharing job clusters. Each task in a job can get its own new job cluster, but a job can also define a job cluster at the job level that several tasks share. For many short tasks in sequence, separate clusters spend most of the run starting up; one shared job cluster starts once, keeps classic networking and job pricing, and terminates when the run ends.
Photon is Databricks' vectorized query engine. It is on by default in SQL warehouses and serverless compute and can be enabled on classic clusters to speed up SQL and DataFrame workloads.
Serverless compute: benefits, limits and cost modes
Serverless compute for notebooks, jobs and pipelines removes cluster management: Databricks provisions, scales and patches the compute, it starts quickly, and you pay for what runs. The trade-off is a narrower feature set, because serverless runs your code through Spark Connect.
Limitations to know:
- DataFrame and SQL APIs only; no RDD APIs. Calls such as
spark.sparkContext.parallelize()orrdd.map()fail. The fix is to rewrite them with DataFrame operations; no Spark config or library turns RDDs on. - No R or Scala in notebooks. Python and SQL are the notebook languages; Scala runs only as JAR tasks in jobs.
- No init scripts and no compute policies. Libraries are declared in the environment: the notebook's Environment panel, or for a job task the task environment's Dependencies (requirements.txt-style entries from PyPI, workspace files or volumes). A job that relied on an init script to install packages fails on import until those packages are added as dependencies. A notebook task uses the notebook's own environment by default.
%pipstill works, but it is not where a job's packages belong. A notebook-scoped%pip installat the top of a notebook does run on serverless, but it reinstalls on every run and hides the job's requirements inside per-run notebook code. The rule for production jobs is to declare packages once in the environment (the Environment panel or the job environment's Dependencies), so every run and every task gets the same versions without code changes.- Only a limited set of Spark configurations can be set.
- No Spark UI; use the query profile to inspect performance.
Networking. Serverless runs in the Databricks account, not in your VPC, so workloads that must reach systems only through your own network design (for example an on-premises database over private connectivity) are a reason to stay on classic compute.
Cost modes for serverless jobs. Serverless jobs and pipelines offer performance optimized mode, which starts and runs faster for time-sensitive work, and standard mode (performance optimized turned off), which uses fewer DBUs but can take several minutes longer to start. A batch job with hours of slack and a cost goal fits standard mode; an SLA-tight job fits performance optimized.
SQL warehouse types
A SQL warehouse is compute dedicated to SQL, and Databricks offers three types that differ in where they run, how fast they start and which performance features they include. Databricks recommends serverless where it is available.
| Type | Runs in | Startup and scaling | Photon | Predictive IO | Fits when |
|---|---|---|---|---|---|
| Serverless | Databricks account (serverless compute plane) | Seconds; fastest scaling, intelligent workload management | Yes | Yes | Bursty BI, no one to manage infrastructure, startup waits are the complaint |
| Pro | Customer cloud account | Minutes | Yes | Yes | Compute must run in your account, for custom networking or private connectivity, or serverless is unavailable |
| Classic | Customer cloud account | Minutes | Yes | No | Entry-level SQL needs |
Predictive IO speeds up selective scans and other reads. If a workload needs Predictive IO and Photon but must run in your own cloud account, pro is the only type that meets all three conditions. A warehouse's scaling settings (minimum and maximum clusters) handle concurrency peaks; serverless also removes the minutes-long cold start.
Access modes and compute cost levers
Access mode decides who can use a classic cluster and how Unity Catalog permissions are enforced on it.
| Access mode | Who uses it | Isolation and permissions | Supports | Does not support |
|---|---|---|---|---|
| Standard (formerly shared) | Many users at once | Each user's code is isolated; each user gets their own Unity Catalog permissions | Python, SQL, Scala | R, RDD APIs, Databricks Runtime for Machine Learning |
| Dedicated (formerly single user) | One user, or one group | Runs with that user's or that group's permissions; members of an assigned group share the group's permissions | All languages including R; Databricks Runtime for ML | Per-user isolation among several people |
| No isolation shared | Legacy | No isolation; not supported by Unity Catalog | Legacy workloads only | Unity Catalog data; avoid for governed data |
So: several analysts sharing a cluster with per-user permissions means standard mode. A team that needs R or the ML runtime and accepts shared permissions uses a dedicated cluster assigned to their group (group assignment needs Databricks Runtime 15.4 LTS or above); assigning it to one person would lock the others out, and serverless does not run R.
Cost model. Databricks bills in DBUs (Databricks Units) per unit of time, at rates that depend on the compute type (jobs compute cheaper than all-purpose, separate rates for SQL warehouses and serverless). Classic compute adds the cloud provider's charge for the virtual machines. Every billable record lands in the system.billing.usage system table, with fields such as sku_name, usage_quantity and usage_metadata.job_id (filled for job compute and serverless jobs), so DBUs per job per day is a schedulable SQL query; joining to list prices turns DBUs into cost. The jobs UI, cluster event logs and system.compute.clusters describe runs and configuration, not DBU quantities.
Levers on classic compute, each solving a different problem:
| Lever | What it fixes |
|---|---|
| Auto termination | Idle all-purpose clusters left running (for example overnight): stops them after a set inactivity period |
| Autoscaling | Over-provisioning: resizes a running cluster between a minimum and maximum worker count |
| Spot instances for workers, on-demand driver | Price per hour; losing a spot worker only slows the job (tasks rerun), but losing the driver ends the run |
| Instance pools | Startup time: clusters draw from idle, ready instances. Databricks charges no DBUs for idle pool instances (the cloud provider still bills them). Use a spot pool for workers and an on-demand pool for the driver; a cluster can take each from a different pool |
| Single-node compute | Small data or non-distributed libraries: one driver node, no workers |
| Job compute instead of all-purpose | Scheduled work paying the interactive rate |
Tip. Section 1 is tested with short scenarios: a team, a symptom or requirement, and a stated constraint such as cost, network location, maintenance effort or scope of a change. You decide between real Databricks options that all sound workable: which compute type or SQL warehouse type fits a workload, which schema setting fits a change, or which table property controls a retention behaviour. Expect to read short SQL or PySpark snippets and predict their effect, such as how names resolve or whether a write is accepted. Know where each component runs, what each compute type cannot do, and what each cost lever actually changes.
- A lakehouse stores data once in open Delta tables on object storage and governs it in Unity Catalog, serving BI, SQL and ML from the same tables.
- The control plane (web app, scheduler, cluster manager) runs in the Databricks account; classic compute runs in your cloud account; serverless compute runs in the Databricks account in the workspace's region.
- Delta = Parquet files + _delta_log; a failed write is never visible, readers see whole committed versions, and DELETE/UPDATE/MERGE go through the log. Never delete data files by hand.
- Time travel needs both the log entry (logRetentionDuration, 30 days default) and the data files (deletedFileRetentionDuration, 7 days default, enforced by VACUUM). RESTORE adds a new commit.
- Schema enforcement rejects mismatched writes; mergeSchema adds columns for one write, autoMerge does it session- or cluster-wide, overwriteSchema with overwrite replaces types.
- One Unity Catalog metastore per region; names are catalog.schema.object; USE CATALOG resets the current schema to default.
- Unity Catalog lineage is automatic and column-level in Catalog Explorer; volumes govern non-tabular files at /Volumes paths and replace DBFS mounts.
- All-purpose compute is for interactive work at a higher DBU rate; job compute lives for a run at a lower rate, and tasks can share one job cluster.
- Serverless: no RDDs, no R or Scala in notebooks, no init scripts or compute policies, no Spark UI; declare job packages once in the environment, not in per-run %pip; standard mode costs fewer DBUs but starts slower than performance optimized.
- SQL warehouses: serverless (fastest start, Databricks account), pro (Photon + Predictive IO in your account), classic (no Predictive IO). Standard access mode isolates users; dedicated mode serves one user or group and supports R and the ML runtime.
Frequently asked questions
What is the difference between the control plane and the compute plane in Databricks?
The control plane is the set of backend services Databricks runs in its own account, such as the web application, job scheduler and cluster management. The compute plane is where data is processed: classic compute runs in a virtual network in the customer's cloud account, while serverless compute runs in the Databricks account in the workspace's region with a network boundary per workspace.
How long can you time travel on a Delta table by default?
By default the transaction log keeps 30 days of history (delta.logRetentionDuration), but VACUUM removes unreferenced data files older than 7 days (delta.deletedFileRetentionDuration). If VACUUM runs regularly with defaults, time travel reliably reaches about 7 days back. To keep a longer window, raise both properties to at least that many days.
What is the difference between mergeSchema and overwriteSchema in Delta Lake?
mergeSchema lets a single write add new columns to a Delta table, and older rows read null for them; it cannot change a column to an incompatible type. overwriteSchema, used with overwrite mode, replaces both the data and the schema in one commit, so it can change column types or drop columns. overwriteSchema has no effect on an append.
Does a Unity Catalog metastore cover more than one region?
No. There is one Unity Catalog metastore per region, and each workspace attaches to the metastore in its own region. Workspaces attached to the same metastore share its catalogs, schemas, tables, volumes and grants, subject to any catalog-to-workspace bindings.
When should I use job compute instead of all-purpose compute in Databricks?
Use job compute for scheduled, automated workloads: Lakeflow Jobs creates it for a run and terminates it afterwards, and it is billed at a lower DBU rate than all-purpose compute. All-purpose compute is for interactive development, where people attach notebooks, rerun cells and share a running cluster.
What can't serverless compute for notebooks and jobs do?
Serverless compute runs code through Spark Connect, so it supports DataFrame and SQL APIs but not RDD APIs. Notebooks run Python and SQL only (no R or Scala; Scala runs as JAR tasks in jobs), and it does not support init scripts or compute policies, allows only a limited set of Spark configurations and has no Spark UI (the query profile replaces it). Python libraries are added through the notebook or job task environment instead of init scripts.
Which SQL warehouse type should I choose on Databricks?
Serverless SQL warehouses are recommended: they start in seconds, scale quickly and need no infrastructure management, but they run in the Databricks account. Pro warehouses run in your own cloud account with Photon and Predictive IO, so they fit custom networking needs. Classic warehouses also run in your account but lack Predictive IO and suit entry-level SQL use.
What is the difference between standard and dedicated access mode?
Standard access mode (formerly shared) lets many users share a cluster with per-user isolation and per-user Unity Catalog permissions, and supports Python, SQL and Scala but not R, RDD APIs or the ML runtime. Dedicated access mode (formerly single user) is assigned to one user or one group, runs with that principal's permissions and supports R and Databricks Runtime for Machine Learning.
Source
This lesson covers the "Databricks Intelligence Platform" domain of the official Databricks DEA exam guide. Vendors revise their guides — check the source for the current version.
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.