試想一下,我們有3個客戶,我們希望做並行他們每個人的一些同樣的工作。運行過程中出現一些火花作業同時從驅動
def doSparkJob(customerId: String) = {
spark
.read.json(s"$customerId/file.json")
.map(...)
.reduceByKey(...)
.write
.partitionBy("id")
.parquet("output/")
}
我們這樣做同時像這樣(從火花司機):
val jobs: Future[(Unit, Unit, Unit)] = for {
f1 <- Future { doSparkJob("customer1") }
f2 <- Future { doSparkJob("customer1") }
f3 <- Future { doSparkJob("customer1") }
} yield (f1, f2, f3)
Await.ready(jobs, 5.hours)
難道我理解正確的話,這是不好的做法?許多火花的工作將從執行者中推出彼此的背景,並且會出現許多向光盤泄漏的數據。如何處理來自並行作業的執行任務的火花?當一個驅動程序有3個併發作業,並且只有3個具有一個內核的執行程序時,如何出現混洗。
我想,最好的方法應該是這樣的: 我們一起讀取所有客戶的所有數據groupByKey by customer,並做我們想做的事情。