這個錯誤表明滿工人的本地磁盤。
的錯誤
工人的本地磁盤使用火花為以下:
你可以檢查你的之前和之後的本地磁盤空間調整如下(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;
這個錯誤表明滿工人的本地磁盤。
的錯誤
工人的本地磁盤使用火花為以下:
你可以檢查你的之前和之後的本地磁盤空間調整如下(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;