我是新手,正在学习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应该在某个时间发生,
我会问在这种情况下如何实践。
答案 0 :(得分:1)
内存接收器仅应用于调试低数据量,因为整个输出将被收集并存储在驱动程序的内存中。输出将作为内存表存储在内存中。
因此,如果发生OOM错误,驱动程序将崩溃,并且驱动程序内存中维护的所有状态都将丢失。
控制台水槽也是如此。