我在Ml模块下使用spark的k-means聚类,我在PySpark中编程。该模块运行良好,直到200个集群,但一旦我超过300个集群,它就会提供OutOfMemoryError
。我的
数据包含每个对象的200k对象和25k功能。我遵循链接pyspark ML mocumentation中class 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
数据集?或者我错过了什么?
答案 0 :(得分:1)
org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612)
这就是问题所在。群集中心转换为密集表示,然后广播给所有执行者。这不会扩展到成千上万的功能,这是你的情况。结帐SparseML。