Я использовал этот код для извлечения биграмм из текстового файла:OutOfMemoryError в Scala и Спарк
import org.apache.spark.{SparkContext, SparkConf}
object DS_E6 {
def main(args: Array[String]): Unit = {
case class Bigram(first: String, second: String) {
def mkReplacement(s: String) = s.replaceAll(first + " " + second, first + "-" + second)
}
def stringToBigrams(s: String) = {
val words = s.split(" ")
if (words.size >= 2) {
words.sliding(2).map(a => Bigram(a(0), a(1)))
} else
Iterator[Bigram]()
}
val conf = new SparkConf()
.setMaster("local")
.setAppName("bigram")
.set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)
val data = sc.textFile("data/file.txt")
val bigrams = data.flatMap {
stringToBigrams
}.collect()
val bigramCounts = bigrams.groupBy(identity).mapValues(_.size)
val threshold = 100
val topBigrams = bigramCounts.filter(_._2 >= threshold).map(_._1)
topBigrams.foreach(println)
val replaced = data.map(r => topBigrams.foldLeft(r)((r, b) => b.mkReplacement(r)))
val replaced1 = replaced.zipWithIndex()
.map { case (line, i) => i.toString + "," + line}
replaced1.coalesce(1).saveAsTextFile("data/output.txt")
}
}
}
мой входной файл 45 МБ, когда я запускаю этот код он показывает мне ниже ошибок: (я думаю это связано с Collect())
java.lang.OutOfMemoryError: GC overhead limit exceeded
at org.spark-project.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:342)
at org.spark-project.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:526)
at org.spark-project.jetty.util.thread.QueuedThreadPool.access$600(QueuedThreadPool.java:44)
at org.spark-project.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
как я могу решить эту проблему?
При запуске приложение попробуйте увеличить JVM размер кучи, например -Xmx1G – kostya
Как установить размер кучи JVM на -Xmx1G? – AHAD
Как запустить код, который вы предоставили? – kostya