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