Spark:: KMeans вызывает takeSample() дважды?

У меня много данных, и я экспериментировал с разделами мощности [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()?

введите описание изображения здесь

Примечание. Я выполняю больше KMeans(), и все они вызывают два takeSample() s, независимо от данных .cache() 'd или нет.

Кроме того, число разделов не влияет на число takeSample(), оно равно 2.

Я использую Spark 1.6.2 (и я не могу обновить), и мое приложение находится на Python, если это имеет значение!


Я привел это в список рассылки разработчиков Spark, поэтому я обновляю:

Детали 1-го takeSample():

введите описание изображения здесь

Детали 2-го takeSample():

введите описание изображения здесь

где видно, что выполняется тот же код.

Ответ 1

Как предложил Шиварам Венкатараман в списке рассылки Spark:

Я думаю, что сам takeSample запускает несколько заданий, если количество выборок собранных в первый проход, недостаточно. Код комментария и кода на GitHub должен объяснить, когда это произойдет. Также вы можете подтвердить это проверяя, появляется ли loglogging в ваших журналах.

// 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
}

Однако, как видно, второй комментарий сказал, что это не должно случаться часто, и это всегда происходит со мной, поэтому, если у кого-то есть другая идея, пожалуйста, дайте мне знать.

Также было высказано предположение, что это была проблема пользовательского интерфейса, а takeSample() была вызвана только один раз, но это был просто горячий воздух.