CPU 使用 Spark 执行 k-means 时的差距

CPU gap when doing k-means with Spark

当我用 k=100 调用 KMeans.train 时,在 Spark 完成几次 collectAsMap 调用后,我观察到这个 CPU 使用差距。正如我在图中用红色标记的那样,有 8 个核心,在此 gap.

期间,只有 1 个核心在工作,而其他 7 个核心处于静止状态

如果我将 k 提高到 200,差距将显着增加。

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

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

你要我给你代码和示例数据

您是否检查过 WebUI,尤其是 GC 时间?一个 CPU 向上,所有其他向下可能是一个停止世界的垃圾收集。

您可能想尝试启用并行 GC 并查看 Spark documentation 中有关 GC 调整的部分。

除此之外,collectAsMap return数据到master/driver,所以数据越大,单个驱动进程处理的时间就越长。您还应该尝试增加 spark.driver.memory.

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

综上所述,是因为默认的kmeans||初始化过程没有分布式,是在driver上执行的单线程。