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 ?.
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. –