取消
顯示的結果
而不是尋找
你的意思是:

如何避免“設備上沒有剩餘空間”的錯誤我的磁盤的空間在哪裏?

cfregly
貢獻者
1接受解決方案

接受的解決方案

cfregly
貢獻者

這個錯誤表明滿工人的本地磁盤。

的錯誤

工人的本地磁盤使用火花為以下:

  • 中間洗牌文件
    • 包含抽樣的父母依賴數據(血統)
  • 抽樣的持久性
    • StorageLevel.MEMORY_AND_DISK
    • StorageLevel.DISK_ONLY

你可以檢查你的之前和之後的本地磁盤空間調整如下(Scala):

進口scala.sys.process。_ val perNodeSpaceInGB = sc.parallelize (0 - 100)。地圖{_ = > val主機名=(“主機名”。! !)。修剪val spaceInGB = (“df / local_disk”。! !)。分割(“+”)(9)。來Int / 1024 / 1024 //System.gc() (hostname, spaceInGB) }.collect.distinct println(f"There are ${perNodeSpaceInGB.size} nodes in this cluster. Per node free space (in GB):\n--------------------------------------") perNodeSpaceInGB.foreach{case (a, b) => println(f"$a\t\t$b%2.2f")} val totalSpaceInGB = perNodeSpaceInGB.map(_._2).sum println(f"---------------------------

錯誤的原因

中間洗牌文件包含抽樣的父母依賴數據(血統)掛在工人中抽樣需要從其父母中恢複過來。

如果中間洗牌文件不刪除速度不夠快,他們可以導致“設備上沒有剩餘空間”的錯誤發生在一個工人。

這裏有一個例子,可能導致中間洗牌文件未清理(Python):

#定義一個抽樣產生一些打亂myRdd = sc.textFile (…) .groupByKey (…) . map (…) myRdd.count ()

這是運行時,當地的

myRdd
變量將防止刪除中間洗牌文件的工人。

另一個更為微妙,懸空抽樣引用的例子是:考慮一個筆記本和單個細胞

unpersist
電話:

myRdd.unpersist ()

RDD.unpersist ()
返回一個引用unpersisted抽樣。最後一個值在一個筆記本電池是一個自動分配
出[someNumber]
變量在Python解釋器。

這種微妙的變量可以保持抽樣活著,防止中間洗牌文件的刪除。這個問題不具體

unpersist ()
:我認為,任何情況下,你有一個抽樣作為最後一個元素的筆記本電池可能導致抽樣的引用,防止中間洗牌文件的刪除。

可能有一個清除的方法

變量來迫使他們被清理幹淨,但是我不確定的。

考慮使用功能限製抽樣的範圍引用。

解決方案1:顯式地刪除中間洗牌文件

這對工人中間洗牌文件從磁盤刪除當抽樣是免費,超出範圍。

RDD.unpersist ()
是一種隨機數字撥號改為出去的範圍。同時,可以顯式地重新分配抽樣變量
沒有一個
當你完成使用它們。

這些機製將國旗中間洗牌文件刪除。(注意:這可能不是理想的如果你需要保持抽樣在後來處理。)

在GC,火花ContextCleaner將刪除標記的中間洗牌文件對所有工人導致抽樣的血統,是免費的。

換句話說,一個GC -通常用來釋放內存也被火花用來釋放中間洗牌文件通過ContextCleaner工人。

如果GC中間洗牌文件所需的清潔過程不夠快,你可以顯式調用

system . gc ()
在Scala中或
sc._jvm.System.gc ()
在Python中JVM推入一個GC並最終刪除中間洗牌文件。從理論上講,雖然這並不保證GC,在這種情況下它被證明有效的用戶。

方法2:使用更多的工人

假設均勻分布的分區,添加更多的工人將-平均減少所需的磁盤空間中間洗牌文件在每個工人。

解決方案3:檢查點抽樣

另一個解決方案,使用火花特別是流媒體,是定期的電話

RDD.checkpoint ()
。這保存當前不可變的狀態的隨機數字撥號改為S3,剪抽樣血統,允許中間洗牌文件被刪除。

這需要一個之前調用

sc.setCheckpointDir ()
與類似的
/檢查站
。這將節省檢查點數據DBFS / S3在那個位置。

這是兩全其美:抽樣仍可恢複的,但是中間洗牌文件可以從工人中刪除。

解決方法4:[火花SQL隻有)增加調整分區

如果你看到這個火花SQL HiveQL命令,你可以嚐試增加火花SQL調整分區的數量如下:

設置spark.sql.shuffle.partitions = 400;

在原帖子查看解決方案

9回複9

cfregly
貢獻者

這個錯誤表明滿工人的本地磁盤。

的錯誤

工人的本地磁盤使用火花為以下:

  • 中間洗牌文件
    • 包含抽樣的父母依賴數據(血統)
  • 抽樣的持久性
    • StorageLevel.MEMORY_AND_DISK
    • StorageLevel.DISK_ONLY

你可以檢查你的之前和之後的本地磁盤空間調整如下(Scala):

進口scala.sys.process。_ val perNodeSpaceInGB = sc.parallelize (0 - 100)。地圖{_ = > val主機名=(“主機名”。! !)。修剪val spaceInGB = (“df / local_disk”。! !)。分割(“+”)(9)。來Int / 1024 / 1024 //System.gc() (hostname, spaceInGB) }.collect.distinct println(f"There are ${perNodeSpaceInGB.size} nodes in this cluster. Per node free space (in GB):\n--------------------------------------") perNodeSpaceInGB.foreach{case (a, b) => println(f"$a\t\t$b%2.2f")} val totalSpaceInGB = perNodeSpaceInGB.map(_._2).sum println(f"---------------------------

錯誤的原因

中間洗牌文件包含抽樣的父母依賴數據(血統)掛在工人中抽樣需要從其父母中恢複過來。

如果中間洗牌文件不刪除速度不夠快,他們可以導致“設備上沒有剩餘空間”的錯誤發生在一個工人。

這裏有一個例子,可能導致中間洗牌文件未清理(Python):

#定義一個抽樣產生一些打亂myRdd = sc.textFile (…) .groupByKey (…) . map (…) myRdd.count ()

這是運行時,當地的

myRdd
變量將防止刪除中間洗牌文件的工人。

另一個更為微妙,懸空抽樣引用的例子是:考慮一個筆記本和單個細胞

unpersist
電話:

myRdd.unpersist ()

RDD.unpersist ()
返回一個引用unpersisted抽樣。最後一個值在一個筆記本電池是一個自動分配
出[someNumber]
變量在Python解釋器。

這種微妙的變量可以保持抽樣活著,防止中間洗牌文件的刪除。這個問題不具體

unpersist ()
:我認為,任何情況下,你有一個抽樣作為最後一個元素的筆記本電池可能導致抽樣的引用,防止中間洗牌文件的刪除。

可能有一個清除的方法

變量來迫使他們被清理幹淨,但是我不確定的。

考慮使用功能限製抽樣的範圍引用。

解決方案1:顯式地刪除中間洗牌文件

這對工人中間洗牌文件從磁盤刪除當抽樣是免費,超出範圍。

RDD.unpersist ()
是一種隨機數字撥號改為出去的範圍。同時,可以顯式地重新分配抽樣變量
沒有一個
當你完成使用它們。

這些機製將國旗中間洗牌文件刪除。(注意:這可能不是理想的如果你需要保持抽樣在後來處理。)

在GC,火花ContextCleaner將刪除標記的中間洗牌文件對所有工人導致抽樣的血統,是免費的。

換句話說,一個GC -通常用來釋放內存也被火花用來釋放中間洗牌文件通過ContextCleaner工人。

如果GC中間洗牌文件所需的清潔過程不夠快,你可以顯式調用

system . gc ()
在Scala中或
sc._jvm.System.gc ()
在Python中JVM推入一個GC並最終刪除中間洗牌文件。從理論上講,雖然這並不保證GC,在這種情況下它被證明有效的用戶。

方法2:使用更多的工人

假設均勻分布的分區,添加更多的工人將-平均減少所需的磁盤空間中間洗牌文件在每個工人。

解決方案3:檢查點抽樣

另一個解決方案,使用火花特別是流媒體,是定期的電話

RDD.checkpoint ()
。這保存當前不可變的狀態的隨機數字撥號改為S3,剪抽樣血統,允許中間洗牌文件被刪除。

這需要一個之前調用

sc.setCheckpointDir ()
與類似的
/檢查站
。這將節省檢查點數據DBFS / S3在那個位置。

這是兩全其美:抽樣仍可恢複的,但是中間洗牌文件可以從工人中刪除。

解決方法4:[火花SQL隻有)增加調整分區

如果你看到這個火花SQL HiveQL命令,你可以嚐試增加火花SQL調整分區的數量如下:

設置spark.sql.shuffle.partitions = 400;

Wanglei
新的貢獻者二世

它是有幫助的。所以你的意思是在Python的建議方法是以下嗎?

t = myRdd.unpersist ()

t =沒有

除此之外,你能告訴我任何關於Python的doc變量,我新在Python中,沒有發現。

任何建議使用火花SQL時如何解決這個問題?

我們已經設置spark.sql.shuffle.partitions = XXX;兩種不同的價值觀但它仍然失敗。同時,集群大小/工人數量應該綽綽有餘

可以在集群enable_elastic_disc設置(https://docs.azuredatabricks.net/api/latest/clusters.html)幫助嗎

問候,

格哈德

Capemo
新的貢獻者二世

更新這條線嗎

val spaceInGB = (“df / local_disk”。! !)。分割(“+”)(9)。來Int / 1024 / 1024

val spaceInGB = (“df / local_disk0”。! !)。分割(“+”)(9)。來Int / 1024 / 1024

7.3在磚。

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map