我正在嘗試了解火花磁區,并在博客中遇到了這段話
但是,您應該明白,您可以大幅降低資料處理的并行度——合并通常在轉換鏈中被進一步推高,并且可能導致處理的節點比您希望的要少。為避免這種情況,您可以傳遞 shuffle = true。這將添加一個 shuffle 步驟,但這也意味著重新洗牌的磁區將盡可能使用完整的集群資源。
我知道合并意味著獲取一些包含執行程式的最少資料的資料,并通過哈希磁區器將它們混洗到現有的執行程式。我無法理解作者在這一段中想說什么。有人可以向我解釋一下這一段所說的內容嗎?
uj5u.com熱心網友回復:
Coalesce由于Spark Catalyst有一些不那么明顯的效果。例如
假設您的并行度為 1000,但您最終只想寫入 10 個檔案。你可能認為你可以這樣做:
load().map(…).filter(…).coalesce(10).save()但是,Spark 會盡可能早地有效地將合并操作下推,因此這將執行為:
load().coalesce(10).map(…).filter(…).save()
您可以在此處詳細閱讀我參考的一篇優秀文章,我前段時間偶然發現了該文章:https : //medium.com/airbnb-engineering/on-spark-hive-and-small-files-an-in -depth-look-at-spark-partitioning-strategies-a9a364f908
總結:Catalyst 處理coalesce可以在管道早期減少并發。我認為這就是所指的內容,盡管當然每種情況都不同,并且由于適用于此類 Spark 操作的 200 個默認磁區,JOIN 和聚合通常不會受到此類影響。
uj5u.com熱心網友回復:
正如您在問題中所說,“合并意味著獲取一些包含執行程式的最少資料的資料,并通過哈希從業者將它們混洗到現有的執行程式”。這實際上意味著以下
- 磁區數量減少了
- repartition 和coalesce 之間的主要區別在于,在coalesce 中,跨磁區的資料移動比在repartition 中少,因此降低了shuffle 的級別,從而提高了效率。
- 添加屬性 shuffle=true 只是為了在節點之間均勻分布資料,這與使用 repartition() 相同。如果您覺得在執行合并后您的資料可能會在節點中傾斜,您可以使用 shuffle=true。
希望這能回答你的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311441.html
標籤:阿帕奇火花 火花 apache-spark-sql 记录 合并
