2017-10-21 182 views
1

我正在用spark.wholeTextFiles()處理一個400MB的文件,並且我一直收到內存不足錯誤。我第一次使用這個API的文件夾總共有40MB,我想知道我的代碼是否適用於大文件,這是大文件的來源。Spark wholeTextFiles():java.lang.OutOfMemoryError:Java堆空間

這是配置,我想我提供了足夠的RAM堆,但仍然沒有運氣,我只是閱讀的文件夾,然後寫下來與

files.saveAsTextFile("data/output/no") 

和命令是

spark-submit --driver-memory 4G --driver-java-options -Xms4096m --executor-memory 4G target/scala-2.11/mz_2.11-1.0.jar

我比較了spark sql,sc.hadoopFilesc.wholeTextFileswholeTextFiles是最快的,我認爲這是因爲wholeTextFiles試圖將整個文件夾加載到一個節點的內存中,主人我猜,一切都發生在RAM上,所以速度很快。

HadoopFile()按分區加載,即使文件很小,讀取操作很昂貴,文件編號也將與文件編號一樣多。

火花SQL將加載文件夾的分區,分區的大小可以與

spark.conf.set("spark.sql.files.maxPartitionBytes", 32000000) 

中定義,但如果文件是小的,它需要時間來將文件充電到每個分區。

Q1. why do I keep getting out of memory error?

Q2. when spark load folder/big file by partition and return RDD, how many partition has been read into the RAM? maybe non, and spark wait for an action to load as many partitions as the number of executor(or cores?) each time to treat? in that case, maybe we should load big partition like 64MB or 128MB instead of small partition like 32kb?

回答

0

你可以請整個代碼?

wholeTextFile()時將需要的文件路徑fileContent被使用。 類似於key - > filePath(C:\\ fileName)和value - > actual fileContent。

使用wholeTextFile()時的分區數取決於您擁有多少個executor核心。 這裏分區的數量將是1或更多。

除非一個動作被調用,否則不會觸發spark任務。 這是一個自下而上的方法/懶惰的評估。

相關問題