2016-08-17 5 views
2

많은 데이터가 있으며 카디널리티 [20k, 200k +]의 파티션으로 실험했습니다.Spark :: KMeans가 takeSample()을 두 번 호출합니까?

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()을 한 번 호출합니다. 그렇다면 모니터에 KMeans() 당 두 개의 takeSample()이 표시되는 이유는 무엇입니까?

enter image description here

참고 : I는 KMeans() 더 실행하고, 그들 모두는 데이터 .cache() 'D 나 있지 않은 관계없이 두 takeSample() S를 호출한다.

또한, 호출 될 수 takeSample()에 영향을주지 않습니다 파티션의 수, 그것은 (내가 업그레이드 할 수 없습니다) 2.

내가 스파크 1.6.2을 사용하고 상수이고 내 응용 프로그램이있는 경우, 파이썬에 그게 중요해!


내가이 불꽃 개발자들의 메일 링리스트에이 문제를 가져왔다, 그래서 업데이트하고 있습니다 : 1 takeSample()

세부 사항 : 2 takeSample()

enter image description here

세부 사항 :

enter image description here

동일한 코드가 실행되는 것을 볼 수 있습니다. 스파크의 메일 링리스트에 Shivaram 벤 카타 라만에 의해 제안

답변

1

:

나는 첫 번째 패스에서 수집 한 샘플 의 양이 충분하지 않은 경우 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 
} 

그러나, 2 차 의견은 자주 발생하지 않아야하고, 나에게 항상 일 때문에 사람이 다른 생각이 있으면 알려 주시기 바랍니다 않는다고 말했다.

이것은 UI의 문제이며 실제로는 한 번만 호출 된 takeSample()이지만 뜨거운 공기라고 제안되었습니다.