重要
本文档已过时,将来可能不会更新。
Databricks 建议使用 Databricks 资产捆绑包,而不是使用 Databricks Labs 的 dbx。 请参阅什么是 Databricks 资产捆绑包?和从 dbx 迁移到捆绑包。
若要将 Azure Databricks 与 Visual Studio Code 配合使用,请参阅 Visual Studio Code 的 Databricks 扩展一文。
本文介绍一个基于 Python 的代码示例,该示例可在任何与 Python 兼容的 IDE 中使用。 具体而言,本文介绍如何在 Visual Studio Code 中使用此代码示例,该示例提供以下开发人员工作效率功能:
本文使用 dbx by Databricks Labs 以及 Visual Studio Code 将代码示例提交到远程 Azure Databricks 工作区。
dbx 指示 Azure Databricks 将 Lakeflow 作业 提交的代码在该工作区中的 Azure Databricks 作业群集 上运行。
可以使用常用的第三方 Git 提供程序进行代码的版本控制和持续集成以及持续交付或持续部署(CI/CD)。 对于版本控制,这些 Git 提供程序包括以下内容:
对于 CI/CD,dbx 支持以下 CI/CD 平台:
为了演示版本控制和 CI/CD 的工作原理,本文介绍如何使用 Visual Studio Code、dbx、此代码示例以及 GitHub 和 GitHub Actions。
代码示例要求
若要使用此代码示例,必须具有以下各项:
- Azure Databricks 帐户中的一个 Azure Databricks 工作区。
- 一个 GitHub 帐户。 如果还没有 GitHub 帐户,请创建一个。
此外,在本地开发计算机上,必须具有以下各项:
Python 3.8 或更高版本。
应该使用与目标群集上安装的版本匹配的 Python 版本。 若要获取现有群集上安装的 Python 版本,可以使用群集的 Web 终端运行
python --version命令。 另请参阅 Databricks Runtime 发行说明版本和兼容性中的“系统环境”部分,了解适用于你的目标群集的 Databricks Runtime 版本。 在任何情况下,Python 的版本都必须为 3.8 或更高版本。若要获取当前在本地计算机上引用的 Python 版本,请从本地终端运行
python --version。 (根据在本地计算机上设置 Python 的方式,可能需要在整个文章中运行python3而不是python。)另请参阅选择 Python 解释器。pip。
pip使用较新版本的 Python 自动安装。 若要检查是否已安装pip,请从本地终端运行pip --version。 (根据在本地计算机上设置 Python 或pip的方式,可能需要在整个文章中运行pip3而不是pip。)dbx 版本 0.8.0 或更高版本。 可以通过运行
dbx,从 Python 包索引 (PyPI) 安装pip install dbx包。注意
现在无需安装
dbx。 稍后可以在代码示例安装部分中安装它。一个用于创建 Python 虚拟环境的方法,以确保在
dbx项目中使用正确版本的 Python 和包依赖项。 本文将介绍 pipenv。版本为0.18 或以下的 Databricks CLI,已设置身份验证。
注意
现在无需安装旧版 Databricks CLI(Databricks CLI 版本 0.17)。 稍后可以在代码示例安装部分中安装它。 如果以后要安装它,则必须记住在那个时候设置身份验证。
Visual Studio Code 的 Python 扩展。
Visual Studio Code 的 GitHub 拉取请求和问题扩展。
Git。
关于代码示例
本文的 Python 代码示例在 GitHub 中的 databricks/ide-best-practices 存储库中提供,执行以下操作:
从 GitHub 中的 owid/covid-19-data 存储库中获取数据。
筛选特定 ISO 国家/地区代码的数据。
从数据创建数据透视表。
对数据执行数据清洗。
将代码逻辑模块化为可重用函数。
单元测试函数。
提供
dbx项目配置和设置,使代码能够将数据写入远程 Azure Databricks 工作区中的 Delta 表。
设置代码示例
满足此代码示例的要求后,请完成以下步骤以开始使用代码示例。
注意
这些步骤不包括为 CI/CD 设置此代码示例。 无需设置 CI/CD 也能运行此代码示例。 若要稍后设置 CI/CD,请参阅使用 GitHub Actions 运行。
步骤1:创建 Python 虚拟环境
在终端中,创建一个空白文件夹,以包含此代码示例的虚拟环境。 这些说明使用名为
ide-demo的父级文件夹。 可以为此文件夹指定任何名称。 如果使用其他名称,请在整个文章中替换该名称。 创建文件夹后,切换到该文件夹,然后从该文件夹启动 Visual Studio Code。 请务必在.命令后添加点 (code)。对于 Linux 和 macOS:
mkdir ide-demo cd ide-demo code .提示
如果收到错误
command not found: code,请参阅 Microsoft 网站上的从命令行启动。对于 Windows:
md ide-demo cd ide-demo code .在 Visual Studio Code 的菜单栏中,单击“视图”>“终端”。
从
ide-demo文件夹的根目录,结合以下选项运行pipenv命令,其中<version>是已在本地安装的 Python 的目标版本(最好是与目标群集的 Python 版本匹配的版本),例如3.8.14。pipenv --python <version>记下
Virtualenv location命令输出中的pipenv值,因为在下一步骤中需要用到。选择目标 Python 解释器,然后激活 Python 虚拟环境:
在菜单栏上,单击视图 > 命令面板,在弹出的窗口中键入
Python: Select,然后单击Python: 选择解释器。选择刚刚创建的 Python 虚拟环境的路径中的 Python 解释器。 (此路径在
Virtualenv location命令的输出中作为pipenv值列出。)在菜单栏上,单击 视图 > 命令面板,键入
Terminal: Create,然后单击“终端: 创建新终端”。确保命令提示符指示你位于
pipenvshell 中。 若要确认,应在命令提示符前看到类似(<your-username>)内容。 如果未看到,请运行以下命令:pipenv shell若要退出
pipenvshell,请运行命令exit,括号消失。
有关详细信息,请参阅 Visual Studio Code 文档中的在 VS Code 中使用 Python 环境。
步骤 2:从 GitHub 克隆代码示例
在 Visual Studio Code 中,打开
ide-demo文件夹(“文件”>“打开文件夹”,如果尚未打开)。单击“视图”>“命令面板”,键入 ,然后单击“Git: 克隆”
Git: Clone。对于提供存储库 URL 或选择存储库源,请输入
https://github.com/databricks/ide-best-practices浏览到文件夹
ide-demo,然后单击“选择存储库位置”。
步骤 3:安装代码示例的依赖项
安装
dbx的某个版本以及与你的 Python 版本兼容的 Databricks CLI 版本 0.18 或更低版本。 要做到这一点,请在 Visual Studio Code 的终端中,从你的ide-demo文件夹中,激活pipenvshell (pipenv shell),然后运行以下命令:pip install dbx确认已安装
dbx。 为此,请运行以下命令:dbx --version如果返回版本号,则已安装
dbx。如果版本号低于 0.8.0,请运行以下命令来升级
dbx,然后再次查看版本号:pip install dbx --upgrade dbx --version # Or ... python -m pip install dbx --upgrade dbx --version安装
dbx时,会同时自动安装旧版 Databricks CLI(Databricks CLI 版本 0.17)。 若要确认已安装旧版 Databricks CLI(Databricks CLI 版本 0.17),请运行以下命令:databricks --version如果返回了 Databricks CLI 版本 0.17,则会安装旧版 Databricks CLI。
如果尚未设置带有身份验证的旧版 Databricks CLI(Databricks CLI 版本 0.17),则必须立即进行设置。 若要确认是否已设置身份验证,请运行以下命令以获取有关 Azure Databricks 工作区的一些摘要信息。 请确保在
/子命令后面包括正斜杠 (ls):databricks workspace ls /如果返回工作区的根级文件夹名称列表,则会设置身份验证。
安装此代码示例所依赖的 Python 包。 若要进行此验证,请从文件夹
ide-demo/ide-best-practices运行以下命令:pip install -r unit-requirements.txt确认已安装代码示例的依赖包。 为此,请运行以下命令:
pip list如果文件夹
requirements.txt和unit-requirements.txt中列出的包位于此列表中的某个位置,则已安装依赖包。注意
requirements.txt中列出的文件适用于特定包版本。 为了获得更好的兼容性,可以将这些版本与您希望 Azure Databricks 工作区将来运行部署时使用的群集节点类型进行对照。 请参阅 Databricks Runtime 发行说明版本和兼容性中的“系统环境”部分,了解你的群集的 Databricks Runtime 版本。
步骤 4:自定义 Azure Databricks 工作区的代码示例
自定义存储库的
dbx项目设置。 要执行此操作,请在.dbx/project.json文件中,将profile对象的值从DEFAULT更改为与您使用旧版 Databricks CLI(Databricks CLI 版本 0.17)进行身份验证所配置的相匹配的配置文件名称。 如果未设置任何非默认配置文件,请保留DEFAULT原样。 例如:{ "environments": { "default": { "profile": "DEFAULT", "storage_type": "mlflow", "properties": { "workspace_directory": "/Workspace/Shared/dbx/covid_analysis", "artifact_location": "dbfs:/Shared/dbx/projects/covid_analysis" } } }, "inplace_jinja_support": false }自定义
dbx项目的部署设置。 若要执行此操作,请在conf/deployment.yml文件中将spark_version和node_type_id对象的值从10.4.x-scala2.12和m6gd.large更改为你希望 Azure Databricks 工作区用于在其上运行部署的 Azure Databricks 运行时版本字符串和群集节点类型。例如,指定 Databricks Runtime 10.4 LTS 和
Standard_DS3_v2节点类型:environments: default: workflows: - name: 'covid_analysis_etl_integ' new_cluster: spark_version: '10.4.x-scala2.12' num_workers: 1 node_type_id: 'Standard_DS3_v2' spark_python_task: python_file: 'file://jobs/covid_trends_job.py' - name: 'covid_analysis_etl_prod' new_cluster: spark_version: '10.4.x-scala2.12' num_workers: 1 node_type_id: 'Standard_DS3_v2' spark_python_task: python_file: 'file://jobs/covid_trends_job.py' parameters: ['--prod'] - name: 'covid_analysis_etl_raw' new_cluster: spark_version: '10.4.x-scala2.12' num_workers: 1 node_type_id: 'Standard_DS3_v2' spark_python_task: python_file: 'file://jobs/covid_trends_job_raw.py'
提示
在此示例中,三个作业定义中的每一个都具有相同的 spark_version 和 node_type_id 值。 可以将不同的值用于不同的作业定义。 还可以创建共享值,并在作业定义之间重复使用,以减少键入错误和代码维护。 请参阅 文档中的 dbx 示例。
浏览代码示例
设置代码示例后,请使用以下信息了解 ide-demo/ide-best-practices 文件夹中的各种文件的工作原理。
代码模块化
非模块化代码
该文件 jobs/covid_trends_job_raw.py 是代码逻辑的非模块化版本。 可以单独运行此文件。
模块化代码
该文件 jobs/covid_trends_job.py 是代码逻辑的模块化版本。 此文件依赖于文件 covid_analysis/transforms.py 中的共享代码。 该文件 covid_analysis/__init__.py 将文件夹 covide_analysis 视为包含包。
测试
单元测试
该文件 tests/testdata.csv 包含文件 covid-hospitalizations.csv 中用于测试的一小部分数据。 该文件 tests/transforms_test.py 包含文件 covid_analysis/transforms.py 的单元测试。
单元测试运行程序
该文件 pytest.ini 包含使用 pytest 运行测试的配置选项。 请参阅 文档中的 pytest.ini 和pytest。
该文件 .coveragerc 包含使用 coverage.py 的 Python 代码覆盖率度量的配置选项。 请参阅 文档中的coverage.py。
该文件 requirements.txt 是之前使用 unit-requirements.txt 运行的文件 pip 的子集,包含单元测试也依赖的包列表。
打包
该文件 setup.py 提供在控制台(控制台脚本)中运行的命令,例如 pip 命令,用于将 Python 项目打包为 setuptools。 请参阅 文档中的setuptools。
其他文件
此代码示例中还有其他尚未描述的文件:
- 该
.github/workflows文件夹包含三个文件,databricks_pull_request_tests.yml、onpush.yml以及onrelease.yaml,代表 GitHub Actions,稍后在 GitHub Actions 部分中介绍。 - 该文件
.gitignore包含 Git 为存储库忽略的本地文件夹和文件的列表。
运行代码示例
可以在本地计算机上使用 dbx,指示 Azure Databricks 按需在远程工作区中运行代码示例,如下一个子节中所述。 或者,每次将代码更改推送到 GitHub 存储库时,可以使用 GitHub Actions 让 GitHub 运行代码示例。
使用 dbx 运行
从
covid_analysis项目的根目录(例如文件夹setuptools)运行以下命令,在 Pythondbx下将ide-demo/ide-best-practices文件夹的内容安装为包。 请务必在命令末尾包含点 (.):pip install -e .此命令创建一个
covid_analysis.egg-info文件夹,其中包含有关covid_analysis/__init__.py和covid_analysis/transforms.py文件编译版本的信息。通过运行以下命令运行测试:
pytest tests/测试结果在终端中显示。 这四个测试都应显示为通过。
提示
有关测试的其他方法,包括 R 和 Scala 笔记本的测试,请参阅笔记本的单元测试。
(可选)运行以下命令,获取测试的测试覆盖率指标:
coverage run -m pytest tests/注意
如果显示消息指出找不到
coverage,请运行pip install coverage,然后重试。若要查看测试覆盖率结果,请运行以下命令:
coverage report -m如果四项测试全都通过,请运行以下命令,将
dbx项目的内容发送到你的 Azure Databricks 工作区:dbx deploy --environment=default有关项目及其运行的信息将发送到
workspace_directory文件中.dbx/project.json对象中指定的位置。项目的内容将发送到
artifact_location文件中.dbx/project.json对象中指定的位置。运行以下命令,在工作区中运行代码的预生产版本:
dbx launch covid_analysis_etl_integ指向运行结果的链接在终端中显示。 结果应如下所示:
https://<your-workspace-instance-id>/?o=1234567890123456#job/123456789012345/run/12345按照 Web 浏览器中的此链接查看工作区中的运行结果。
运行以下命令,在工作区中运行代码的生产版本:
dbx launch covid_analysis_etl_prod指向运行结果的链接在终端中显示。 结果应如下所示:
https://<your-workspace-instance-id>/?o=1234567890123456#job/123456789012345/run/23456按照 Web 浏览器中的此链接查看工作区中的运行结果。
使用 GitHub Actions 运行
在项目的 .github/workflows 文件夹中,onpush.yml 和 onrelease.yml GitHub Actions 文件执行以下操作:
- 在每次推送到以
v开头的标记时,请使用dbx来部署covid_analysis_etl_prod作业。 - 在每次推送到不以
v开头的标记时:- 使用
pytest运行单元测试 - 使用
dbx将covid_analysis_etl_integ作业中指定的文件部署到远程工作区。 - 使用
dbx启动远程工作区上covid_analysis_etl_integ作业中指定的已部署文件,跟踪此运行,直到它完成。
- 使用
注意
还提供了一个额外的 databricks_pull_request_tests.yml GitHub Actions 文件,供你作为模板进行试验,而不会影响 onpush.yml 和 onrelease.yml GitHub Actions 文件。 无需 databricks_pull_request_tests.yml GitHub Actions 文件即可运行此代码示例。 本文未介绍其用法
以下子节介绍如何设置和运行 onpush.yml 和 onrelease.yml GitHub Actions 文件。
设置以使用 GitHub Actions
按照 CI/CD 服务主体中的说明设置 Azure Databricks 工作区。 此过程包括以下操作:
创建服务主体。
为服务主体创建 Microsoft Entra ID 令牌。
Databricks 建议为服务主体使用 Microsoft Entra ID 令牌,而不是工作区用户的 Databricks 个人访问令牌,以便 GitHub 向 Azure Databricks 工作区进行身份验证,这是安全最佳做法。
创建服务主体及其 Microsoft Entra ID 令牌后,请停下来并将 Microsoft Entra ID 令牌值记下,因为你将在下一部分中使用它。
运行 GitHub Actions
步骤 1:发布克隆的存储库
在 Visual Studio Code 的边栏中,单击“GitHub”图标。 如果该图标不可见,请先通过“扩展”视图(“视图”“扩展”)启用“GitHub 拉取请求和问题”扩展。>
如果“登录”按钮可见,请单击该按钮,然后按照屏幕上的说明登录到 GitHub 帐户。
在菜单栏上,单击视图>命令面板,键入
Publish to GitHub,然后单击发布到 GitHub。选择将克隆的存储库发布到 GitHub 帐户的选项。
步骤 2:将加密机密添加到存储库
在已发布的存储库的 GitHub 网站中,请按照为存储库创建加密机密中的说明操作,创建以下加密机密:
- 创建一个名为
DATABRICKS_HOST的加密机密,设置为每个工作区 URL 的值,例如https://adb-1234567890123456.7.databricks.azure.cn。 - 创建一个名为
DATABRICKS_TOKEN的加密机密,设置为服务主体的 Microsoft Entra ID 令牌的值。
步骤 3:创建分支并将其发布到存储库
在 Visual Studio Code 的“源代码管理”视图()中,单击> (视图和更多操作)图标。
单击“分支”>“创建分支”。
输入分支的名称,例如
my-branch。选择要从中创建分支的分支,例如 main。
对本地存储库中的其中一个文件进行轻微更改,然后保存该文件。 例如,对
tests/transforms_test.py文件中的代码注释进行轻微更改。在“源代码管理”视图中,再次单击... (视图和更多操作)图标。
单击“更改”>“暂存所有更改”。
再次单击... (视图和更多操作)图标。
单击“提交”>“提交暂存”。
为提交输入消息。
再次单击... (视图和更多操作)图标。
单击“分支”>“发布分支”。
步骤 4:创建拉取请求和合并
转到已发布的存储库
https://github/<your-GitHub-username>/ide-best-practices的 GitHub 网站。在“拉取请求”选项卡上,单击“my-branch 有最近的推送”旁边的“比较和拉取请求”。
单击“创建拉取请求”。
在“拉取请求”页上,等待“CI 管道/ci-pipeline (推送)”旁边的图标显示绿色复选标记。 (图标可能需要几秒到几分钟的时间才能显示。如果出现红色 X 而不是绿色复选标记,请单击“详细信息”以找出原因。) 如果图标或“详细信息”不再显示,请单击“显示所有检查”。
如果出现绿色复选标记,请单击“合并拉取请求”将拉取请求合并到
main分支中。