【问题标题】:CPU gap when doing k-means with Spark使用 Spark 进行 k-means 时的 CPU 间隙
【发布时间】:2015-06-02 07:13:36
【问题描述】:
  • 我正在使用 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 位)环境中尝试了我的方法,并且我观察到了相同的行为。

你想要,我可以给你代码和示例数据。

【问题讨论】:

    标签: apache-spark k-means


    【解决方案1】:

    你检查过 WebUI,尤其是 GC 时间吗?一个 CPU 启动,所有其他 CPU 停止可能是一次停止世界的垃圾回收。

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

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

    【讨论】:

    • +1。我想强调collectAsMap 将数据返回给主/驱动程序这一事实。这可能是您的问题的根源,尽管这是一个实施问题,而不是实际问题。
    • collectAsMapKMeans 算法中被调用,我无法控制。
    • 我已经检查了 GC、执行器和驱动程序内存。一切看起来都很好。仅当我使用 kmeans|| 算法时才会出现此问题。
    • 正如 Mikel 所建议的,这可能不是问题,而是算法的工作方式。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 2017-11-01
      • 2016-11-16
      • 2016-07-28
      • 2023-03-04
      • 2017-03-30
      • 2015-05-09
      • 2016-12-16
      • 2017-11-20
      相关资源
      最近更新 更多