问题描述
将火花DataFrame收集到R data.frame中引起的内存不足问题已在这里进行了数次讨论(例如here或here)。但是,在我的环境中似乎没有答案可用。
问题:
我正在尝试使用inSample <- collect(read.parquet(inSamplePath))
(来自read.parquet
库的SparkR
)收集一些交易数据。我的驱动程序有256 GB RAM。样本数据小于4 GB(在未压缩的CSV中,镶木地板要小得多),但是命令失败,并显示java.lang.OutOfMemoryError: Requested array size exceeds VM limit
错误。
环境和数据:
- 具有Standard_E32s_v3驱动程序节点(256 GB RAM)和2-8个Standard_D16s_v3工作线程的Azure Databricks集群
- 输入数据作为实木复合地板文件存储在Azure Datalake Gen2中
- 原始数据大小约4GB(整数,字符串和双精度数的混合;数据源自上游事务sql DB,因此结构非常整洁,没有字符串超过256个长度)
尝试解决的问题:
- 集群Spark配置:
spark.driver.maxResultSizei 128g
- 集群环境变量:
JAVA_OPTS="-xms120G -Xmx120G -XX:MaxPermSize=8G -XX:PermSize=4G"
- 脚本配置(使用
sparklyr
时进行了测试)config$spark.driver.memory
(设置为120G)
所有尝试均无济于事。 我必须缺少一些将内存分配给本地R的配置属性。请建议应更改哪些服务器配置或环境变量。
编辑:
- 测试成功的另一个选项:
- 已更新为Spark 3.0
- spark.driver.memory 130克
- spark.driver.memoryOverhead 62克(基于Spark 3.0 configuration description添加)
- spark.driver.maxResultSize 64克
- 容量验证:使用Spark Scala时,即使对于maxResultSize 16g,也可以收集输入(
val x = myInput.collect
);问题仅限于R模块
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)