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()
была вызвана только один раз, но это был просто горячий воздух.