我們在多個開發人員使用以下配置將 jar 上傳到 Databricks 集群的環境中作業:
DBR: 7.3 LTS
Operating System: Ubuntu 18.04.5 LTS
Java: Zulu 8.48.0.53-CA-linux64 (build 1.8.0_265-b11)
Scala: 2.12.10
Python: 3.7.5
R: R version 3.6.3 (2020-02-29)
Delta Lake: 0.7.0
Build tool: Maven
以下是我們典型的作業流程:
第 0 步:
DemoSparkProject-1.0-SNAPSHOT.jar使用以下物件構建 jar ( ) 的版本 1 :
object EntryObjectOne {
def main(args:Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("BatchApp")
.master("local[*]")
.getOrCreate()
import spark.implicits._
println("EntryObjectOne: This object is from 1.0 SNAPSHOT JAR")
val df: DataFrame = Seq(
(1,"A","2021-01-01"),
(2,"B","2021-02-01"),
(3,"C","2021-02-01")
).toDF("id","value", "date")
df.show(false)
}
}
第1步:
從集群中卸載舊的 jar(s),并在后續版本中不斷推送新的變化,對邏輯進行小幅改動。因此,我們推送版本為 2.0-SNAPSHOT、3.0-SNAPSHOT 等的 jar。
在某個時間點,當我們在 jar 中使用以下代碼推送同一個物件時說 ( DemoSparkProject-4.0-SNAPSHOT.jar):
object EntryObjectOne {
def main(args:Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("BatchApp")
.master("local[*]")
.getOrCreate()
import spark.implicits._
println("EntryObjectOne: This object is from 4.0 SNAPSHOT JAR")
val df: DataFrame = Seq(
(1,"A","2021-01-01"),
(2,"B","2021-02-01"),
(3,"C","2021-02-01")
).toDF("id","value", "date")
df.show(false)
}
}
當我們在 notebook 中匯入這個物件并運行 main 函式時,我們仍然得到舊快照版本的 jarprintln陳述句 ( EntryObjectOne: This object is from 1.0 SNAPSHOT JAR)。這迫使我們dbfs:/FileStore/jars/*在集群上運行洗掉并重新啟動集群并再次推送最新快照以使其作業。
本質上,當我sc.listJars()在驅動程式中運行活動 jar 時,是最新的 4.0-SNAPSHOT jar。然而,即使它們沒有在運行時安裝在集群上,我仍然可以看到舊快照 jar 的邏輯。
我們嘗試/實施的決議:
- 我們嘗試使用 maven shade 插件,但不幸的是,Scala 不支持它。(詳細資訊在這里)。
- 我們從
dbfs:/FileStore/jars/*集群中洗掉舊 jar并重新啟動集群并定期安裝新 jar。這有效,但更好的方法肯定會有所幫助。(詳細資訊在這里)。 - 手動更改類路徑并
groupId使用 maven構建不同的 jar也有幫助。但是由于許多物件和開發人員并行作業,因此很難跟蹤這些更改。
這是在 DataBricks 中使用多個 jar 版本的正確方法嗎?如果在 DataBricks 中有更好的方法來處理這個版本沖突問題,那將對我們有很大幫助。
uj5u.com熱心網友回復:
您不能使用打包為 Jar 的庫 - 當您安裝庫時,它會被放入類路徑中,并且只有在您重新啟動集群時才會被洗掉。檔案明確說明了這一點:
當您從集群中卸載庫時,只有在您重新啟動集群時才會洗掉庫。在您重新啟動集群之前,已卸載庫的狀態顯示為卸載掛起重新啟動。
這與“普通”Java 程式的問題相同,Java 只是不支持此功能。例如,請參閱此問題的答案。
對于 Python 和 R,它更容易,因為它們支持筆記本范圍的庫,其中不同的筆記本可以擁有同一庫的不同版本。
PS 如果您正在進行單元/集成測驗,我的建議是將測驗作為 Databricks 作業來執行 - 它會更便宜,并且不同版本之間不會發生沖突。
uj5u.com熱心網友回復:
除了檔案中提到的內容:使用筆記本時,您可以通過在筆記本單元中運行它來了解驅動程式中添加的內容:
%sh
ls /local_disk0/tmp/ | grep addedFile
這在 Azure Databricks 上對我有用,它會列出所有添加的 jars。也許用 init 腳本強制清理?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362483.html
