为什么Spark Streaming只有在终止后才开始工作?

时间:2017-06-05 21:07:37

标签: apache-spark spark-streaming

我有一个非常简单的火花流工作在独立模式下本地运行。有一个客户接收器从数据库读取并将其传递给主要工作,打印总数。不是一个实际的用例,但我正在玩耍学习。问题是工作永远陷入困境,逻辑非常简单,所以我认为它既没有处理也没有内存问题。奇怪的是,如果我停止工作,突然在日志中我看到作业执行的输出和其他支持的工作随之而来!有人可以帮我理解这里发生了什么吗?

 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()

enter image description here

终止程序后跟踪日志滚动,显示批处理的执行 -

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

1 个答案:

答案 0 :(得分:2)

TL; DR 至少使用local[2]

问题如下:

.master("local[1]")

你应该在Spark Streaming中至少有2个线程用于接收器,或者你的流媒体工作甚至没有机会在等待资源时陷入困境,即分配一个免费线程。

引用Spark Streaming' s A Quick Example

  

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

我的建议是使用local[2](最小值)或local[*]来尽可能多地使用核心。最好的解决方案是使用Apache Mesos,Hadoop YARN或Spark Standalone等集群管理器。