2022年2月19日 星期六

Azure Databricks 新功能 Files in Repos:自訂Python library有新做法

前言

在之前Blog主寫的〈Azure Databricks的543〉裡,介紹了Blog主在Databricks上的小技巧及心得。剛好Databricks出了新功能,這次則打算談一談更進階一點,在多人小組共同使用Databricks,以及高度自動化的情境下,比較方便管理及使用自訂library的新方式。

背景

隨著一個小組使用同個平台寫處理,或著同個人寫了很多處理,多多少少都會出現有部分code其實是重複的現象。最好我們把這些重複的code拿出來放在同個地方,這樣的優點是:

  • 不必每次重寫/重copy那個重複的部分
  • 當發現更有效率的寫法,或著修bug時,可以只更新一個地方
上述的優點,只要是稍微有經驗的工程師應該都能同感才是,而在寫python的時候,實現這個做法的方式就是寫自己的library,不管是直接放資料夾與py檔,還是生成egg或whl檔。Databricks在安裝公開的library其實非常方便,不過以前在安裝自訂的library就顯得彆扭很多。好在Databricks在2021年10月公開Files in Repos,讓我們能直接import自訂的py檔。本文將會詳細談論舊的方法以及新的方法。

舊方法(手動生成並上傳whl檔)

以前,要在Databricks使用自訂library,最標準的官方做法是:

微軟官方文件的說明截圖

  1. 本地手動生成whl檔
  2. 手動在Databricks上傳whl檔
  3. 手動在Databricks安裝到特定的cluster上
  4. 在自動或手動執行的notebook內使用。
不了解上述方法的讀者,可以參考微軟官方文件的〈Workspace libraries - Azure Databricks | Microsoft Docs

目前Databricks的自訂library管理畫面
畫面上也有備註,只要runtime版本大於7.0就無法自動安裝在cluster上
Databricks的cluster安裝library畫面

如果今天情況是一人單獨使用databricks,也沒有自動運行的job,那這個方法還勉強可以。但今天是一個多人小組,有複數使用者,複數cluster分別執行不同項目的notebook,同時還有每天自動運行的job,而你身為管理者,可能會有幾個問題:

  • 我可能不希望全域性的安裝一個library到cluster裡。
    • 這會讓任何用這個cluster執行的job或者使用者,被迫在有安裝的環境下執行,儘管有時它(他/她)並不需要。
    • 我們希望給每個job或使用者的執行的環境,盡量保持乾淨。
  • 版本管理麻煩,無法受惠於git管理
    • 無法讓cluster自動指到最新版library
  • 必須terminate一次cluster才能重新安裝新library
    • 這有可能打斷自動運行的job,或者其他人正在手動執行notebook,就會導致處理失敗。
    • 當處理的規模越龐大,cluster越多,這個步驟就越繁瑣,而且每次更新library都要做一次
  • 無法隨意查看及更改目前被執行的自訂library的code
    • 必須去本地找code,修改完了再生成一次whl檔,再手動上傳databricks,才能在notebook裡面執行。

以前要改善上面的問題,可能需要直接用指令複製whl檔到FileStore裡,在每個處理一開始執行安裝FileStore裡的whl檔(不過Blog主沒實際試過),但仍無法解決所有問題,像是無法git管理。如果不考慮繁雜的手續,Blog主目前看過最接近完美的解法,也許是這位David Suarez寫的〈Install custom Python Libraries from private PyPI on Databricks〉。

新方法(直接用git管理在Reops的py檔)

而這邊要介紹的新方法,使用2021年10月Databricks釋出的新功能Files in Repos。以前Reops只能放Notebook不給放其他檔案,現在直接在Databricks的Repos放入py檔,並同時利用git做版本管理,最後直接在notebook加入放在Repos的自訂library的path,再import就能直接使用了。Library的更新比舊方法更自動,也不會需要做很繁瑣的手續,還能得利於git管理,一次解決上面描述的所有問題,算是目前Blog主認為兼顧效率的最佳解。

以下Blog主會簡單介紹,可以的話也建議參考:

1.在Admin Console啟用Files in Repos


你可能需要重新pull一次你放在repos的檔案,如果你以前就有設定連結的話

2.在Repos裡面創建資料夾,並Add Repo設定git


3.在Notebook裡面加入sys.path.append,就能直接import啦


不好意思這張圖碼的部分有點多,有點難看


延伸:Git管理&快速更新


實際應用上,配合Git管理,這個Files in Repos就能玩很多花招了,譬如像Blog主在第二步驟的Repos,就放了兩個資料夾,一個是prd一個是stg,分別指向master跟其他開發中的branch。

使用情境是其他的組員都用prd,裡面放的是穩定的code。Blog主則在stg的資料夾放上新的code,notebook上跑了都OK再Commit & Push,然後Merge到master,最後讓prd的內容Pull最新版下來就好了。中間不需要重啟任何cluster,也不需要手動安裝任何whl檔,下一次運行時就自動是最新版本的library了。

如果更嚴謹一點,想放自動化之類的東西,譬如像Blog主這邊用的是Azure Devops,也可以用pipeline,設定trigger,做自動化測試,但這個就超出本次要講的內容了。另外,在Blog主前面附上的Databricks官方介紹裡面,還有requirements.txt的相關應用,也值得參考。

總結

以上就是最近Blog主在摸索的Databricks新功能,算是一次達成了Blog主以前就想實現,比較方便的自訂library管理方式,同時也分享給中文圈有在用Databricks的讀者們。如果有任何意見也歡迎留言告訴Blog主。


沒有留言:

張貼留言