Databricks project troubleshooting
Find the message from smoke.py, preview.py or the failed task below. The
index points to the page that owns each fix. The three detailed diagnostics at the
end come from the project validators. You can reproduce them locally without
Spark, credentials or a deployed job. Use the Core release matching your
generated project.
Each correction below is a change to an existing generated project, not a complete replacement configuration. Start a project with the walkthrough. See the glossary for the lifecycle and data terms.
Find your message
Search this table for the start of your message. Values in angle brackets vary. The linked section explains the cause and the fix.
| Message or symptom | Where to fix it |
|---|---|
Pre-split step '<step>' reads target '<target>'. Set SKIP_TARGET_PRE_SPLIT_STEPS=True or SCORING_MODE='custom'. |
Below |
feature_lookup.lookups[<n>].table_name: Unity Catalog names must be catalog.schema.name; each part a simple identifier (letters, digits, underscore; not starting with a digit). |
Below |
feature_lookup.lookups[<n>] is not filled in: complete feature_lookup and online_features in config/training.yml, or regenerate with include_online_feature_lookup=false. |
Below |
Automatic promotion requires quality_threshold. |
Below |
AliasOutcomeUnknownError, or a pending alias event |
Lifecycle recovery |
Project and job definitions disagree; regenerate/redeploy the Bundle together. after a Core or template upgrade (workflow contract) |
Project upgrade |
The same message after changing follow_champion in config/inference.yml |
Redeploy the Bundle; see score handoff |
Training source has ... rows, exceeding max_rows=..., Training source observed size ... bytes exceeds max_bytes=... or Training source estimated size ... bytes exceeds max_bytes=... |
Training data: adjust max_rows / max_input_mb in config/training.yml, or set training_sample_rows to sample eligible rows before splitting. |
Training input has ... rows, exceeding max_rows=..., Training input size ... bytes exceeds max_bytes=... or Competition training data ... exceeds max_rows=... / max_bytes=... |
Python API: reduce the input size or adjust max_rows / max_bytes in fit_workflow or evaluate_competition_candidate. The frame training limit covers all splits together. Increase memory limits only when the process has enough memory. |
Initial scoring source exceeds the configured max_rows budget. or Source increment exceeds max_rows. |
Scoring |
<node>.apply on pandas: <reason>, for example project_scoring.apply on pandas: Custom scoring and reused pre-split rules are unsupported. (Spark admission) |
Distributed inference |
An online endpoint returns Encountered an unexpected error while evaluating the model. ... Error '' |
Online features: read the served model logs |
| A Unity Catalog permission error in a job run | Deployment; test the job's run_as identity |
Set both monitoring_catalog and monitoring_schema. |
Set both in deployment/variables.yml, or leave both blank with monitoring_enabled: "false". See if no destination is set |
Local artifact runtime mismatch for skyulf-core: requires ..., found ... or report reason champion_runtime_unavailable |
The model was produced by another runtime. Approve a reviewed replacement with allow_unloadable_champion=true, or run with the producing release. See champion from an older Core release. |
bundle init fails with ERROR_monitoring_schema_is_required_with_monitoring_catalog |
A monitoring catalog was answered without a schema. Answer both, or leave both blank to start without monitoring. See project setup. |
Spark reference is not prepared; run prepare_spark_monitoring_reference first. |
Monitoring enrollment |
Serving endpoint is not ready or its config update is pending. |
Serving |
Common errors on each topic page
| Topic | Typical symptoms |
|---|---|
| Project setup | Wrong schema in preview, missing columns or notebooks, monitoring destination |
| Deployment | REPLACE_* values, authentication, privileges, duplicate jobs |
| Project upgrade | Graph contract, missing notebooks, saved model runtime |
| Training data | Budgets, temporal boundaries, null labels, timezones |
| Custom steps | Factory paths, row count, source package and dependencies |
| Custom pre-split filters | Target-reading filters, non-Boolean masks |
| Decision thresholds | Too few classes, unknown manual class, threshold conflicts |
| Training reports | Missing report tasks, charts or SHAP, truncated parameters |
| Explanations | Missing SHAP tasks or artifacts, explanation status codes |
| Model sets | Replacement stays challenger, quality failures, Spark admission |
| Approve, reject and roll back | Missing quality threshold, changed champion, scoring after promotion |
| Lifecycle recovery | Uncertain alias changes |
| Scoring | Champion selection, eligibility, budgets, schema |
| Monitoring overview | Monitoring destination, nothing monitored, old dashboard results |
| Monitoring store setup | Store permissions and upgrades |
| Monitoring enrollment | Enrollment and references |
| Delayed labels | Label columns, timestamps, duplicate keys, classes |
| Drift | no_data, degraded, large PSI without drift |
| Performance | Unknown policy fields, missing baseline, failure streaks |
| Retraining | Why no new train run appeared |
| Monitoring dashboard | Issues to investigate, missing links |
| Serving | Endpoint readiness and privileges |
| Online features | Missing and stale online features |
| Serving monitoring | awaiting_logs, failed, blank counts or latency |
| Daily rollout | Retries, stops and recovery of traffic updates |
| Remove a project | Unexpected deletions, shared dashboard, endpoints left running |
A pre-split step reads the target
Example message, where the step name and target depend on your recipe:
Pre-split step 'dropmissingrows' reads target 'churn'. Set SKIP_TARGET_PRE_SPLIT_STEPS=True or SCORING_MODE='custom'.
Cause. The selected config/pre_split.yml recipe filters or edits churn,
the actual target. That can be appropriate when choosing labeled training rows.
The default scoring mode also reuses this recipe, but prediction requests do not
contain the actual target. Project loading resolves the saved scoring policy,
so this can fail during the training preview, before fitting or scoring.
Fix. Decide the scoring policy in config/scoring.yml before preview
and training. To reuse the feature checks while omitting target-dependent rules,
set:
version: 1
mode: pre_split
skip_target_pre_split_steps: true
eligibility: []
outputs: []
combined: []
A filter reading both target and feature columns is skipped as a whole. Split it into separate target and feature checks if the feature check must still apply to scoring. Fixed edits can instead be projected onto the selected input columns.
Alternatively, select mode: custom with skip_target_pre_split_steps: false and define the required eligibility
and output rules in the same file. Custom mode does not reuse pre-split rules;
the generated custom lists start empty. Do not select it expecting the commented
examples to become active. The training pre-split recipe still runs in either
case. These choices are saved with the newly fitted model; editing the file does
not change an already registered version's scoring policy.
Check. From the project root, run:
python src/tools/smoke.py
python src/tools/preview.py --action train
python src/tools/preview.py --action score
Confirm the selected recipe and scoring mode, then train a new model version. Read pre-split admission and scoring and scoring eligibility.
A feature lookup table name is incomplete
Example message for the second lookup:
feature_lookup.lookups[1].table_name: Unity Catalog names must be catalog.schema.name; each part a simple identifier (letters, digits, underscore; not starting with a digit).
Cause. feature_lookup.lookups[N].table_name is blank, contains an unresolved
placeholder, has fewer than three parts or has invalid identifier syntax. The index
is zero-based: [0] is the first list entry and [1] is the second. A completely
blank generated entry (no table_name, lookup_key or feature_names) reports
feature_lookup.lookups[N] is not filled in: ... instead: fill the entry, or
regenerate the project with include_online_feature_lookup=false. These checks validate names locally; passing them does not prove the table exists
or that the job can read it.
Fix. In config/training.yml, find the effective feature_lookup under
defaults or the model override and repair the indexed entry's table_name.
For example, replace an empty second table name with this field value:
table_name: "{catalog}.{input_schema}.balances"
Here catalog and input_schema come from the selected project bindings. A
concrete workspace.features.balances also works. Use your own existing feature
table name and simple identifiers. Preserve the entry's lookup_key,
feature_names and any timestamp lookup settings; ensure they match the table's
keys and the model's declared inputs. A model override replaces the complete
lookup mapping, so check the effective model entry rather than repairing only a
shadowed default. The syntax correction does not create or merge a feature table.
Check. Run the three local checks above with the intended catalog/schema bindings. The expanded table name should resolve without this message. Then verify table existence, feature metadata and permissions in the chosen workspace before training. See feature tables and lookup choices and the training reference.
Automatic promotion has no quality threshold
Automatic promotion requires quality_threshold.
Cause. The effective model configuration has promotion_policy: automatic
and a missing or null quality_threshold. A relative improvement requirement
or additional quality_gates does not replace the primary absolute threshold.
The validator stops before remote training and registry work.
Fix. In config/training.yml, set a numeric threshold under defaults or
the affected model entry, using the units and direction of its metric. For an
existing regression model, this is a fragment illustrating an RMSE upper bound:
defaults:
promotion_policy: automatic
metric: heldout_rmse
quality_threshold: 5.0
The value 5.0 is an example, not a recommended business limit. Choose your
acceptance criterion: lower RMSE is better, while classification accuracy/F1
needs a minimum acceptable score. Check model overrides for a null that masks the
default. Keep any additional gates and min_improvement requirements appropriate
to the same target and task. Choosing manual_approval allows a pending candidate
without this automatic-policy check; first-champion activation still needs an
explicit quality threshold and passing saved evidence.
Check. Run smoke.py and preview.py --action train again. Passing validation
only confirms a complete policy. After training, inspect the saved held-out metric
and every gate in training_report before accepting the candidate. Read the
quality fields
and registry lifecycle.
If your message is different
Keep the full traceback, task key, model/branch name, concrete model version and the effective configuration for the failing action. Inspect the first failing task; excluded conditional tasks are often expected. Retry only after checking whether training, alias changes or prediction publication already committed. Approve, reject and roll back explains saved results and operator actions; scoring recovery covers the recognized CDF-expiry path. This page does not enumerate every validator or imply that a local preview verifies cloud execution.