Apache spark 使用Spark执行k-means时的CPU间隙 我正在使用Spark 1.2.0 我的特征向量大约是350维 数据集约为24k个向量 我下面描述的问题只发生在kmeans |算法上我现在已经切换到kmeans random,但我想知道kmeans | |不起作用的原因
当我用k=100调用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位)环境中尝试了我的方法,我观察到了相同的行为 如果你愿意,
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 | |
算法时,这个问题才会发生。正如米克尔所说,这可能不是问题,但只是算法的工作方式。