使用 Databricks 资产捆绑包在 Azure Databricks 上开发作业
Databricks 资产捆绑包简称为捆绑包,包含要部署的项目和 Azure Databricks 资源(如要运行的作业)的设置,并使你能够以编程方式验证、部署和运行它们。 请参阅什么是 Databricks 资产捆绑包?。
本文介绍了如何创建捆绑包来以编程方式管理作业。 请参阅计划和协调工作流。 该包是使用 Python 的 Databricks 资产捆绑包默认捆绑包模板创建的,由一个笔记本和运行该笔记本的作业的定义组成。 然后在 Azure Databricks 工作区中验证、部署和运行已部署的作业。
提示
如果要移动到捆绑包的现有作业是使用 Azure Databricks 作业用户界面或 API 创建的,则必须在捆绑包的配置文件中对其进行定义。 Databricks 建议首先使用以下步骤创建捆绑包,并验证捆绑包是否正常工作。 然后,可以将其他作业定义、笔记本和其他源添加到捆绑包。 请参阅将现有作业定义添加到捆绑包。
要求
- Databricks CLI 版本 0.218.0 或更高版本。 若要检查安装的 Databricks CLI 版本,请运行命令
databricks -v
。 要安装 Databricks CLI,请参阅《安装或更新 Databricks CLI》。 - 远程 Databricks 工作区必须启用工作区文件。 请参阅什么是工作区文件?。
使用项目模板创建捆绑包
首先,使用 Databricks 资产捆绑包的默认 Python 模板来创建捆绑包。 有关捆绑包模板的详细信息,请参阅 Databricks 资产捆绑包项目模板。
如果要从头开始创建捆绑包,请参阅手动创建捆绑包。
步骤 1:设置身份验证
此步骤在开发计算机上的 Databricks CLI 与 Azure Databricks 工作区之间设置身份验证。 本文假设你要使用 OAuth 用户到计算机 (U2M) 身份验证和名为 DEFAULT
的相应的 Azure Databricks 配置文件进行身份验证。
注意
U2M 身份验证适用于实时尝试这些步骤。 对于完全自动化的工作流,Databricks 建议改用 OAuth 计算机到计算机 (M2M) 身份验证。 请参阅身份验证中的 M2M 身份验证设置说明。
通过对每个目标工作区运行以下命令,使用 Databricks CLI 在本地启动 OAuth 令牌管理。
在以下命令中,将
<workspace-url>
替换为 Azure Databricks 每工作区 URL,例如https://adb-1234567890123456.7.azuredatabricks.net
。databricks auth login --host <workspace-url>
Databricks CLI 会提示将输入的信息保存为 Azure Databricks 配置文件。 按
Enter
接受建议的配置文件名称,或输入新的或现有的配置文件的名称。 任何具有相同名称的现有配置文件都会被输入的信息覆盖。 可以使用配置文件在多个工作区之间快速切换身份验证上下文。若要获取任何现有配置文件的列表,请在单独的终端或命令提示符中使用 Databricks CLI 来运行
databricks auth profiles
命令。 若要查看特定配置文件的现有设置,请运行databricks auth env --profile <profile-name>
命令。在 Web 浏览器中,按照屏幕上的说明登录到 Azure Databricks 工作区。
若要查看配置文件的当前 OAuth 令牌值和令牌即将到期的到期时间戳,请运行以下命令之一:
databricks auth token --host <workspace-url>
databricks auth token -p <profile-name>
databricks auth token --host <workspace-url> -p <profile-name>
如果你有多个配置文件有相同的
--host
值,则可能需要同时指定--host
和-p
选项,以便 Databricks CLI 找到正确的匹配 OAuth 令牌信息。
步骤 2:初始化捆绑包
使用默认 Python 捆绑包项目模板来初始化捆绑包。
使用终端或命令提示符切换到本地开发计算机上的目录,其中包含模板生成的捆绑包。
使用 Databricks CLI 运行
bundle init
命令:databricks bundle init
对于
Template to use
,请按Enter
保留default-python
的默认值。对于
Unique name for this project
,请保留my_project
的默认值,或键入其他值,然后按Enter
。 这将确定此捆绑包的根目录的名称。 此根目录是在当前工作目录中创建的。对于“
Include a stub (sample) notebook
”,选择“yes
”并按“Enter
”。对于“
Include a stub (sample) DLT pipeline
”,选择“no
”并按“Enter
”。 这会指示 Databricks CLI 不要在捆绑包中定义示例 Delta Live Tables 管道。对于“
Include a stub (sample) Python package
”,选择“no
”并按“Enter
”。 这会指示 Databricks CLI 不要向捆绑包添加示例 Python wheel 包文件或相关的生成说明。
步骤 3:浏览捆绑包
要查看模板生成的文件,请切换到新创建的捆绑包的根目录。 特别感兴趣的文件包括:
databricks.yml
:此文件指定捆绑包的编程名称,包括对作业定义的引用,并指定有关目标工作区的设置。resources/<project-name>_job.yml
:此文件指定作业的设置,包括一个默认笔记本任务。src/notebook.ipynb
:此文件是一个示例笔记本,它在运行时只需初始化包含数字 1 到 10 的 RDD。
对于自定义作业,作业声明中的映射对应于创建作业操作的请求有效负载(以 YAML 格式表示),如 REST API 参考中的 POST /api/2.1/jobs/create 中所述。
提示
可以使用覆盖 Databricks 资产包中的群集设置中描述的技术来定义、组合和覆盖捆绑包中新作业群集的设置。
步骤 4:验证项目的捆绑包配置文件
在此步骤中,检查捆绑包配置是否有效。
在根目录中,使用 Databricks CLI 运行
bundle validate
命令,如下所示:databricks bundle validate
如果返回了捆绑包配置的摘要,则表示验证成功。 如果返回了任何错误,请修复错误,然后重复此步骤。
如果在此步骤之后对捆绑包进行任何更改,则应重复此步骤以检查捆绑包配置是否仍然有效。
步骤 5:将本地项目部署到远程工作区
此步骤将本地笔记本部署到远程 Azure Databricks 工作区,并在工作区中创建 Azure Databricks 作业。
在捆绑包根目录中,使用 Databricks CLI 运行
bundle deploy
命令,如下所示:databricks bundle deploy -t dev
检查是否已部署本地笔记本:在 Azure Databricks 工作区的边栏中,单击“工作区”。
单击进入以下文件夹:Users >
<your-username>
> .bundle ><project-name>
> dev > files > src。 笔记本应该位于此文件夹中。检查是否已创建作业:在 Azure Databricks 工作区的边栏中,单击“工作流”。
在“作业”选项卡上,单击“[dev
<your-username>
]<project-name>_job
”。单击“任务”选项卡。应该有一个任务:notebook_task。
如果在此步骤之后对捆绑包进行了任何更改,则应重复步骤 4-5 以检查捆绑包配置是否仍然有效,然后重新部署项目。
步骤 6:运行部署的项目
此步骤将从命令行触发在工作区中运行 Azure Databricks 作业。
在根目录中,使用 Databricks CLI 运行
bundle run
命令,如下所示,将<project-name>
替换为步骤 2 中项目的名称:databricks bundle run -t dev <project-name>_job
复制终端中显示的
Run URL
值,并将该值粘贴到 Web 浏览器中以打开 Azure Databricks 工作区。 请参阅查看和运行使用 Databricks 资产捆绑包创建的作业在 Azure Databricks 工作区中,作业任务成功完成并显示绿色标题栏后,请单击作业任务以查看结果。
如果在此步骤之后对捆绑包进行了任何更改,则应重复步骤 4-6 以检查捆绑包配置是否仍然有效,重新部署项目,然后运行重新部署的项目。
步骤 7:清理
在此步骤中,将从工作区中删除已部署的笔记本和作业。
在根目录中,使用 Databricks CLI 运行
bundle destroy
命令,如下所示:databricks bundle destroy -t dev
确认作业删除请求:当系统提示是否永久销毁资源时,请键入
y
并按Enter
。确认笔记本删除请求:当系统提示是否永久销毁先前部署的文件夹及其所有文件时,请键入
y
并按Enter
。如果还想从开发计算机中删除捆绑包,现在可以从步骤 2 中删除本地目录。
将现有作业定义添加到捆绑包
可以使用现有的作业作为基础在捆绑包配置文件中定义作业。 若要获取现有作业定义,可以使用 UI 手动检索它,也可以使用 Databricks CLI 以编程方式生成它。
有关捆绑包中的作业定义的信息,请参阅作业。
使用 UI 获取现有作业定义
若要从 Azure Databricks 工作区 UI 获取现有作业定义的 YAML 表示形式,请执行以下操作:
在 Azure Databricks 工作区的边栏中,单击“工作流”。
在“作业”选项卡上,单击作业的“名称”链接。
在“立即运行”按钮旁边,单击串形菜单,然后单击“切换到代码(YAML)”。
添加复制到捆绑包
databricks.yml
文件的 YAML,或在捆绑包项目的resources
目录中为你的作业创建一个配置文件,然后从databricks.yml
文件引用该配置文件。 请参阅 (/dev-tools/bundles/settings.md#resources)。下载并将现有作业中引用的所有 Python 文件和笔记本添加到捆绑包的项目源中。 通常,捆绑包项目位于捆绑包的
src
目录中。提示
可以通过单击 Azure Databricks 笔记本用户界面中的“文件”>“导出”>“IPython Notebook”,将现有笔记本从 Azure Databricks 工作区导出为
.ipynb
格式。将笔记本、Python 文件和其他生成工件添加到捆绑包后,请确保作业定义正确引用它们。 例如,对于位于捆绑包的
hello.ipynb
目录中名为src
的笔记本:resources: jobs: hello-job: name: hello-job tasks: - task_key: hello-task notebook_task: notebook_path: ../src/hello.ipynb
使用 Databricks CLI 生成现有作业定义
若要以编程方式为现有作业生成捆绑包配置,请执行以下操作:
从作业 UI 中作业的“作业详细信息”侧面板中检索现有作业的 ID,或者使用 Databricks CLI
databricks jobs list
命令。运行
bundle generate job
Databricks CLI 命令,设置作业 ID:databricks bundle generate job --existing-job-id 6565621249
此命令将在捆绑包的
resources
文件夹中为作业创建一个捆绑配置文件,并将任何引用的工件下载到src
文件夹。提示
如果首先使用
bundle deployment bind
将捆绑包中的资源绑定到工作区中的资源,则在下一次bundle deploy
之后,工作区中的资源将根据其绑定到的捆绑包中定义的配置进行更新。 有关bundle deployment bind
的信息,请参阅绑定捆绑包资源。
配置使用无服务器计算的作业
以下示例演示捆绑配置,以创建使用无服务器计算的作业。
若要使用无服务器计算来运行包含笔记本任务的作业,请省略捆绑配置文件中的 job_clusters
配置。
# yaml-language-server: $schema=bundle_config_schema.json
bundle:
name: baby-names
resources:
jobs:
retrieve-filter-baby-names-job-serverless:
name: retrieve-filter-baby-names-job-serverless
tasks:
- task_key: retrieve-baby-names-task
notebook_task:
notebook_path: ./retrieve-baby-names.py
- task_key: filter-baby-names-task
depends_on:
- task_key: retrieve-baby-names-task
notebook_task:
notebook_path: ./filter-baby-names.py
targets:
development:
workspace:
host: <workspace-url>
若要使用无服务器计算来运行包含 Python 任务的作业,请包括 environments
配置。
# yaml-language-server: $schema=bundle_config_schema.json
bundle:
name: serverless-python-tasks
resources:
jobs:
serverless-python-job:
name: serverless-job-with-python-tasks
tasks:
- task_key: wheel-task-1
python_wheel_task:
entry_point: main
package_name: wheel_package
environment_key: Default
environments:
- environment_key: Default
spec:
client: "1"
dependencies:
- workflows_authoring_toolkit==0.0.1
targets:
development:
workspace:
host: <workspace-url>