Spark Streaming处理速度滞后于读取速度测试
- 包 spark.examples.streaming
- 导入 org.apache.spark.SparkConf
- import org.apache.spark.streaming.StreamingContext._
- 导入 org.apache.spark.streaming._
- 对象NetCatStreamingWordCountDelay {
- def main(args:Array [String]){
- val conf = new SparkConf()。setAppName(“NetCatStreamingWordCountDelay” )
- conf.setMaster(“local [3]” )
- //每秒钟接收数据
- val ssc = new StreamingContext(conf,Seconds(1 ))
- val lines = ssc.socketTextStream(“192.168.26.140” , 9999 )
- //每个处理应该花费大约4秒钟的时间。
- lines.foreachRDD(rdd => {
- println(“即使rdd为空也是输出” )
- Thread.sleep(4 * 1000 )
- })
- ssc.start()
- ssc.awaitTermination()
- }
- }
上面的测试代码:
1.时间间隔设置为1秒,也就是说,每隔1秒钟,Spark Streaming将创建一个RDD
2.处理的速度是4秒,也就是,处理速度滞后于数据的读取速度
2. UI展现
如何解读上面的统计信息:
1. Spark Streaming一共运行了1分钟35秒= 95秒
2.一共处理了23个批次,每隔处理的时间4秒多点,因为23个批次总耗时是92秒
3.批次的时间间隔是1秒
等待批次为什么是1?应该是95 / 1-23 = 72个才对
我从火花流UI中复制下面的内容,我不知道为什么Waiting批量是1,我的理解是它应该是72.
以下是我的理解:
1.总时间是1分35秒= 95秒
2.批量间隔为1秒,95秒内产生95个批次。
3.处理过的批次是23(正确,因为在我的处理代码中,它什么都不做,只是睡了4秒)
4.然后等待的批次应该是95-23 = 72
Tathagata Das回复:非常好的问题!这是因为当前的代码是这样写的,使得ui认为一个批处理只在实际开始处理时才等待。计算中不考虑在队列中等待的批处理。在等待中计数可能更直观。
1.处理时间指的是每个批次的耗用时间,统计的时间包括一个批次的处理耗时,批次的最小耗时。以及25%,50%,75%时间段的耗时
2.总延迟:1分10秒如何计算出来的?总共95秒,有23个批出来完(23秒),那么总延时是95-23 = 72秒。
3.调度延迟表示一个批次从入队到出队的延迟,上例中,最后一个批次的延时是1分6秒钟。会不断的累加。
3. Spark官方文档解释
除了Spark的监控功能外,Spark
Streaming还有其他特定功能。当使用StreamingContext时,Spark
Web UI将显示一个附加的Streaming
选项卡,其中显示有关正在运行的接收方(接收方是否处于活动状态,接收记录数,接收方错误等)和已完成批次(批处理时间,排队延迟等)的统计信息)。这可以用来监视流应用程序的进度。
Web UI中的以下两个指标尤为重要:
- 处理时间 - 处理每批数据的时间。
- 计划延迟 - 批次在队列中等待处理先前批次的时间。
如果批处理时间一直超过批处理间隔和/或排队延迟持续增加,则表示系统无法处理批生产速度快,落后的批次。在这种情况下,考虑减少批处理时间。
Spark Streaming程序的进度也可以使用StreamingListener接口进行监控,该接口允许您获取接收器状态和处理时间。请注意,这是一个开发人员API,将来可能会改进(即报告更多信息)
转载地址:http://bit1129.iteye.com/blog/2198713