[英]Spark Repartition Executors
我有一個大約 100GB 的數據源,我正在嘗試使用日期列對其進行分區。
為了避免分區內出現小塊,我添加了一個 repartition(5) 以使每個分區內最多有 5 個文件:
df.repartition(5).write.orc("path")
我的問題是,我分配的 30 個執行程序中只有 5 個實際運行。 最后我得到了我想要的(每個分區內有 5 個文件),但是由於只有 5 個執行程序在運行,因此執行時間非常長。
你對我如何讓它更快有什么建議嗎?
我簡單地修復了它:
df.repartition($"dateColumn").write.partitionBy("dateColumn").orc(path)
並分配與我將在 output 中擁有的分區數量相同數量的執行程序。
謝謝大家
您可以使用 repartition 和 partitionBy 來解決問題。 有兩種方法可以解決這個問題。
假設您需要按 dateColumn 進行分區
df.repartition(5, 'dateColumn').write.partitionBy('dateColumn').parquet(path)
在這種情況下,使用的執行程序的數量將等於5 * distinct(dateColumn)
並且您的所有日期都將包含 5 個文件。
另一種方法是將數據重新分區 3 次,然后使用maxRecordsPerFile
保存數據,這將創建相同大小的文件,但您將無法控制創建的文件數量
df.repartition(60).write.option('maxRecordsPerFile',200000).partitionBy('dateColumn').parquet(path)
Spark 可以為 RDD 或數據幀的每個分區運行 1 個並發任務(最多為集群中的核心數)。 如果您的集群有 30 個核心,那么您應該至少有 30 個分區。 另一方面,單個分區通常不應包含超過 128MB,單個 shuffle 塊不能大於 2GB(請參閱 SPARK-6235)。 由於您想減少執行時間,最好增加分區數,並在作業結束時減少特定作業的分區數。 為了更好地(平等地)在分區之間分配數據,最好使用 hash 分區程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.