如何在Databricks中正确构建Spark代码



我在Azure Databricks中有一个相对较大的项目,很快就会投入生产。代码目前被组织在存储库中的几个文件夹中,任务是使用ADF和作业集群一个接一个地执行笔记本来触发的。笔记本电脑有一些硬编码的值,如输入路径、输出路径等。

我认为这不是最好的方法。

我想去掉硬编码的值,并依赖于一些环境变量/环境文件/环境类或类似的东西。

我正在考虑创建一些类,这些类将具有单独转换的方法和转换之外的保存操作。你能给我一些建议吗?如何在Databricks中从另一个scala脚本引用一个scal脚本?我应该创建一个JAR吗?

或者你能给我介绍一些文档/好的公共存储库吗?在那里我可以看到应该如何做?

很难写一本关于如何去刺激的易懂指南,但我希望早点知道一些事情。

投产时:

  1. 一旦有了一个良好的流,就尝试迁移到jar作业
    笔记本用于探索性任务,不建议用于长时间运行的作业
    您可以将params传递给main,读取环境变量或读取spark配置。如何传递配置取决于您
  2. 选择New Job Cluster,避免选择All Purpose Cluster
    在生产中,Databricks建议使用新的集群,以便每个任务都在完全隔离的环境中运行。New Job Cluster的定价不同。我想它最终会更便宜
  3. 以下是如何处理秘密

。。以及其他一些离题的想法:

  1. 我建议你看看CI\CD詹金斯的食谱
  2. 使用Databricks cli自动化部署

如果您使用笔记本来编写代码,那么最好将代码拆分为以下部分:

  1. 带有"库函数";("图书馆笔记本"(-仅定义将转换数据的函数。这些函数通常只是接收DataFrame+一些参数,执行转换并返回新的DataFrame。这些函数不应该读/写数据,或者至少不应该有硬编码的路径
  2. 作为作业入口点的笔记本(让我们称之为"main"(-它们可能会通过小部件接收一些参数,例如,您可以传递环境名称(prod/dev/stating(、文件路径等;主";笔记本可以包括";图书馆笔记本";使用具有相对路径的%run,如%run ./Library1%run folder/Libray2(请参阅文档(
  3. 用于测试的笔记本——它们还包括";图书馆笔记本";,但是添加调用函数&检查结果。通常,您需要有专门的库,如spark测试库(Scala&Python(、chispa(仅限Python(、spark快速测试(仅限Scala(等,以比较DataRrame、schema等的内容。(这里是使用不同库的示例(这些测试笔记本可以作为常规作业或从CI/CD管道触发。为此,您可以使用Databricks CLI或dbx工具(围绕Databrickss CLI的包装器(。我有一个带有笔记本电脑的CI/CD管道演示,尽管它是为Python准备的

对于笔记本电脑,建议使用Repos功能,该功能允许同时对多个笔记本电脑执行版本控制操作。

根据代码的大小和更改的频率,您还可以将其打包为一个库,该库将附加到集群中,并从";主要笔记本";。在这种情况下,测试库函数可能会更容易一些——您可以只使用标准工具,如Maven、SBT等。

附言:您也可以联系分配给您的客户的解决方案架构师(如果有(,并详细讨论该主题。

最新更新