2016-06-18 8 views
1

Ich benutze Funken K-Means Clustering unter Ml-Modul und ich bin in PySpark programmieren. Das Modul funktioniert gut bis 200 Cluster aber es gibt OutOfMemoryError sobald ich über 300 Cluster und mehr gehe. Meine Daten enthalten 200.000 Objekte und 25.000 Objekte für jedes Objekt. Ich befolge die Richtlinien, die unter der class pyspark.ml.clustering.KMeans von der Verbindung pyspark ML mocumentation erwähnt werden. Der einzige Unterschied zwischen dem Code, der in dieser Dokumentation erwähnt wird, und meinem ist, dass ich dünnere Vektoren anstelle von dichten Vektoren verwende.Spark k-bedeutet OutOfMemoryError

Es gibt keine Hardwarebegrenzung, da ich ein vernünftig großes Cluster-Setup habe, das über 700 Kerne und 2 TB Speicher verfügt. Ich habe nach diesem Problem gesucht und die meisten Links führen mich zu einer/allen der folgenden Konfigurationen. Die folgenden sind die Menge der Dinge, die ich versucht:

  • set/Erhöhung Treiberspeicher conf.set("spark.driver.memory", "64g")
  • set Parallelismus conf.set("spark.default.parallelism","1000")
  • Satz verwendet/Speicherfraktion conf.set("spark.storage.memoryFraction", "1")

Zusätzlich zum Anstieg über Konfiguration setze ich den Executorspeicher als 16g und Kerne als 150 .Unfortuna tely hat nichts geklappt und ich bekomme immer den folgenden Fehler (Fehler abgeschnitten).

Py4JJavaError: An error occurred while calling o98.fit. : java.lang.OutOfMemoryError: Java heap space at org.apache.spark.mllib.linalg.SparseVector.toArray(Vectors.scala:678) at org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612)

Bedeutet dies Funke nicht einmal ein 200k*25K Datensatz für 300+ Clustergröße verarbeiten kann ?, oder bin ich etwas fehlt ?.

+0

Benchmark ein ** nicht verteiltes Werkzeug ** wie ELKI im Vergleich. In der Regel wird es überraschend gut funktionieren, solange die Daten in den Hauptspeicher passen. 200k Objekte sind nicht so viel, das sollte noch auf einem einzelnen Host funktionieren. Nach meiner Erfahrung ist verteiltes "Zeug" überraschend langsam. –

Antwort

1
org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612) 

Das ist das Problem. Die Cluster-Zentren werden in eine dichte Repräsentation konvertiert und dann an alle Executoren übertragen. Dies wird nicht mit Tausenden von Funktionen skalieren, was Ihr Fall ist. Zur Kasse gehen SparseML.

+0

Schöner Link zu 'SparseML'. Hast du es benutzt? – javadba

+0

Danke für den Link. Ich werde es benutzen und sehen, ob es für mich klappt. – Rkz