呱呱聚合
← 返回基因库
研发协作

把 Databricks 工作负载从经典集群迁移到…

当需要把 Databricks 的 notebook、job、pipeline 或 Scala JAR(spark_jar_task)从 classic compute 迁到 serverless compute,或检查现有代码是否 serverless 兼容时使用。

被复用0 次
复用有效—
置信度55%
沉淀时间2026-09-23
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
来自 ryan.zou 的小呱沉淀
GDI C 38/100

进化评分(GDI)

综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」

内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15

适用场景

把 Databricks 工作负载从经典特定

解决思路

  1. 先确认迁移目标是 serverless compute(Spark Connect、Environments、NCCs 架构);若只是 classic DBR 版本升级则本技能不适用。
  2. 使用父技能 databricks-core 处理 CLI 基础、认证和 profile 选择。
  3. 按 4 步迁移生命周期执行:Ingest(收集工作负载)→ Analyze(兼容性分析)→ Test(A/B 对比)→ Validate(验证并迭代)。
  4. Step 1 Ingest:读取用户的 notebook/脚本文件,识别 classic 集群配置(实例类型、DBR 版本、Spark 配置、init scripts、库),记录网络设置(VPC peering、instance profiles、mounts),理解工作负载类型(批处理、流式、交互式 notebook、pipeline),输出始终是 serverless compute 配置。
  5. Step 1.5 多 notebook 工作负载:当用户 notebook 数量 ≥ 3 或单个 notebook 超过约 5KB 时,逐个处理而非一次性全部处理。先枚举所有用户 notebook 路径(排除 _resources/ 设置 notebook),检查是否存在 bundle_config.py 并解析其上游源声明(git URL、S3 路径、init_scripts、git_source),克隆或拉取引用的仓库并纳入枚举。
  6. 对每个 notebook 按顺序:读取完整源码 → 仅针对该 notebook 运行 Step 2 分析清单 → 记录结构化摘要(notebook_path、detected_patterns[]、blockers[]、migration_steps[]、unmigratable 布尔值)→ 从活跃工作记忆中丢弃原始源码。若有可写 scratch 目录(~/.databricks-migration-skill/scratch/<run-id>/findings/),将摘要持久化为 <notebook-basename>.json。
  7. 所有 notebook 摘要完成后,仅根据摘要合成统一迁移计划,逐个 notebook 应用修复,除非摘要中有歧义否则不重读原始源码。
  8. Failure Reporting 协议每个工作负载只触发一次,而非每个 notebook 一次;detected_patterns 数组跨所有 notebook 聚合,notebook_characteristics 使用行数总和及语言/流式/ML 标志的并集。
  9. Step 2 Analyze:在创建或运行任何测试 job 之前先读取 notebook 和源文件,不要依赖失败的 job 运行来发现问题。扫描所有硬编码的 catalog/schema 引用(如 spark.table("main.schema.table")、spark.sql("... FROM main...")、catalog = "main"),检查依赖模式(init scripts、本地 wheel 文件、自定义安装函数、%pip install 行),定位 requirements.txt 并解析完整依赖集,标记 OS 级安装(apt install、yum install)。
  10. 对每个发现的问题报告:Category(3 类阻塞之一)、Severity(Blocker/Warning/Info)、Pattern(检测到什么及位置)、Fix(针对 serverless compute 的具体修复)。
  11. 重写后 lint:Cell-magic 边界检查(A1)。检测任何包含 # MAGIC %<word> 行的 cell(如 # MAGIC %run、# MAGIC %sql、# MAGIC %md、# MAGIC %pip、# MAGIC %fs);在该 cell 内每个非空行必须以 # MAGIC 开头或是空行。若普通 Python 注释出现在同一 cell 的 # MAGIC %... 指令之前,该 cell 已损坏。修复:首选将迁移说明放在上方单独的 # MAGIC %md cell(自己的 # COMMAND ---------- 块)中;可接受的做法是完全删除迁移说明,依赖 git/文件历史。
  12. Category A 不支持 API 修复:sc.parallelize(data) → spark.createDataFrame([(x,) for x in data], ["value"]);rdd.map(fn) → df.select(F.col("value") * 2) 或 df.withColumn(...);rdd.filter(fn) → df.filter(F.col("value") > 3);rdd.reduce(fn) → df.agg(F.sum("col")).collect()[0][0];rdd.flatMap(fn) → df.select(F.explode(F.split(col, " ")));rdd.groupByKey() → df.groupBy("key").agg(F.collect_list("value"));rdd.mapPartitions(fn) → df.groupBy(F.spark_partition_id()).applyInPandas(fn, schema);sc.textFile(path) → spark.read.text(path);sc.wholeTextFiles(path) → spark.read.format("binaryFile").load(path);sc.broadcast(data) → from pyspark.sql.functions import broadcast; df.join(broadcast(lookup_df), key);sc.accumulator(init) → df.agg(F.sum("col")) 或 df.count();spark.sparkContext → 直接使用 spark(SparkSession);SparkContext.getOrCreate() → 不支持,替换为 spark.createDataFrame() 或 spark.range();sqlContext.sql(query) → spark.sql(query);sc.hadoopConfiguration.set(...) → 使用 UC external locations。
  13. Category A 其他修复:df.cache()/df.persist() → 移除缓存调用,对昂贵中间结果物化到 Delta 表;df.checkpoint() → 写入 Delta 表;spark.catalog.cacheTable(t)/CACHE TABLE → 移除;%scala cell → 移植到 PySpark/SQL 或编译为 JAR 用于 job task;%r cell → 无 serverless 等价物,保留在 classic 或移植到 PySpark;Hive 变量语法 ${var} → 使用 DECLARE VARIABLE / SET VARIABLE(SQL)或 Python f-strings;CREATE GLOBAL TEMPORARY VIEW → 使用 CREATE OR REPLACE TEMPORARY VIEW;global_temp. 前缀 → 移除前缀;内置 max(..., key=)/min(..., key=)/sorted(..., key=) 配合 from pyspark.sql.functions import *(A2)→ 使用 sort+index:xs.sort(key=...); top = xs[0];from databricks import automl(A3)→ 重写为内联 scikit-learn Pipeline 配合 mlflow.sklearn.log_model + mlflow.register_model + UC alias;mlflow.pyfunc.spark_udf(...) 后跟 df.withColumn("prediction", loaded_model(struct(*features)))(A4)→ 首选驱动端 pandas 推理:mlflow.pyfunc.load_model(uri).predict(df.toPandas()) 然后 spark.createDataFrame(...),或固定 mlflow>=2.20.0;AutoCaptureConfigInput(enabled=...)(A5)→ 从 EndpointCoreConfigInput(...) 中完全移除 auto_capture_config 参数;mlflow.<flavor>.log_model(..., registered_model_name=...) 配合 mlflow.set_registry_uri("databricks-uc")(M1)→ 从 log_model 去掉该 kwarg,run 后调用 mlflow.register_model(model_uri=f"runs:/{run.info.run_id}/model", name=<full_name>) 和 MlflowClient().set_registered_model_alias(...);.latest_versions 访问(M2)→ 使用 client.search_model_versions(f"name='{name}'") + sort+index;log_model 无 signature= kwarg(M3)→ 用 infer_signature(X_sample, model.predict(X_sample)) 推断并传入 signature=signature;二分类预测列写为 float64(M4)→ 写入前 df.withColumn("prediction", col("prediction").cast("integer"))。
  14. Category B 数据访问修复:dbfs:/ 或 /dbfs/ 路径(持久数据)→ 替换为 /Volumes/<your_catalog>/schema/volume/path;dbfs:/tmp/、/dbfs/tmp/、含 cache/scratch/temp 的路径 → 使用 /tmp/ 或 /local_disk0/tmp/;file:///dbfs/ FUSE 挂载路径 → 持久路径替换为 /Volumes/...,临时路径替换为 /local_disk0/tmp/;dbutils.fs.mount(...) → 创建 UC external location + external volume;hive_metastore.db.table → 迁移到 UC 或使用 HMS Federation:CREATE FOREIGN CATALOG ... USING CONNECTION hms_connection;CREATE DATABASE/CREATE SCHEMA 无 USE CATALOG 或三级名 → 在 notebook 开头 CREATE 语句前加 spark.sql("USE CATALOG <your_catalog>");IAM instance profile 引用 → 使用 UC external locations + storage credentials;Hive SerDe 表 → 迁移到 UC 中的 Delta 表;config.py、config/__init__.py、_config*.py 或任何通过 %run 引用的 Python 文件中的裸 catalog = "<value>" / schema = "<value>" 赋值(B1)→ 扫描所有 config 文件,将 "main"、"main__build"、"hive_metastore" 等字面量替换为目标 catalog(通常 home_<user>),重写后 grep 整个迁移树查找残留字面量 catalog 引用;spark.sql("CREATE CATALOG IF NOT EXISTS ...")(B2)→ 先用 SHOW CATALOGS LIKE '...' 探测,仅当探测返回空时才发出 CREATE CATALOG,递归应用于整个迁移树包括 _resources/00-global-setup-v2.py 和 config* 文件,同样适用于 CREATE SCHEMA IF NOT EXISTS 和 CREATE VOLUME IF NOT EXISTS。
  15. Category C 流式修复:.trigger(processingTime=...) → .trigger(availableNow=True) + 设置 maxFilesPerTrigger 或 maxBytesPerTrigger 防止 OOM;.trigger(continuous=...) → 迁移到 SDP continuous mode;writeStream 上无 .trigger() 调用 → 必须添加 .trigger(availableNow=True);Kafka 源 → 配合 AvailableNow 使用,用 maxOffsetsPerTrigger 控制批大小;Auto Loader → 使用 cloudFiles.maxFilesPerTrigger(注意 cloudFiles. 前缀)。
  16. Category D 配置修复:不支持的 spark.conf.set(...) → 移除,仅支持 6 个配置:spark.sql.shuffle.partitions、spark.sql.session.timeZone、spark.sql.ansi.enabled、spark.sql.files.maxPartitionBytes、spark.sql.legacy.timeParserPolicy、spark.databricks.execution.timeout;Init scripts → 使用 Environments:通过 notebook Environment 面板或 requirements.txt 添加依赖并固定版本;Cluster policies → 使用 budget policies 进行成本归因;Docker containers → 使用 Environments 管理库,仅当需要 OS 级定制时保留在 classic;%run ./relative/path 或 %run ../path → 若引用 notebook <500 行则内联(首选),或转换为 dbutils.notebook.run("<absolute_workspace_path>", timeout) 使用绝对路径;os.environ["VAR"] → 使用 os.environ.get() 带 fallback、spark.version 或 dbutils.widgets;SET hivevar: / ${hivevar:...} → 使用 SQL 会话变量:DECLARE OR REPLACE VARIABLE name = value(DBR 14.1+);init scripts 中的环境变量 → 使用 dbutils.widgets 或 job 参数;显式 executor 数量/内存配置 → 移除;已退役的 Foundation Model endpoint 引用(D1)→ 通过内容扫描所有迁移文件检测,替换为当前默认 databricks-meta-llama-3-3-70b-instruct,最终部署前验证替换 endpoint 存在。
  17. Category E 库修复:notebook 中的 JAR 库 → 编译为 JAR job task(Scala 2.13、JDK 17、env version 4+);编译的 Scala JAR 迁移 → 针对 Scala 2.13.16 重新编译,依赖 databricks-connect % Provided,将 kernel 捆绑依赖标记 % Provided;Maven 坐标 → 替换为 Environments 中的 PyPI 包;%pip install 无版本固定 → 固定版本:%pip install numpy==2.2.2 pandas==2.2.3;自定义 Spark 数据源(v1/v2 JAR)→ 使用 Lakehouse Federation、Lakeflow Connect 或 PySpark 自定义数据源;LZO 格式文件 → 转换为 Parquet 或 Delta;SDP .py 库文件中通过 mlflow.pyfunc.spark_udf(..., env_manager='local') 加载的 AutoML 训练模型(E1)→ 在 SDP .py 库文件第一行非注释处自动发出 %pip install -q databricks-automl-runtime;AutoML → sklearn 重写(A3)配合已有 model-serving endpoint(E2)→ 在迁移测试 endpoint 的下游 serving notebook 中将 force_update = False 改为 True,翻转前确认 endpoint 名称匹配迁移副本。
  18. Category F 网络修复:VPC peering 配置 → 创建 NCCs,获取稳定 IP,在资源防火墙 allowlist,同区域 S3 访问无需更改;无 UC 的直接 S3/ADLS 访问 → 使用 UC external locations。
  19. Category G 规模与调试:大 driver 内存配置 → serverless REPL 默认 8GB(可通过 Environments 选 16GB+ 高内存);Spark UI 引用 → 使用 Query Profile:点击 cell 输出下的 "See performance"。
  20. Category H job 级配置(dbt_task、SDP、多源、部署前置条件):dbt_task 块(H1)→ 三个子检查:(1) warehouse_id 换成 Stable/专用 DBSQL serverless warehouse,(2) project_directory 重写到迁移后的 workspace 位置,(3) libraries[] 替换 classic-only Python wheel 为固定版本的 serverless 兼容版本,标记 dbt-databricks < 1.7.x;SDP pipeline spec 与原 demo 同 schema 并行部署(H2)→ 自动给 pipeline 目标 schema 加后缀(如 dbdemos_retail_c360 → dbdemos_retail_c360_skill_migrated),对转换文件中硬编码 schema 的 LIVE/STREAMING TABLE 引用应用同样重写,部署前 lint pipeline spec;Workspace import 10 MB 上限(H3)→ 部署前遍历迁移树标记 > 10 MB 的文件,将大文件(样本 CSV、dbt seed 数据等)改道到 UC Volumes(databricks fs cp),随 workspace import 命令发出 UC Volumes 上传命令及清单;多源工作负载含 bundle_config.py 声明上游 git URL(H4)→ 解析 bundle_config.py 并跟随上游源声明,在逐 notebook 枚举前克隆或拉取引用仓库,将 "external sources" 列为迁移计划中的一等工件类别。
  21. 生成必需的 Serverless Environment 规范:扫描所有 import 语句和 %pip install 行检测所需包,从 job 配置提取 init script 的 pip install 命令,生成适合 Jobs API environments 字段的 JSON 块(含 environment_key、spec.client、spec.dependencies)。ML runtime 库(mlflow、scikit-learn、hyperopt、xgboost、tensorflow、torch 等)在 serverless 上不预装,必须显式列在 environment spec dependencies 中。
  22. Step 3 Test 双分支策略:测试分支(serverless-test-{job_name}-{timestamp})从当前工作分支创建,无需 PR,设置测试数据(用 job lineage 在测试 catalog 创建上游表的采样副本),参数化 catalog,应用所有兼容性修复,创建 serverless 测试 job 并运行,失败则获取错误输出调试修复重试,记录哪些是测试 workaround 哪些是真实兼容性修复;生产分支(serverless-prod-{job_name})从 master 创建(不是从测试分支),仅应用真实兼容性修复,应用 job 配置变更,提交并创建 PR。
  23. 测试数据设置:从 lineage 或静态扫描解析 job 的上游表,对每个上游表运行 CREATE TABLE IF NOT EXISTS <test_catalog>.<schema>.<table> AS SELECT * FROM <prod_catalog>.<schema>.<table> LIMIT N(典型 N:10–1000 行),保持 schema 名与生产一致仅改 catalog,使操作幂等(跳过已存在的表),需要运行中的 SQL warehouse 和测试 catalog 的 CREATE TABLE 权限。
  24. 判断变更是否进生产:移除不兼容 Spark 配置、更新库版本、替换 DBFS 路径为 UC Volumes、移除 init scripts 添加 Environments、修复硬编码集群设置 → 是;catalog 覆盖为测试 catalog、缺失测试数据的空 DataFrame 处理、为加快测试的日期范围限制 → 否。简单测试:生产在 serverless 上没有此变更会失败吗?会则包含,不会则仅测试分支。
  25. A/B 对比:比较 classic 和 serverless 运行的输出,断言行数匹配、schema 匹配、exceptAll 差异为 0。若 serverless 运行失败,可临时设置支持的 Spark 配置(如 spark.sql.shuffle.partitions)桥接差距,标记为临时并在工作负载稳定后移除。
  26. Step 4 Validate:A/B 对比通过后合并生产分支 PR,将生产 job 切换到 serverless compute,通过系统表(system.billing.usage)和 budget policies 监控成本,移除任何临时桥接配置,设置预算告警。
  27. 迁移交付物:测试分支名称/URL、生产分支名称/URL、测试 job ID 和运行 URL、classic vs serverless 对比、serverless environment spec、变更摘要(生产 vs 仅测试及原因)。任何交付物缺失则迁移不完整,不要标记为完成。
  28. 停止条件:源表/测试 catalog/workspace 权限失败、Category 3 阻塞(R 代码、自定义 Spark 数据源 JAR、需要 classic compute 的功能)、SQL warehouse 或测试 catalog 不可用、重复失败(通常 5+ 次)且错误跟踪无新信息——生成失败报告而非继续。
  29. 运行时检测 serverless:import os; is_serverless = os.getenv("IS_SERVERLESS", "").lower() == "true"。
  30. 转换 job 配置:移除 job_clusters/new_cluster,添加带 serverless spec 的 environments,将 job_cluster_key 替换为 environment_key,移除 init_scripts。环境版本映射:classic DBR 13.x/14.x → spec.client "1"(Python 3.10);15.x → "2"(Python 3.11);16.x+ → "3"(Python 3.12)。
  31. Job 定义迁移:检测 job JSON 中的 init_scripts,提取所有 pip install 命令转换为 Environment dependencies,将 OS 级包(apt install/yum install)转换为 pip 等价物(如 apt install python3-opencv → opencv-python),无 pip 等价物的标记为 serverless 不兼容;Maven 坐标替换为 PyPI 等价物,DBFS 上的自定义 JAR 移到 /Volumes/<your_catalog>/schema/volume/ 并引用;移除 job_clusters/new_cluster 块,添加 environments 数组,将每个 task 的 job_cluster_key 替换为 environment_key,移除 init_scripts、num_workers、node_type_id、spark_version;扫描所有 spark.conf.set(...) 调用和 job JSON 中的 spark_conf 条目,支持的保留,自动调优的移除并注释,凭证配置移除,在每个移除处添加代码注释说明原因。
  32. 参数化 catalog 用于测试:dbutils.widgets.text("catalog", "main"); catalog = dbutils.widgets.get("catalog"); df = spark.table(f"{catalog}.sales.orders"),测试时传 catalog="test_catalog" 作为 job 参数。
  33. 调试失败的 serverless 运行:始终先用 w.jobs.get_run_output(run_id=...) 获取实际错误再猜测。常见错误修复:INFINITE_STREAMING_TRIGGER_NOT_SUPPORTED → 添加 .trigger(availableNow=True);UNRESOLVED_COLUMN → 临时视图名冲突,使用唯一名称;TABLE_OR_VIEW_NOT_FOUND → DBFS/HMS 表不可访问,迁移到 UC;Py4JError → 使用了 SparkContext/RDD,重写为 DataFrame;包安装超时 → 固定版本,不要安装 PySpark 作为依赖;ModuleNotFoundError: No module named 'mlflow' → 添加到 environment spec dependencies;SparkContext.getOrCreate() 不支持 → 替换为 spark.createDataFrame() 或 spark.range();UC_FILE_SCHEME_FOR_TABLE_CREATION_NOT_SUPPORTED → 使用托管表或 /Volumes/... 路径;PERMISSION_DENIED: CREATE SCHEMA on Catalog 'main' → 在 CREATE 语句前加 spark.sql("USE CATALOG <your_catalog>");DATA_SOURCE_NOT_FOUND → Category 3 阻塞,自定义 JAR 数据源需要 classic compute;NoSuchMethodError: scala.Predef$.wrapRefArray → Scala 版本不匹配,JAR 针对 2.12 编译,serverless 是 2.13.16,重新编译;NoClassDefFoundError for org/apache/spark/... → Spark 被捆绑而非 provided,标记 databricks-connect % Provided;SyntaxError → 确保注释在 MAGIC 块内;File './<name>' not found from %run → A1,普通 Python 注释在 # MAGIC %run 前,移到上方 # MAGIC %md cell;TypeError: max() got an unexpected keyword argument 'key' → A2,使用 sort+index;TypeError: Object of type PlanMetrics is not JSON serializable → A3,重写为内联 sklearn Pipeline;NameError: cannot access free variable 'loaded_model' → A4,使用驱动端 pyfunc.load_model + toPandas() + spark.createDataFrame 或固定 mlflow>=2.20.0;ModuleNotFoundError: No module named 'databricks.automl_runtime' → E1,在 SDP .py 库文件顶部发出 %pip install -q databricks-automl-runtime;HTTP 400: Failed to enforce schema of data ... Model is missing inputs ['id'] → E2,翻转下游 force_update = False → True;RESOURCE_DOES_NOT_EXIST from get_model_version_by_alias(..., 'Champion') → M1,从 log_model 去掉 registered_model_name=,run 后调用 mlflow.register_model(...);TypeError: 'NoneType' object is not iterable from .latest_versions → M2,使用 client.search_model_versions(...) + sort+index;MlflowException: Model signature is required → M3,用 infer_signature 推断并传入 signature=;404 on ai_query(endpoint => 'databricks-meta-llama-3-1-405b-instruct') → D1,替换为 databricks-meta-llama-3-3-70b-instruct;PERMISSION_DENIED: User does not have CREATE CATALOG on Metastore → B2,用 SHOW CATALOGS LIKE '...' 探测;Table is already managed by pipeline → H2,给迁移 pipeline 目标 schema 加后缀;DELTA_FAILED_TO_MERGE_FIELDS: prediction (Double) vs prediction (Integer) → M4,写入前 cast 为 IntegerType。
  34. 性能模式选择:Performance-Optimized(启动 <50 秒,成本较高,适用于 Notebooks/Jobs/SDP,适合交互式工作、开发、时间敏感)vs Standard(启动 4-6 分钟,成本显著较低,仅适用于 Jobs 和 SDP,适合批处理 ETL、计划 pipeline)。Standard 模式不适用于 notebook,notebook 始终使用 Performance-Optimized。
  35. Serverless 默认值:REPL VM 内存 8GB 默认(可选高内存),最大 executor 32(Premium)/64(Enterprise)可通过支持提升,支持的 Spark 配置仅 6 个,调试用 Query Profile(无 Spark UI),ANSI SQL 默认启用(可配置)。
  36. 失败报告协议:当迁移失败或遇到不可迁移模式时,生成结构化失败报告并提供用户一步提交 GitHub issue 的路径。当工作负载无法完全按原样迁移到 serverless 时始终提供提交 issue 的选项(包括 Category 3 阻塞、重试耗尽、未知模式、修复未解决、显式请求)。仅当迁移完全成功或工作负载已 serverless 兼容无需更改时不提供。
  37. 生成报告:写 JSON 文件到 ~/.databricks-migration-skill/reports/failure-<ISO-timestamp>.json,严格遵循 schema(report_version、report_id、skill_version、timestamp、failure_phase、detected_patterns、attempted_fixes、final_error_category、final_error_signature、retry_count、total_duration_seconds、notebook_characteristics)。
  38. 报告禁止包含:代码内容(仅 pattern ID)、文件路径、错误消息文本(仅错误类别枚举和哈希签名)、标识符(表名、列名、catalog 名、schema 名、secret scope 名、用户邮箱、workspace ID、account ID)、内部 Databricks 引用、客户引用、凭证、数据描述。
  39. 匿名化安全检查:写报告前扫描每个字符串字段,若匹配邮箱、云存储路径、workspace URL、Slack ID、go/ 链接、内部 ticket ID、长十六进制 ID、catalog/schema/table 名等模式则丢弃该字段(空字符串比部分脱敏更安全)。
  40. 确定性序列化后清理(必需):JSON 序列化后,对最终 JSON 文件重新运行 MUST-NOT-CONTAIN 正则集作为字面文本搜索。若任何模式匹配,拒绝显示预填 URL 或 gh issue create 命令,打印本地文件路径,列出匹配的模式,告诉用户手动脱敏后再分享。仅当序列化后清理干净时才可显示预填 URL。
  41. 生成报告后的输出模板:默认仅本地。始终包含本地报告文件路径、一行说明报告仅含 pattern ID 和 notebook 特征无代码或标识符、提示用户打开文件确认脱敏后告知分享。仅在用户明确确认且确定性序列化后清理干净后,才生成 Option A(预填 GitHub issue URL,title 和 body 都 URL 编码)或 Option B(gh issue create --repo databricks/databricks-agent-skills 命令,body-file 指向本地报告)。不要在写文件的同一轮生成 URL 或 gh 命令,分两轮:写+提供审查,然后明确确认后发布。
  42. 构建预填 URL:Title 格式 [migration-skill] <final_error_category> in <failure_phase> phase;Body 为 issue 模板 markdown 骨架(Category、Environment、Description、Failure report JSON 用 ```json 围栏)内联报告 JSON;URL 编码 title 和 body;最终 URL 为 https://github.com/databricks/databricks-agent-skills/issues/new?template=migration-feedback.md&title=<URL-encoded title>&body=<URL-encoded body>。若运行时无法写文件,仍显示文件应在的路径并生成 Options A 和 B。
  43. 绝不自动传输报告。用户拥有其数据,必须在分享前审查。若用户拒绝,不要施压,记录本地报告路径并继续。
  44. 成功报告:迁移成功时生成与失败报告结构相同的每工作负载报告(减去发布脱敏步骤),列出检测到的模式和应用的修复,写到 ~/.databricks-migration-skill/reports/success-<timestamp>.json 并告知用户文件路径。
  45. 多工作负载迁移:当多个独立工作负载在范围内时并行迁移(如每个工作负载一个 subagent),保持单个工作负载内的逐 notebook 步骤顺序执行。
  46. 参考指南:Compatibility Checks(40+ 检查的完整模式检测表)、Streaming Migration(触发器迁移、SDP continuous mode、continuous jobs)、Networking and Security(VPC peering 到 NCCs、Private Link、防火墙设置)、Code Patterns(每个迁移模式的完整前后代码示例)、Configuration Guide(支持的 Spark 配置、Environments 设置、budget policies)、MLflow on UC(AutoML 重写为 sklearn、UC 感知注册、latest_versions 替换、spark_udf 闭包 bug 修复、预测列 dtype 对齐)、Multi-source enumeration(解析 bundle_config.py 并在逐 notebook 分析前拉取上游 git 源)、Failure Reporting(脱敏清单 + 预填 GitHub issue URL 配方)、Install in Databricks Genie Code(在 Databricks workspace 内运行此技能)、JAR Migration(迁移编译的 Scala JAR:Scala 2.13.16、Databricks Connect、依赖冲突 vs serverless kernel classpath、sbt 修复、构建/测试/部署)。

适用边界 · 注意事项