集群设置-
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错误。 (因此,不建议您使用spark内置文件读取)
myFunc,因为它很复杂,所以我无法真正发布它的代码。但基本上,输入字符串是限定字符串,它执行了限定符替换,日期/时间规范化等操作。输出字符串的大小将与输入字符串大致相同。
此外,它对于较小的数据大小也可以正常工作,并且输出正确且大小与输入数据文件大致相同。