Breeze pinv(Moore-Penrose)伪逆函数使用Spark提供OutOfMemory错误

时间:2017-09-02 21:24:12

标签: scala apache-spark matrix out-of-memory

我正在Spark中开发一种极端学习机器类型的神经网络,它需要使用Moore-Penrose伪逆函数。这在任何Spark库中都不可用,所以我使用Breeze,它需要将Spark数据结构转换为Breeze矩阵。当我到达beta = pinv(H) * T时,一切都因OOM异常而失败(我认为在Spark中我没有考虑过)。有什么想法吗?

pinv是Breeze中的Moore-Penrose伪逆。 H是35,000行和10列的矩阵。 SVD应该能够解决这个问题。它不是一个特别大的数据集,只需要30Mb。我在笔记本电脑上本地运行所有内容,云中没有任何东西。我的笔记本电脑上有8G内存(MacBook Air)。

我读到你可以使用spark-shell命令增加驱动程序内存,但我不知道如何执行此操作,或者它如何与我设置SparkSession的IDE中的代码链接

val spark: SparkSession = SparkSession
  .builder()
  .master("local[*]")
  .appName("ELMPipelineTest")
  .getOrCreate()`

1 个答案:

答案 0 :(得分:0)

我修正了如下。首先,应用程序必须在命令行上运行,而不是通过IDE运行,因为必须在构建JVM之前更改Spark驱动程序内存。我使用sbt作为我的构建工具,所以从我的项目的顶级主管,通过我运行的Linux shell:

sbt compile
sbt package // this creates a jar file
$SPARK_HOME/bin/spark-submit --class dev.elm.ELMPipeline --master  local[4] --driver-memory 8G path/to/jar.jar 

我首先将$ SPARK_HOME设置为spark home变量。 这可以避免Java OOM错误。感谢@RafalKwasny指出这一点。