2015-05-11 167 views
4

現在我正在學習如何使用spark.I有一段代碼可以將一個矩陣反轉,並且當矩陣的順序像100這樣小時它就能工作。但是當矩陣的順序是大如2000我有一個這樣的例外:Spark:java.io.IOException:設備上沒有剩餘空間

15/05/10 20:31:00 ERROR DiskBlockObjectWriter: Uncaught exception while reverting partial writes to file /tmp/spark-local-20150510200122-effa/28/temp_shuffle_6ba230c3-afed-489b-87aa-91c046cadb22 

java.io.IOException: No space left on device 

在我的節目,我有很多行這樣的:

val result1=matrix.map(...).reduce(...) 
val result2=result1.map(...).reduce(...) 
val result3=matrix.map(...) 

(很抱歉,因爲代碼是要寫很多的)

所以我認爲當我這樣做的時候Spark創建了一些新的rdds,並且在我的程序中Spark創建了太多的rdds,所以我有例外。我不確定我認爲是否正確。

如何刪除不再使用的rdds?像result1和result2?

我試過rdd.unpersist(),它不起作用。

非常感謝。

+0

我可能是錯的,但通常火花會將所有內容都保存在內存中,如果它填滿了您的硬盤驅動器,可能您沒有給他足夠的內存來開始。無論如何,你不能刪除你認爲你不再使用的RDD。 –

+0

你不應該刪除它們。 Result_i只保留計算result_ {i + 1}所需的時間(它仍然可以存儲但可以被覆蓋)。有可能你不能從你的一個計算中存儲臨時文件。 – abalcerek

+0

但我不是爲什麼我有IOException表示沒有空間留在設備上... –

回答

2

根據您提供的Error message,您的情況是硬盤上沒有剩餘磁盤空間。但是,這不是由RDD持續性造成的,而是調用reduce時隱含需要的隨機播放。

因此,你應該清楚你的驅動器,使更多的空間爲您的TMP文件夾

7

這是因爲星火創建你的/ tmp目錄下的一些臨時文件洗牌當地system.You可以通過設置下面的屬性來避免此問題在你的spark conf文件中。

在spark-evn.sh中設置此屬性。

SPARK_JAVA_OPTS+=" -Dspark.local.dir=/mnt/spark,/mnt2/spark -Dhadoop.tmp.dir=/mnt/ephemeral-hdfs" 

export SPARK_JAVA_OPTS 
+0

此設置如何避免臨時文件磁盤空間問題? –

相關問題