簡體   English   中英

在 Databricks 筆記本中管理 Scala 依賴項

[英]Managing Scala dependencies in Databricks notebooks

我是一個大型 Scala 項目的新開發人員,其中所有代碼都存儲為筆記本並在 Databricks 集群中運行...

每個筆記本都定義了類和方法,我們有“主”筆記本,它們的代碼行很少,但在%run ./myPackage/Foo等單元格中執行所有需要的 Scala 筆記本(即幾乎所有本項目中的筆記本)。 然后這些“主要”筆記本有一個像這樣的小 Scala 代碼單元:

import com.bar.foo.Main
Main.main()

此外,每個筆記本都導入它需要的包,如 Scala 指令import com.bar.foo.MyClass

我覺得這真的很煩人:

  • 如果我移動一個筆記本,我必須更新所有主要筆記本/測試筆記本中的所有%run path/Notebook命令
  • 我覺得在主筆記本中運行筆記本在所有其他筆記本中導入包是多余的。

你知道另一個工作流程嗎? 是否有更簡單的方法來處理 Databricks 中的多個 Scala 筆記本?

我認為當用戶和公司將筆記本視為軟件工程原則的替代品時,就會出現這些問題。 軟件世界為了解決這些問題創建並廣泛使用了 設計模式,這些 設計模式很難(如果不是不可能的話)在筆記本中應用。 因此,我認為用戶不應該將筆記本作為開發最終用戶解決方案的工具。 筆記本的主要作用曾經是原型設計ML 測試,因此根據定義,它們不適合模塊化和可擴展性是重要因素的情況。

至於你的情況,並假設筆記本的使用是不可避免的,我建議盡量減少筆記本的使用,並開始將你的代碼組織到 JAR 庫中。 如果筆記本在它們之間共享重要的代碼部分,這將很有用。

例如,讓我們考慮筆記本N1N2都使用筆記本N3N4 然后,您可以將N3N4的實現放入 JAR 中,我們將其common_lib.jar ,然后通過將common_lib.jar附加到它們運行的​​集群(假設您運行筆記本作業),使它們對N1N2可用. 通過遵循這種方法,您可以實現:

  • 更好的模塊化,因為您將筆記本的功能完全分開。 此外,對於每個作業/筆記本,您可以將確切的依賴關系附加到集群,避免由於難以將筆記本應用程序分離為模塊而出現的冗余依賴關系。

  • 更易於維護的代碼。 最終,每個模塊都應該有一個最終筆記本來導入依賴項,就像在通用 Scala 應用程序中所做的那樣,避免調用多個筆記本所需的復雜層次結構。

  • 更具可擴展性的代碼。 筆記本提供了一個糟糕的界面dbutils.widget.text(...)dbutils.widget.get(...)絕對比你可以用 scala/java 實現的要少得多。

  • 更多可測試的代碼。 您現在應該知道,使用筆記本很難實現正確的單元或集成測試。 通過將主要實現放入 jar 中,您可以像處理任何 scala/java 應用程序一樣執行單元測試。

更新

針對您的情況(不可能重構為 JAR 庫)的一種解決方案是將筆記本組織成模塊,其中每個模塊都將使用一個_includes_文件負責模塊的所有依賴項。 _includes_文件可能看起來像下一個片段:

%run "myproject/lib/notebook_1"
%run "myproject/lib/notebook_3"

...

現在讓我們假設筆記本 X1 和 X2 它們共享相同的依賴項myproject/lib/notebook_1myproject/lib/notebook_3為了使用提到的依賴項,您應該將_includes_文件放在同一文件夾下並執行:

%run "_includes_"

在 X1 和/或 X2 筆記本的第一個單元格中。 通過這種方式,您可以使用一種通用方法來包含項目的所有依賴項,並且可以避免需要重復復制/粘貼所有包含項的情況。

盡管這可能是一項重大改進,但這並沒有提供一種自動方式來檢查和包含項目中依賴項的正確路徑。 順便說一下,我不知道這樣一種自動化的方式來瀏覽文件和動態更改導入。 一種方法是編寫外部自定義腳本。 盡管此腳本不應通過您的作業調用。

注意:你必須確保依賴的層次結構是明確定義的,並且你沒有任何循環依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM