ich einen Funken Anwendung, die eine Datei mit 100 Millionen Zeilen liest (jede Zeile einen Code hat, wie US1.234.567B1
) und bekommt einige Muster aus ihm heraus, wie folgt:Funken OutOfMemoryError wenn eine große Eingabedatei unter
val codes = sc.textFile("/data/codes.txt")
def getPattern(code: String) = code.replaceAll("\\d", "d")
val patterns: RDD[(String, Int)] = codes
.groupBy(getPattern)
.mapValues(_.size)
.sortBy(- _._2)
patterns
.map { case (pattern, size) => s"$size\t$pattern" }
.saveAsTextFile("/tmp/patterns")
Ich führe dies auf Master = local [*], und es schlägt mit java.lang.OutOfMemoryError: GC overhead limit exceeded
.
Warum ist das?
Ich dachte, dass Spark mit jeder Größe der Eingabe umgehen kann, solange es genug Speicherplatz auf der Festplatte hat.
zwei Dokumente zu erklären, warum groupBy vermieden werden sollte: https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html https://github.com/awesome -spark/Funken-Gotchas –