我正在用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.hadoopFile
和sc.wholeTextFiles
和wholeTextFiles是最快的,我認爲這是因爲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?