繁体   English   中英

Spark配置因内存不足错误

[英]Spark configuration for Out of memory error

集群设置-

Driver has 28gb
Workers have 56gb each (8 workers)

配置-

spark.memory.offHeap.enabled true
spark.driver.memory 20g
spark.memory.offHeap.size 16gb
spark.executor.memory 40g

我的工作 -

//myFunc just takes a string s and does some transformations on it, they are very small strings, but there's about 10million to process.


//Out of memory failure
data.map(s => myFunc(s)).saveAsTextFile(outFile)

//works fine
data.map(s => myFunc(s))

另外,我从程序中解簇/删除了火花,它在具有56GB内存的单台服务器上完成了很好的工作(成功保存到文件中)。 这表明这只是一个火花配置问题。 我查看了https://spark.apache.org/docs/latest/configuration.html#memory-management ,目前看来,所有配置都需要更改才能正常工作。 我还应该改变什么?

更新-

数据-

val fis: FileInputStream = new FileInputStream(new File(inputFile))
val bis: BufferedInputStream = new BufferedInputStream(fis);
val input: CompressorInputStream = new CompressorStreamFactory().createCompressorInputStream(bis);
br = new BufferedReader(new InputStreamReader(input))
val stringArray = br.lines().toArray()
val data = sc.parallelize(stringArray)

注意-这不会引起任何内存问题,即使效率极低。 我无法使用spark读取它,因为它引发了一些EOF错误。

myFunc,因为它很复杂,所以我不能真正发布它的代码。 但基本上,输入字符串是限定字符串,它执行了限定符替换,日期/时间规范化等操作。 输出字符串的大小将与输入字符串大致相同。

此外,它对于较小的数据大小也可以正常工作,并且输出正确,并且大小应该与输入数据文件大致相同。

如果您在MAP之前和之后添加程序中正在进行的操作的更多详细信息,将有帮助。 除非触发了动作,否则第二条命令(仅Map)不会执行任何操作。 您的文件可能未分区,驱动程序正在执行工作。 下面应该强制将数据平均分配给工作人员,并在单个节点上保护OOM。 但是,这将导致数据混排。

查看代码后更新解决方案,如果这样做,会更好

val data = sc.parallelize(stringArray).repartition(8)
data.map(s => myFunc(s)).saveAsTextFile(outFile)

您当前的解决方案没有利用火花。 您正在将整个文件加载到内存中的数组中,然后使用sc.parallelize将其分发到RDD中。 这极大地浪费了内存(即使没有火花),并且当然会导致大文件的内存不足问题。

而是使用sc.textFile(filePath)创建您的RDD。 然后spark可以智能地分块读取和处理文件,因此一次只需要一小部分存储在内存中。 您还可以通过这种方式利用并行性,因为spark可以并行读取和处理文件,而执行者却很多,而您需要拥有的文件执行器则更多,而无需在单个线程上读取单个文件中的整个文件机。

假设myFunc一次只能查看一行,那么该程序应具有非常小的内存占用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM