簡體   English   中英

Spark 重新分區執行器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM