Microsoft Fabric Custom Live Pools: Setup, Scheduling and Tuning
Cut Spark notebook startup delays by keeping compatible clusters warm when your team actually needs them. This guide covers setup, environments, Full versus Quick library publishing, schedules, cluster sizing, costs, monitoring, and the ways it goes wrong in production.
1. How Microsoft Fabric custom live pools work
Starting a Spark session can take far longer than the notebook code itself. Fabric may need to provision compute, attach the environment, and make the required libraries available. That overhead becomes obvious when engineers keep opening notebooks, when scheduled notebooks run in a narrow window, or when a pipeline has lots of short notebook activities.
A custom live pool lets Fabric prepare compatible clusters ahead of a configured schedule. The cluster is hydrated with the attached environment and kept available through the active window, so a new notebook session can use warm capacity instead of waiting for a fresh cluster.
If no compatible hydrated cluster is available, or the notebook runs outside the schedule, Fabric may use standard on-demand provisioning instead.
What it does, and what it doesn’t
Compute and the environment can be ready before the notebook asks for a session.
Slow joins, skew, heavy shuffles, poor file layouts, and wide transformations still need profiling.
A published schedule controls when the pool keeps clusters hydrated. It is not an always-warm guarantee around the clock.
You set the maximum cluster count. When every warm cluster is busy, extra work can fall back to slower on-demand provisioning.
Keep this distinction in mind when you analyse performance. If a 20-minute notebook spends three minutes waiting for startup, a correctly configured live pool can cut that wait. It won’t turn the notebook’s 20 minutes of processing into 17. Measure startup and execution separately.
2. Is a custom live pool the right option?
Fabric offers several ways to run Spark, and a live pool isn’t the best choice for every notebook. Pick it when predictable startup during a known window matters more than leaving the default configuration alone.
| Compute option | Good fit | Startup behaviour | Key trade-off |
|---|---|---|---|
| Starter pool | Development, exploration, and common notebook work where default compute and library support are enough. | Can start in seconds when pre-warmed capacity is available. Availability is best-effort. | Less control over custom library hydration and workload-specific compute. |
| Custom Spark pool | When you need node sizing, autoscale settings, environment libraries, or other compute controls. | Standard provisioning can take minutes, depending on configuration and environment. | More control, but a custom configuration alone doesn’t keep the cluster pre-warmed. |
| Custom live pool | Repeated notebook sessions in a predictable window, including interactive, scheduled, and pipeline-triggered notebooks. | Roughly 5 to 10 seconds after full hydration with a compatible cluster available. | Needs a schedule and warm-cluster capacity. Over-provisioning can raise cost. |
| Optimised code or high concurrency | When the main problem is execution time, repeated session work, or resource use rather than cold startup alone. | Depends on the compute and sharing configuration. | Needs its own measurement and compatibility checks. It doesn’t replace workload tuning. |
Microsoft’s documentation lists custom live pools as supporting interactive notebooks, scheduled notebooks, and notebook runs triggered by pipelines. Spark job definitions are not listed as supported in the current release. Check the latest official support matrix before choosing this route for a Spark job definition.
3. Prerequisites and permissions
Confirm each requirement before you touch the workspace. Most failed setups trace back to an unavailable paid capacity, no custom Spark pool, an unpublished environment, or missing permission to customise compute.
- Paid Fabric capacity: the workspace must be assigned to an active paid Fabric SKU. Fabric trial capacity is not supported for custom live pools.
- Existing custom Spark pool: a workspace administrator creates the underlying custom Spark pool. A starter pool can’t be the base for a custom live pool.
- Fabric environment: create or select an environment, configure the Spark runtime and libraries you need, and publish it successfully.
- Workspace role: an Admin can manage the custom Spark pool and live pool configuration. A Member can configure live pool settings for an existing pool only if an administrator has enabled the relevant item-level compute customisation setting.
- Active schedule: each live pool needs a schedule before it can be published.
- Operational owner: decide who owns environment publishing, schedule changes, capacity reviews, and failed-run triage.
4. Step-by-step: configure a custom live pool
Portal labels can change as Fabric evolves, but the documented flow is: create a custom Spark pool, attach it to an environment, turn on live pool compute and a schedule, publish the environment, and check that hydration has finished.
Step 1: Create the underlying custom Spark pool
- Open the Fabric workspace and select Workspace settings.
- Expand Data Engineering/Science, then open Spark settings.
- Open the Pool tab. From the workspace default-pool selection, choose the option to create a new pool.
- Give the pool a descriptive name, such as
team-notebook-live-pool. - Select a node family and node size based on the workload you plan to run, and configure autoscale to match the Spark pool options and your team’s needs.
- Save the custom pool. This step only creates the compute pool. The live and warm behaviour is set through the environment next.
Name pools after ownership and purpose, for example finance-notebooks or etl-notebooks-prod. Avoid names that capture a temporary experiment or one person’s name.
Step 2: Create or select a Fabric environment
- Open an existing Fabric environment, or create one from the workspace’s New item menu.
- Choose the Spark runtime and add the Python, Java, or other supported libraries your notebooks need.
- For shared or scheduled work, use a stable, versioned dependency set. Avoid unpinned packages that can resolve differently from one publish to the next.
- Choose the library publish mode on purpose. The next section explains why Full mode matters for the fastest session start.
- Save and publish the environment, and resolve any dependency or build errors before you configure the live pool.
Step 3: Enable live pool compute for the environment
- In the environment, open the Compute section.
- Select the custom Spark pool you created in Step 1.
- Under live pool compute, activate the live pool option.
- Enable the live pool schedule, and set a recurring schedule or a defined window that matches when the workload really runs.
- Set the start and end times, time zone, cluster count, idle timeout, and reactivation behaviour using the options in your portal.
- Save the compute settings, then publish the environment.
Step 4: Attach the environment to the notebook
- Open the notebook that should use the live pool.
- Choose the environment you configured and confirm it is the one you intended.
- Make sure the notebook’s libraries and Spark compute settings line up with that environment. A different configuration may need a different session and won’t benefit from a pool set up for another environment.
- Save the notebook and run a test inside the intended schedule window.
Step 5: Confirm that clusters are hydrated
- Open the Fabric Monitoring hub.
- Find the published environment, open its context menu, and select View details.
- Expand the Live pool status section.
- Check the pool status, available clusters, busy clusters, and next schedule.
- If you want to test warm-start behaviour, run the test notebook only when a compatible cluster is available.
A useful operating view tells Active, Hydrating, Idle, and Stopped apart rather than treating every non-error state as ready. For a session to take the fast path, the signal that matters is that a compatible hydrated cluster is actually available.
5. Full vs Quick library publishing: the choice that affects startup
An environment decides which libraries are available to the Spark session. The publish mode changes when those libraries are installed, so it can change the startup experience even when the live pool has already prepared the compute.
| Setting | What happens | Choose it when | Trade-off |
|---|---|---|---|
| Full mode | Libraries are resolved and baked into a stable environment snapshot during publishing. | You want repeatable shared dependencies and the shortest startup after a live pool is hydrated. | Publishing takes longer. After a library change, republish and refresh the hydrated clusters. |
| Quick mode | Libraries aren’t preinstalled into the hydrated cluster image and may install when a notebook session starts. | Fast development iteration matters more than the quickest session start. | Library installation can add startup delay even when the compute is warm. |
| Inline installs and notebook resources | Per-session installs such as %pip install, and files in a notebook’s Resources area, are handled separately from preinstalled environment libraries. | Temporary experiments or notebook-specific resources. | Don’t assume inline installs are baked into live clusters. They are separate from the environment publish mode. |
For the fastest and most reproducible live pool startup, Microsoft’s guidance is to use Full publishing mode for the libraries the notebook needs. Quick mode still benefits from warm compute, but libraries that have to install at session start can eat into the advantage.
Library update runbook
- Change the library or version in the environment.
- Publish the environment and make sure the publish completes successfully.
- Refresh the hydrated clusters manually if the portal offers that action, or wait for the next hydration cycle.
- Check the pool status and run a smoke test against the new environment.
- Only then release scheduled notebooks that depend on the new package version.
A common mistake is to publish a new environment version and assume every hydrated cluster instantly has it. Existing clusters aren’t automatically refreshed on every library change, so the test has to verify the environment state the session actually used.
6. Schedule planning: make the cluster warm before the notebook starts
The schedule defines when Fabric keeps clusters hydrated and can reactivate them. It does not force a cluster to be ready at the exact start time. Hydration takes time, especially after a fresh environment publish or when new compute has to be created.
Illustrative schedule only. Microsoft recommends starting the schedule 60 to 90 minutes before a deadline when a notebook must have a warm cluster at that time. Confirm available-cluster status before critical runs.
Base the schedule on measured demand, not on the team’s full business hours by default. If production notebook work starts at 08:00, schedule the pool early enough to allow hydration. If interactive use normally ends at 16:00, keeping the pool scheduled until midnight just to cover a rare manual request is wasteful. An off-window notebook can still run through standard provisioning, but nobody should promise it the live pool start time.
Schedule design checklist
- Time zone: pick the zone explicitly, and account for daylight-saving changes if the schedule follows local business time.
- Hydration lead time: start ahead of the first deadline. Use Microsoft’s recommended 60 to 90 minute lead for a critical 08:00 start, then adjust from what you observe.
- Peak overlap: estimate the number of concurrent notebook sessions, not just the number of notebooks in the workspace.
- Idle timeout: balance a long warm idle period against cluster churn and extra allocated time.
- End date and holidays: check that a recurring schedule keeps running over the period you need and covers business-critical runs.
- Change window: after publishing an environment update, allow time for fresh hydration and check status before the next time-sensitive run.
7. Cluster sizing and concurrency: start from evidence
There are two separate sizing choices: the compute size of the Spark pool, and the maximum number of clusters the live pool may keep hydrated. Don’t mistake the second for unlimited autoscaling. The live pool does not grow beyond the maximum you configure.
Choose node family, node size, and Spark compute settings from the notebook’s memory, CPU, shuffle, and data-volume profile.
Choose a cap from the number of simultaneous sessions you need to serve without falling back to a cold start.
Microsoft’s configuration guide gives workload-based starting points, such as smaller configurations for exploration and larger ones for demanding jobs. They are starting points, not universal sizing rules. Profile your own notebook and capacity before you standardise a cluster size.
A practical sizing experiment
- Pick one representative notebook that is safe to test and runs often enough to measure.
- Record its current startup delay separately from its execution time.
- Choose a conservative live pool maximum from the simultaneous notebook demand you expect in the scheduled window.
- Test with one session, then with realistic peak concurrency. Record available and busy cluster counts.
- If demand exceeds the available warm clusters, decide whether to raise the maximum or accept on-demand fallback, based on the business deadline and cost.
- Look at Spark resource usage before you increase node size. If processing is slow after the session starts, fix the query plan, skew, shuffle, partitions, or data layout. That is not a startup problem.
8. Cost controls: reduce waste without losing the startup benefit
Custom live pools trade some allocated warm-compute time for predictable session startup. Clusters stay warm only within the schedule, and billing applies while clusters are allocated. When the schedule ends or an idle cluster is deactivated, that cluster is deallocated and billing for that allocation stops. Your overall Fabric bill still depends on capacity, workloads, the billing model, and whatever else shares the capacity.
There is no single monthly price for a custom live pool that fits every workspace. Capacity SKU, region, reservation or pay-as-you-go terms, schedule length, pool size, concurrency, and utilisation all matter. Use the current Fabric pricing page and your capacity metrics, and don’t assume a five-second startup target comes free.
A simple operational cost model
Allocated warm-compute exposure is driven mainly by:
- How many clusters you keep allocated;
- How long the schedule keeps them hydrated;
- How long idle clusters stay before deactivation;
- How much concurrent demand those clusters actually serve;
- Whether unused warm capacity overlaps with other pools or workloads.
This is a planning framework, not a currency-price formula. Use your capacity’s current billing model and the official SKU pricing for the financial estimate.
Does the saved wait justify the warm time? A quick break-even check
Before you commit, put rough numbers on both sides. You don’t need exact pricing for this. You need to know whether the waiting you remove is worth the warm hours you add.
| Question | How to answer it |
|---|---|
| How much wait does a warm start remove per session? | Typical cold start minus roughly 5 to 10 seconds. Use your own measured cold start, not a guess. |
| How many sessions start in the scheduled window? | Count interactive sessions plus scheduled and pipeline-triggered notebook runs, per day. |
| Who is waiting? | A person staring at a spinner costs more than a nightly job that no one watches. A pipeline with a hard deadline counts differently again. |
| How many warm hours are you adding? | Schedule length times the number of clusters you keep allocated, minus any overlap with capacity you were using anyway. |
A made-up example to show the shape, using illustrative numbers only: if a team starts 40 notebook sessions a day and each cold start costs about three minutes, that is around two hours of waiting per day that a warm start would mostly remove. If those same 40 sessions are overnight jobs with no deadline, the two hours cost nobody anything, and a live pool is probably not worth it. The answer depends on who is waiting and what the deadline is, not on the technology.
Four ways to avoid paying for readiness you don’t need
- Shorten the schedule sensibly. Keep the warm window around real demand, with enough lead time for hydration. Don’t trim the lead time on critical runs to save a few minutes without testing.
- Set the cluster maximum from evidence. Use the busy and available cluster metrics at peak. Don’t pre-warm more concurrent sessions than the team really uses.
- Choose a sensible idle timeout. A long timeout reduces repeated hydration but can leave unused clusters allocated. A very short one can make clusters churn and rehydrate more often.
- Keep different requirements apart, but don’t multiply pools. Don’t create overlapping pools for slightly different configurations unless a library or runtime boundary, or a concurrency need, really calls for it.
Review usage after a representative business cycle. If the live pool is idle most of the time, try a tighter schedule or a lower cluster cap. If it is saturated at deadline time again and again, work out how many start-time targets you missed before you raise the cap. A good configuration balances wait time, utilisation, and deadline reliability, and doesn’t push any one of them to the extreme.
9. Validate startup performance instead of assuming it
Don’t publish a claimed speed-up from one run. Set a repeatable baseline and compare like with like. Environment libraries, schedule state, cluster availability, concurrency, capacity pressure, and notebook logic can all move the result.
Suggested measurement plan
| Test | What to record | Why it matters |
|---|---|---|
| Baseline notebook without warm availability | Submission time, session-ready time if available, execution start, completion time, environment, and library mode. | Sets the cold or on-demand behaviour you compare against. |
| Live pool, fully hydrated | The same timestamps, plus pool status and available clusters, with the same notebook and environment. | Measures the warm-start path under intended conditions. |
| Live pool, environment in Quick mode | The same measurements plus time spent installing libraries. | Shows whether dependency installation removes part of the startup benefit. |
| Representative concurrent load | Concurrent sessions, busy and available cluster counts, fallback runs, and missed deadlines. | Tests the maximum cluster count against real peak demand. |
For each test, do several runs under comparable conditions and compare medians as well as outliers. Wherever your monitoring allows, keep three measures apart: session startup time, notebook execution time, and end-to-end pipeline duration. The pipeline figure includes orchestration and queueing, so don’t present it as pure Spark startup time.
Notebook smoke test
Once the environment is attached and the session starts, use a small deterministic test to confirm the Spark session is available and the expected runtime can run. It checks basic function. It does not measure how long hydration took.
from datetime import datetime, timezone
print("Execution timestamp (UTC):", datetime.now(timezone.utc).isoformat())
print("Spark version:", spark.version)
sample = spark.range(0, 10000).selectExpr(
"id",
"id % 7 AS bucket"
)
print("Rows:", sample.count())
sample.groupBy("bucket").count().orderBy("bucket").show()Measure the real wait from a pipeline
A timer inside the notebook can’t see the time spent waiting for the session, because it only starts once the session exists. A workable trick for pipeline-triggered notebooks is to pass the pipeline’s trigger time in as a parameter, then compare it with the time the first cell actually runs. The gap covers queueing plus session start, which is the wait your users feel.
In the notebook, mark the first cell as a parameters cell:
# Parameters cell
trigger_time = ""In the pipeline’s notebook activity, set the trigger_time parameter to the dynamic expression @pipeline().TriggerTime. Then add this in the next cell:
from datetime import datetime, timezone
started = datetime.now(timezone.utc)
if trigger_time:
triggered = datetime.fromisoformat(trigger_time.replace("Z", "+00:00"))
wait_seconds = (started - triggered).total_seconds()
print("Seconds from pipeline trigger to first cell:", round(wait_seconds, 1))
else:
print("No trigger_time supplied, skipping wait measurement")Log that number for every run, and you get a real before and after picture across days instead of a single lucky test. It also includes any time the activity spent queued, so treat it as an upper bound on session start, not a precise measure of it. Compare it with the Monitoring hub timings to see how much of the gap is startup.
10. Troubleshooting common custom live pool problems
| Symptom | Likely cause | What to check next |
|---|---|---|
| Pool shows Not Available | Capacity is inactive or unassigned, the environment isn’t ready, or the configuration publish failed. | Confirm the paid capacity is active, and that the attached environment is Ready, published, and error-free. |
| Startup still takes minutes | The pool isn’t fully hydrated, no compatible cluster is available, the run is outside the schedule, or the environment needs session-time library installs. | Check live pool status, available clusters, the schedule window, and Full vs Quick mode. Run again only after confirming warm availability. Also look for notebook-level overrides such as a %%configure cell, which can change the session so it no longer matches the pool. |
| First run is slow after publishing | Hydration hasn’t finished, or the environment build changed. | Wait for the pool’s available-cluster signal and confirm the environment is Ready. A publish event doesn’t mean warm clusters are immediately ready. |
| Notebook fails after a library update | Existing hydrated clusters may still reflect an older environment snapshot, or there is a dependency resolution problem. | Republish the environment, refresh hydrated clusters or wait for the next hydration cycle, and run a smoke test. |
| Live pool settings are disabled | The user lacks Admin or Member rights, Member customisation is off, or no Admin has created the custom Spark pool. | Ask a workspace Admin to create the base pool and enable the item-level compute customisation setting where appropriate. |
| Some notebook runs are fast and others aren’t | Different environments or compute settings, different times of day, competing sessions, or pool exhaustion can send runs down different paths. | Compare environment, schedule, pool status, cluster availability, and concurrency for both runs. Don’t judge from one successful run. |
| New demand exceeds the warm cluster cap | All configured clusters are busy, so Fabric uses on-demand provisioning for the extra requests. | Review real peak concurrency and any missed targets, then decide whether the maximum should go up. |
| Can’t manage the setup through a deployment pipeline | Current documentation says custom live pools are configured through the Fabric portal and aren’t managed through environment public APIs or CI/CD pipelines. | Plan a portal-based configuration runbook, restrict administrator access, and record change verification separately from code deployments. |
11. A rollout plan that works
Turning this on for a whole workspace at once is how teams end up with a big bill and no proof it helped. A small pilot gives you evidence and keeps the cost contained. Here is a plan I would follow.
- Pick one team and one environment. Choose a group that runs notebooks daily and complains about startup. Don’t pick a team whose pain is slow queries.
- Baseline for a week first. Log the wait from trigger to first cell, the notebook duration, and the number of sessions per day, before you change anything.
- Pin and publish in Full mode. Fix the dependency versions, publish, and confirm the environment is Ready.
- Start with a short schedule and a low cluster cap. Cover the real peak hours, with the hydration lead time, and no more.
- Run for two weeks and compare. Use the same measures as the baseline, and note the days that missed the warm path and why.
- Adjust, then decide. Tighten or widen the window, raise or lower the cap, and write down the result in a few lines. If the gain is small for the cost, stop. That is a legitimate outcome.
- Document it as a runbook. Because configuration is portal-only, record who owns it, how to change the schedule, how to republish after a library change, and how to check status. Keep a change log.
12. Limitations and production-readiness checklist
Before you rely on a custom live pool for a business-critical notebook, write down the current limitations and who owns operations. Some are easy to miss, because a pool can look enabled long before it can actually serve a warm session.
- Notebook sessions only: interactive notebooks, scheduled notebooks, and pipeline-triggered notebook runs are documented as supported. Spark job definitions aren’t supported in the current release.
- Paid capacity: Fabric trial capacities aren’t supported for custom live pools.
- Warm start is conditional: the roughly 5-second start applies after hydration completes and only when a compatible cluster is available.
- Schedules are mandatory: a live pool can’t be published without one, and the fast path isn’t promised outside the active window.
- Library changes need care: republish the environment and make sure hydrated clusters have refreshed before you rely on the changed package set.
- Warm clusters are capped: set and monitor the maximum cluster count from measured concurrency.
- Portal administration: the dedicated documentation says custom live pool configuration is done through the Fabric portal, not environment public APIs or CI/CD pipelines.
- Security and access: follow workspace-role policies, environment governance, approved dependency processes, and any tenant networking restrictions that affect Spark provisioning.
Production checklist to copy into your runbook
- Owner and support contact are recorded.
- The base custom Spark pool and the environment are named and governed.
- Runtime and library versions are documented and published.
- Full mode is used when you need preinstalled dependencies and the fastest startup.
- The schedule starts early enough for hydration and covers real notebook demand.
- The maximum warm-cluster count is justified by concurrent-run evidence.
- Monitoring covers pool status, available and busy clusters, failed sessions, and notebook duration.
- Environment changes include a publish, refresh, and smoke-test step.
- Downstream owners understand the fallback behaviour outside the window or at the cluster cap.
- Performance claims compare repeated runs under comparable conditions.
13. Frequently asked questions
What are Microsoft Fabric custom live pools?
They are schedule-based, pre-warmed Spark clusters attached to a Fabric environment. When a compatible cluster is fully hydrated and available, they can bring supported notebook session startup down to about five seconds.
Do custom live pools make every Spark notebook run in five seconds?
No. The roughly five-second figure refers to session startup after hydration. It says nothing about data-processing time, notebook completion, or end-to-end pipeline runtime. A slow query still needs performance tuning.
Are custom live pools generally available?
Microsoft’s September 2026 Fabric feature summary announced Custom Live Pools as generally available. Check the official overview and release notes for the latest status and any regional or capacity requirements.
Can I use a starter pool as the base for a custom live pool?
No. The documented setup needs an existing custom Spark pool. If the workspace uses a starter pool today, an administrator has to create a custom Spark pool first.
Can custom live pools run Spark job definitions?
The current dedicated documentation lists interactive notebooks, scheduled notebooks, and pipeline-triggered notebooks, and says Spark job definitions aren’t supported in the current release. Check the current support matrix before designing around any other workload type.
Do custom live pools work with Fabric trial capacity?
No. Microsoft’s overview says custom live pools need a paid Fabric capacity SKU, and trial capacities aren’t currently supported.
Should I use Full or Quick environment library mode?
Use Full mode when you want stable dependencies preinstalled into the hydrated cluster and the fastest startup. Quick mode helps during quick iteration but installs libraries at session start, which can add delay.
How early should I start the live pool schedule?
For a critical notebook deadline, Microsoft’s configuration guidance suggests starting the schedule 60 to 90 minutes beforehand so hydration has time to finish. Check available clusters in the Monitoring hub rather than treating the schedule’s start time as a readiness guarantee.
What happens when all hydrated clusters are busy?
The live pool doesn’t scale past its configured maximum cluster count. Extra notebook demand can fall back to on-demand provisioning, which can take several minutes or longer, depending on library dependencies.
Can I configure custom live pools using APIs or CI/CD?
The dedicated overview currently says custom live pools can’t be managed through environment public APIs or CI/CD pipelines and must be configured in the Fabric portal. Recheck the current documentation before you automate environment deployment.
How do I know whether the live pool improved performance?
Measure session startup, notebook execution, and end-to-end pipeline duration separately, across repeated comparable runs. Track pool state and available and busy clusters, then test at realistic peak concurrency.
14. Official Microsoft documentation and further reading
Use the official references below for portal steps, prerequisites, supported workloads, and operational details. If Microsoft changes a label or requirement, these pages take precedence over any saved tutorial.
- Custom live pools in Microsoft Fabric: overview, supported workloads, licensing, and limitations
- Configure custom live pools: portal steps, schedules, monitoring, sizing, and troubleshooting
- Create custom Spark pools in Fabric: base pool setup and node sizing
- Create, configure, and use a Fabric environment: runtime, libraries, and publishing
- Apache Spark compute for Fabric Data Engineering and Data Science
- Fabric Spark capacity and cluster planning
- Fabric September 2026 feature summary: release status and data engineering updates
- Microsoft Fabric pricing: verify current capacity rates and billing options