如果在火花结构化流中完整输出模式发生OOM怎么办

时间:2018-07-27 12:01:07

标签: apache-spark

我是新手,正在学习Spark结构化流式传输,

我有以下代码使用complete作为输出模式

import java.util.Date

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.streaming.Trigger
import org.apache.spark.sql.types.StructType

object StreamingWordCount {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("StreamingWordCount")
      .config("spark.sql.shuffle.partitions", 1)
      .master("local[2]")
      .getOrCreate()

    import spark.implicits._

    val lines = spark
      .readStream
      .schema(new StructType().add("value", "string"))
      .option("maxFilesPerTrigger", 1)
      .text("file:///" + data_path)
      .as[String]

    val wordCounts = lines.flatMap(_.split(" ")).groupBy("value").count()

    val query = wordCounts.writeStream
      .queryName("t")
      .outputMode("complete")
      .format("memory")
      .start()


    while (true) {

      spark.sql("select * from t").show(truncate = false)
      println(new Date())
      Thread.sleep(1000)
    }


    query.awaitTermination()
  }
}

一个快速的问题是,随着时间的推移,spark运行时会记住太多的单词和计数状态,因此OOM应该在某个时间发生,

我会问在这种情况下如何实践。

1 个答案:

答案 0 :(得分:1)

内存接收器仅应用于调试低数据量,因为整个输出将被收集并存储在驱动程序的内存中。输出将作为内存表存储在内存中。

因此,如果发生OOM错误,驱动程序将崩溃,并且驱动程序内存中维护的所有状态都将丢失。

控制台水槽也是如此。