什么是好的 Databricks 工作流程
What is a good Databricks workflow
我使用 Azure Databricks 进行数据处理,使用笔记本和管道。
我对目前的工作流程不满意:
- 在不破坏生产的情况下,无法修改生产中使用的笔记本。当我想开发更新时,我会复制笔记本,更改源代码直到我满意为止,然后用我的新笔记本替换生产笔记本。
- 我的浏览器不是IDE!我不能轻易地转到函数定义。我有很多笔记本,如果我想修改甚至只是看一个函数的文档,我需要切换到定义这个函数的笔记本。
- 有没有办法进行高效系统的测试?
- Git集成很简单,但这不是我主要关心的。
好问题。绝对不要修改您的生产代码。
一种推荐的模式是在您的工作区中为开发-暂存-生产保留单独的文件夹。做你的开发工作,然后 运行 在最终推广到生产之前在暂存中进行测试。
您可以使用 Databricks CLI 将笔记本从一个文件夹拉出和推送到另一个文件夹,而不会破坏现有代码。更进一步,您可以将此模式与 git 合并以与版本控制同步。在任何一种情况下,CLI 都可以让您以编程方式访问工作区,这应该可以更轻松地更新生产作业的代码。
关于您关于 IDEs 的第二点 - Databricks 提供 Databricks Connect,让您可以在集群上使用 IDE 而 运行ning 命令。根据您的痛点,我认为这对您来说是一个很好的解决方案,因为它会让您更清楚地了解您定义的功能等。您也可以用这种方式编写 运行 单元测试。
准备好脚本后,您可以随时将它们作为笔记本导入工作区,然后 运行 作为作业导入。还知道您可以 运行 .py 脚本作为使用 REST API.
的作业
我个人比较喜欢打包我的代码,将*.whl包复制到DBFS,我可以在DBFS安装测试包并导入。
编辑: 更明确。
The notebook used in production can't be modified without breaking the production. When I want to develop an update, I duplicate the notebook, change the source code until I'm satisfied, then I replace the production notebook with my new notebook.
这可以通过拥有单独的环境来解决DEV/TST/PRD。或者拥有可以单独修改的版本化包。稍后我会澄清。
My browser is not an IDE! I can't easily go to a function definition. I have lots of notebooks, if I want to modify or even just see the documentation of a function, I need to switch to the notebook where this function is defined.
Is there a way to do efficient and systematic testing ?
是的,使用我提到的版本控制包方法与 databricks-connect 结合使用,您完全可以使用 IDE、实施测试、进行适当的 git 集成。
Git integration is very simple, but this is not my main concern.
在更大的团队中工作时,内置 git 集成实际上非常差。你不能同时在同一个笔记本上开发,因为与你的同事共享的变化是平坦的和线性的。除此之外,你必须 link 和 unlink 容易出现人为错误的存储库,导致你的笔记本在错误的文件夹中同步,导致 运行s 中断,因为笔记本不能'不能进口。我建议你也使用我的打包解决方案。
打包解决方案的工作原理如下Reference:
- 列表项
- 在您的桌面上,安装 pyspark
- 下载一些匿名数据以供使用
- 使用少量数据开发代码,编写单元测试
- 准备好测试大数据时,卸载 pyspark,安装 databricks-connect
- 当性能和集成足够时,将代码推送到您的远程仓库
- 创建 运行 自动化测试的构建管道,并构建版本控制包
- 创建将版本控制包复制到 DBFS 的发布管道
- 在 "runner notebook" 中接受 "process_date" 和 "data folder/filepath" 作为参数,并从你的版本包中导入模块
- 将参数传递给您的模块 运行 您测试的代码
我们的做法 -
-将开发笔记本与 Azure DevOps 集成。
-为笔记本、作业、包和集群部署创建自定义构建和部署任务。使用 DatabBricks RestAPI
很容易做到这一点
https://docs.databricks.com/dev-tools/api/latest/index.html
为测试、暂存和生产部署创建发布管道。
-部署测试和测试。
-部署在暂存和测试上。
- 生产部署
希望这对您有所帮助。
我使用 Azure Databricks 进行数据处理,使用笔记本和管道。
我对目前的工作流程不满意:
- 在不破坏生产的情况下,无法修改生产中使用的笔记本。当我想开发更新时,我会复制笔记本,更改源代码直到我满意为止,然后用我的新笔记本替换生产笔记本。
- 我的浏览器不是IDE!我不能轻易地转到函数定义。我有很多笔记本,如果我想修改甚至只是看一个函数的文档,我需要切换到定义这个函数的笔记本。
- 有没有办法进行高效系统的测试?
- Git集成很简单,但这不是我主要关心的。
好问题。绝对不要修改您的生产代码。
一种推荐的模式是在您的工作区中为开发-暂存-生产保留单独的文件夹。做你的开发工作,然后 运行 在最终推广到生产之前在暂存中进行测试。
您可以使用 Databricks CLI 将笔记本从一个文件夹拉出和推送到另一个文件夹,而不会破坏现有代码。更进一步,您可以将此模式与 git 合并以与版本控制同步。在任何一种情况下,CLI 都可以让您以编程方式访问工作区,这应该可以更轻松地更新生产作业的代码。
关于您关于 IDEs 的第二点 - Databricks 提供 Databricks Connect,让您可以在集群上使用 IDE 而 运行ning 命令。根据您的痛点,我认为这对您来说是一个很好的解决方案,因为它会让您更清楚地了解您定义的功能等。您也可以用这种方式编写 运行 单元测试。
准备好脚本后,您可以随时将它们作为笔记本导入工作区,然后 运行 作为作业导入。还知道您可以 运行 .py 脚本作为使用 REST API.
的作业我个人比较喜欢打包我的代码,将*.whl包复制到DBFS,我可以在DBFS安装测试包并导入。
编辑: 更明确。
The notebook used in production can't be modified without breaking the production. When I want to develop an update, I duplicate the notebook, change the source code until I'm satisfied, then I replace the production notebook with my new notebook.
这可以通过拥有单独的环境来解决DEV/TST/PRD。或者拥有可以单独修改的版本化包。稍后我会澄清。
My browser is not an IDE! I can't easily go to a function definition. I have lots of notebooks, if I want to modify or even just see the documentation of a function, I need to switch to the notebook where this function is defined. Is there a way to do efficient and systematic testing ?
是的,使用我提到的版本控制包方法与 databricks-connect 结合使用,您完全可以使用 IDE、实施测试、进行适当的 git 集成。
Git integration is very simple, but this is not my main concern.
在更大的团队中工作时,内置 git 集成实际上非常差。你不能同时在同一个笔记本上开发,因为与你的同事共享的变化是平坦的和线性的。除此之外,你必须 link 和 unlink 容易出现人为错误的存储库,导致你的笔记本在错误的文件夹中同步,导致 运行s 中断,因为笔记本不能'不能进口。我建议你也使用我的打包解决方案。
打包解决方案的工作原理如下Reference:
- 列表项
- 在您的桌面上,安装 pyspark
- 下载一些匿名数据以供使用
- 使用少量数据开发代码,编写单元测试
- 准备好测试大数据时,卸载 pyspark,安装 databricks-connect
- 当性能和集成足够时,将代码推送到您的远程仓库
- 创建 运行 自动化测试的构建管道,并构建版本控制包
- 创建将版本控制包复制到 DBFS 的发布管道
- 在 "runner notebook" 中接受 "process_date" 和 "data folder/filepath" 作为参数,并从你的版本包中导入模块
- 将参数传递给您的模块 运行 您测试的代码
我们的做法 -
-将开发笔记本与 Azure DevOps 集成。
-为笔记本、作业、包和集群部署创建自定义构建和部署任务。使用 DatabBricks RestAPI
很容易做到这一点https://docs.databricks.com/dev-tools/api/latest/index.html
为测试、暂存和生产部署创建发布管道。 -部署测试和测试。 -部署在暂存和测试上。 - 生产部署
希望这对您有所帮助。