Apache spark 使用Spark执行k-means时的CPU间隙 我正在使用Spark 1.2.0 我的特征向量大约是350维 数据集约为24k个向量 我下面描述的问题只发生在kmeans |算法上我现在已经切换到kmeans random,但我想知道kmeans | |不起作用的原因

Apache spark 使用Spark执行k-means时的CPU间隙 我正在使用Spark 1.2.0 我的特征向量大约是350维 数据集约为24k个向量 我下面描述的问题只发生在kmeans |算法上我现在已经切换到kmeans random,但我想知道kmeans | |不起作用的原因,apache-spark,k-means,Apache Spark,K Means,当我用k=100调用KMeans.train时,在Spark进行了几次collectamap调用后,我观察到这个CPU使用缺口。正如我在图中用红色标记的那样,共有8个磁芯,只有1个磁芯在工作,而其他7个在这个间隙中处于静止状态 如果我把k提高到200,差距会显著增大 我想知道为什么会出现这种差距?如何避免它?因为我的工作要求我使用更大的数据集设置k=5000。以我当前的设置,工作永远不会结束 我已经在Windows和Linux(都是64位)环境中尝试了我的方法,我观察到了相同的行为 如果你愿意,

当我用k=100调用
KMeans.train
时,在Spark进行了几次
collectamap
调用后,我观察到这个CPU使用缺口。正如我在图中用红色标记的那样,共有8个磁芯,只有1个磁芯在工作,而其他7个在这个间隙中处于静止状态

如果我把k提高到200,差距会显著增大

我想知道为什么会出现这种差距?如何避免它?因为我的工作要求我使用更大的数据集设置k=5000。以我当前的设置,工作永远不会结束

我已经在Windows和Linux(都是64位)环境中尝试了我的方法,我观察到了相同的行为

如果你愿意,我可以给你代码和样本数据


您是否检查过WebUI,尤其是GC时间?一个CPU启动,所有其他CPU关闭可能会停止世界垃圾收集

您可能想尝试启用并行GC,并检查中有关GC调优的部分

除此之外,
collectAsMap
将数据返回给主/驱动程序,因此数据越大,单个驱动程序进程处理的时间就越长。您还应该尝试增加spark.driver.memory

有关此问题的详细信息,请参阅


总之,这是因为默认的kmeans | |初始化过程不是分布式的,而是在驱动程序上用一个线程执行的。

+1。我想强调的是,
collectAsMap
将数据返回给主控/驱动程序。这可能是问题的根源,尽管这是一个实现问题,而不是实际问题。
collectAsMap
KMeans
算法中调用,我无法控制。我已经检查了GC、执行器和驱动程序内存。一切看起来都很好。只有当我使用
kmeans | |
算法时,这个问题才会发生。正如米克尔所说,这可能不是问题,但只是算法的工作方式。