Spark :: KMeans两次调用takeSample()?

时间:2016-08-17 00:26:19

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

我有很多数据,我已经尝试过基数分区[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()两个KMeans()

enter image description here

注意:我执行了更多KMeans(),他们都会调用两个takeSample(),无论数据是.cache()还是不是。

此外,分区数不会影响调用takeSample()的数量,它常量为2。

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

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

第1 takeSample()的详细信息:

enter image description here

第二takeSample()的详细信息:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

我认为如果样本数量,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()实际上只被调用一次,但那只是热空气。