Spark k-means OutOfMemoryError

时间:2016-06-18 21:34:34

标签: python scala apache-spark out-of-memory cluster-analysis

我在Ml模块下使用spark的k-means聚类,我在PySpark中编程。该模块运行良好,直到200个集群,但一旦我超过300个集群,它就会提供OutOfMemoryError。我的 数据包含每个对象的200k对象和25k功能。我遵循链接pyspark ML mocumentationclass pyspark.ml.clustering.KMeans下提到的指南。本文档中提到的代码与我的代码之间的唯一区别是我使用的是稀疏向量而不是密集向量。

没有硬件限制,因为我拥有一个具有超过700个内核和2TB内存的合理大型集群设置。我搜索了这个问题,大部分链接都让我做了以下一个/所有配置。 以下是我尝试过的一系列事情:

  • 使用conf.set("spark.driver.memory", "64g")
  • 设置/增加驱动程序内存
  • 设置并行度conf.set("spark.default.parallelism","1000")
  • 设置/增加内存分数conf.set("spark.storage.memoryFraction", "1")

除了上面的配置,我还将执行程序内存设置为16g ,将核心设置为150 。但遗憾的是没有任何问题,我不断收到以下错误(错误被截断) )。

  

Py4JJavaError:调用o98.fit时发生错误。 :   java.lang.OutOfMemoryError:Java堆空间at   org.apache.spark.mllib.linalg.SparseVector.toArray(Vectors.scala:678)     在   org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612)

这是否意味着火花甚至无法处理300 +簇大小的200k*25K数据集?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612)

这就是问题所在。群集中心转换为密集表示,然后广播给所有执行者。这不会扩展到成千上万的功能,这是你的情况。结帐SparseML