Apache spark 为什么Spark Streaming仅在终止后才启动作业?

Apache spark 为什么Spark Streaming仅在终止后才启动作业?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我有一个非常简单的spark流媒体作业,在独立模式下本地运行。有一个客户接收器,它从数据库中读取数据并将其传递给主作业,主作业打印总数。这不是一个实际的用例,但我正在四处学习。问题是这个作业会永远卡住,逻辑非常简单,所以我认为它既不会做任何处理,也不会出现内存问题。奇怪的是,如果我停止作业,我会突然在日志中看到作业执行的输出和其他备份作业的输出!有人能帮我理解这里发生了什么吗 val spark = SparkSession .builder() .master("local[1]")

我有一个非常简单的spark流媒体作业,在独立模式下本地运行。有一个客户接收器,它从数据库中读取数据并将其传递给主作业,主作业打印总数。这不是一个实际的用例,但我正在四处学习。问题是这个作业会永远卡住,逻辑非常简单,所以我认为它既不会做任何处理,也不会出现内存问题。奇怪的是,如果我停止作业,我会突然在日志中看到作业执行的输出和其他备份作业的输出!有人能帮我理解这里发生了什么吗

 val spark = SparkSession
  .builder()
  .master("local[1]")
  .appName("SocketStream")
  .getOrCreate()

val ssc = new StreamingContext(spark.sparkContext,Seconds(5))
val lines = ssc.receiverStream(new HanaCustomReceiver())


lines.foreachRDD{x => println("==============" + x.count())}

ssc.start()
ssc.awaitTermination()

终止程序后,按照日志滚动显示批处理的执行情况-

17/06/05 15:56:16 INFO JobGenerator: Stopping JobGenerator immediately
17/06/05 15:56:16 INFO RecurringTimer: Stopped timer for JobGenerator after time 1496696175000
17/06/05 15:56:16 INFO JobGenerator: Stopped JobGenerator
==============100

TL;DR至少使用
本地[2]

问题如下:

.master("local[1]")
在Spark Streaming中,您应该至少有2个线程用于接收器,否则您的流媒体作业甚至没有机会启动,因为它们无法等待资源,即分配一个空闲线程

引用Spark Streaming的:

//主机需要2个内核以防止出现饥饿情况

我的建议是使用
local[2]
(最小值)或
local[*]
来获取尽可能多的内核。最好的解决方案是使用集群管理器,如ApacheMesos、Hadoop Thread或Spark Standalone