如何配置Spark / Databricks内存以收集大的R data.frame?

问题描述

将火花DataFrame收集到R data.frame中引起的内存不足问题已在这里进行了数次讨论(例如herehere)。但是,在我的环境中似乎没有答案可用。

问题:

我正在尝试使用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 Scala时,即使对于maxResultSize 16g,也可以收集输入(val x = myInput.collect);问题仅限于R模块

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...