【问题标题】:Spark::KMeans calls takeSample() twice?Spark::KMeans 调用 takeSample() 两次?
【发布时间】:2016-12-23 12:10:22
【问题描述】:

我有很多数据,并且我已经尝试了基数 [20k, 200k+] 的分区。

我这样称呼它:

from pyspark.mllib.clustering import KMeans, KMeansModel
C0 = KMeans.train(first, 8192, initializationMode='random', maxIterations=10, seed=None)
C0 = KMeans.train(second, 8192, initializationMode='random', maxIterations=10, seed=None)

我看到initRandom() 调用了一次takeSample()

然后takeSample() 实现似乎没有调用自己或类似的东西,所以我希望KMeans() 调用一次takeSample()。那么为什么监视器显示两个takeSample()s 每个KMeans()

注意:我执行了更多的KMeans(),它们都调用了两个takeSample()s,无论数据是否为.cache()'d。

另外,分区的数量不影响takeSample()被调用的数量,恒定为2。

我正在使用 Spark 1.6.2(我无法升级)并且我的应用程序使用 Python,如果这很重要的话!


我把它带到了 Spark 开发者的邮件列表中,所以我正在更新:

第一个takeSample()的详细信息:

第二个takeSample()的详细信息:

可以看到执行了相同的代码。

【问题讨论】:

    标签: scala apache-spark distributed-computing k-means bigdata


    【解决方案1】:

    Shivaram Venkataraman 在 Spark 的邮件列表中建议:

    我认为 takeSample 本身运行多个作业,如果样本数量 在第一关收集是不够的。注释和代码路径 在GitHub 应该解释什么时候发生这种情况。您也可以通过以下方式确认 检查 logWarning 是否显示在您的日志中。

    // If the first sample didn't turn out large enough, keep trying to take samples;
    // this shouldn't happen often because we use a big multiplier for the initial size
    var numIters = 0
    while (samples.length < num) {
      logWarning(s"Needed to re-sample due to insufficient sample size. Repeat #$numIters")
      samples = this.sample(withReplacement, fraction, rand.nextInt()).collect()
      numIters += 1
    }
    

    但是,正如人们所看到的,第二条评论说它不应该经常发生,而且它确实经常发生在我身上,所以如果有人有其他想法,请告诉我。

    也有人认为这是 UI 的问题,takeSample() 实际上只调用了一次,但那只是热空气。

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2013-01-19
      • 2017-06-02
      • 2014-08-28
      • 2017-01-02
      • 2018-03-16
      • 1970-01-01
      • 2017-05-25
      • 2018-08-06
      相关资源
      最近更新 更多