我正在学习基于https://spark.apache.org/docs/latest/streaming-programming-guide.html的旧Spark流,即,这是旧的DStream。我在Spark Shell中逐行执行以下命令:
import org.apache.spark.streaming._
val ssc = new StreamingContext(sc, Seconds(5))
val lines = ssc.socketTextStream("localhost", 9999)
val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)
wordCounts.print()
ssc.start()
然后我使用Netcat实用程序将单词发送到localhost:9999。它可以按预期工作,显示字数以及时间戳。到目前为止,一切都很好。
我想将其创建为独立应用程序,如下所示:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.streaming._
object StreamingExample {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Streaming Example").setMaster("local")
val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc, Seconds(5))
val lines = ssc.socketTextStream("localhost", 9999)
val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()
sc.stop()
}
}
当我将其发送到Spark时,它可以工作,并且当我在Netcat控制台中编写内容时,它会写一些INFO日志条目(因此它会收到),它每5秒钟记录一些内容(因此调度程序也可以工作),但是不会显示字数统计和时间戳记。但是,如果我用Ctrl + C中断Spark,则会突然显示很长的日志,以及时间戳和字数。
我希望中断时每5秒显示一次字数统计,而不是最后一次显示,尤其是在我一切都在本地运行的情况下。我的期望不正确吗?为什么会出现这种情况?如何使它连续显示字数统计?