2017-10-21 194 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任务。 这是一个自下而上的方法/懒惰的评估。

相关问题