CPU 使用 Spark 执行 k-means 时的差距
CPU gap when doing k-means with Spark
- 我正在使用 Spark 1.2.0。
- 我的特征向量大约有 350 个维度
- 数据集大约有 24k 个向量
- 我下面描述的问题只发生在
kmeans||
算法上;我暂时切换到kmeans-random
,但我想知道为什么kmeans||
不起作用。
当我用 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上执行的单线程。
- 我正在使用 Spark 1.2.0。
- 我的特征向量大约有 350 个维度
- 数据集大约有 24k 个向量
- 我下面描述的问题只发生在
kmeans||
算法上;我暂时切换到kmeans-random
,但我想知道为什么kmeans||
不起作用。
当我用 k=100 调用 KMeans.train
时,在 Spark 完成几次 collectAsMap
调用后,我观察到这个 CPU 使用差距。正如我在图中用红色标记的那样,有 8 个核心,在此 gap.
如果我将 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上执行的单线程。