spark streaming之 windowDuration、slideDuration、batchDuration
spark streaming 不同于sotm,是一种准实时处理系统。storm 中,把批处理看错是时间教程的实时处理。而在spark streaming中,则反过来,把实时处理看作为时间极小的批处理。
1、三个时间参数
spark streaming 中有三个关于时间的参数,分别如下:
窗口时间windowDuration:当前窗口要统计多长时间的数据,是批量时间的整数倍
滑动时间slideDuration:要多长时间更新一次结果,是批量时间的整数倍
批量时间batchDuration:多长时间创建一个批次,与实际业务无关,只与数据量有关,数据量大则可以设置短一些,数据量小则设置长一些,但必须小于其他两个时间,
2、该怎么设置?
为方便理解,就拿咱们最常见的日启、日活、周启、周活作为示例
注:1、实际中日启、日活、周启、周活更多是用批处理,此处只是拿来方便大家理解
2、此处不是严格意义上的日启、周启。此处的日:最近24小时,周:最近7天
案例1:每隔一小时,统计产品的日启、日活,
窗口时间:1日,滑动时间:1小时,批量时间:1小时、半小时、15分钟、10分钟、5分钟、2分钟均可,视数据量大小而定
案例2:每天统计最近七天累计启动、活跃
窗口时间:7日,滑动时间:1日 批量时间:一小时、半小时、10分钟、5分钟
3、实战
为了理解上边参数是怎么设置的,我们对假定现在有个需求,需要对输入的字母进行计数。
使用nc -lk 9999 模拟生产者,发送数据,streaming 通过socket接收数据
实战1:每10秒统计当前输入的字符
适用:彻底非累加业务
import org.apache.spark.streaming.{Minutes, Seconds, StreamingContext}
import org.apache.spark.SparkConf
val sparkConf = new SparkConf().setAppName("socket-streaming-wordcount").setMaster("local[2]")
//10秒创建一个批次
val ssc = new StreamingContext(sparkConf, Seconds(10))
val lines = ssc.socketTextStream("localhost", 9999)
val wordCounts = lines.flatMap(_.split(" ")).map(x => (x, 1l))
val current_stream = wordCounts.reduceByKey(_ + _)
current_stream.print()
current_stream.repartition(1).saveAsTextFiles("/data/socket_wordcount_current.")
ssc.start()
ssc.awaitTermination()
启动生产者 nc -lk 9999
在spark-shell中输入上边代码
在nc 的终端下,
输入字符操作1、第一个10秒,输入a,第二个10秒输入b,等待10秒,在spark-shell中确认第二次计算完成后,查看新产生文件,期望结果 【 (a,1) (b,1) 】 原因:我们当前仅输入了a、b
输入字符操作2、第四个10秒,输入c,第五个10秒输入d,等待10秒,在spark-shell中确认第二次计算完成后,查看新产生文件 期望 【 (c,1) (d,1)】 原因:我们当前输入了c、d
输入字符操作3、这时,不需要操作,等待30秒,在spark-shell中确认第三次计算完成后,查看新产生文件 期望 【 】 原因:当前我们没有输入, 所以没有任何字符可以统计
实战2、每10秒统计历史所有输入的字符。
适用范围:计算历史(包含窗口之外)累计数据,经常用于统计“总装机量”之类
import org.apache.spark.streaming.{Minutes, Seconds, StreamingContext}
import org.apache.spark.SparkConf
val sparkConf = new SparkConf().setAppName("socket-streaming-wordcount").setMaster("local[2]")
//10秒创建一个批次
val ssc = new StreamingContext(sparkConf, Seconds(10))
//累加所有经过的数据
val updateFunc = (values: Seq[Long], state: Option[Long]) => {
val currentCount = values.foldLeft(0l)(_ + _)
val previousCount = state.getOrElse(0l)
Some(currentCount + previousCount)
}
ssc.checkpoint("socket_wordcount_history")
val lines = ssc.socketTextStream("localhost", 9999)
val wordCounts = lines.flatMap(_.split(" ")).map(x => (x, 1l))
val history_stream = wordCounts.updateStateByKey[Long](updateFunc)//合并当前数据和历史数据
history_stream.print()
history_stream.repartition(1).saveAsTextFiles("/data/socket_wordcount_history.")
ssc.start()
ssc.awaitTermination()
启动生产者 nc -lk 9999
在spark-shell中输入上边代码
在nc 的终端下,
输入字符操作1、第一个10秒,输入a,第二个10秒输入b,等待10秒,在spark-shell中确认第二次计算完成后,查看新产生文件,期望结果 【 (a,1) (b,1) 】 原因:我们当前输入了a、b
输入字符操作2、第四个10秒,输入c,第五个10秒输入d,等待10秒,在spark-shell中确认第二次计算完成后,查看新产生文件 期望 【 (a,1) (b,1) (c,1) (d,1)】 原因:我们当前输入了c、d,历史输入过 a、b
输入字符操作3、这时,不需要操作,等待30秒,在spark-shell中确认第三次计算完成后,查看新产生文件 期望 【 (a,1) (b,1) (c,1) (d,1)】 原因:当前我们没有输入,但是,历史曾经输入过a、b、c、d
输入字符操作4、这时,仍不需要操作,等待30秒,在spark-shell中确认第四次计算完成后,查看新产生文件 期望 【 (a,1) (b,1) (c,1) (d,1)】原因: 当前我们没有输入,但是,历史曾经输入过a、b、c、d
之后,即使没有输入abcd,统计结果仍包含abcd这四个字符各1次
实战3、每隔30秒,统计最近1分钟输入的字母。窗口内历史累加
(适用范围:非累加业务,这里的累加指的是超出window范围)
sc.stop
import org.apache.spark.streaming.{Minutes, Seconds, StreamingContext}import org.apache.spark.SparkConf
val updateFunc = (values: Seq[Long], state: Option[Long]) => {
val currentCount = values.foldLeft(0l)(_ + _)
val previousCount = state.getOrElse(0l)
Some(currentCount + previousCount)
}
val sparkConf = new SparkConf().setAppName("socket-streaming-wordcount").setMaster("local[2]")
val ssc = new StreamingContext(sparkConf, Seconds()) //10秒创建一个批次
ssc.checkpoint("socket-kafka-wordcount_recent")
val lines = ssc.socketTextStream("localhost", 9999)
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1l))
val stateDstream = wordCounts.reduceByKeyAndWindow(_ + _, _ - _, Minutes(1), Seconds(30)) //每30秒算一次,数据范围为最近一分钟内收到的数据 另外,使用window时,需要设置checkpoint
stateDstream.print()
stateDstream.repartition(1).saveAsTextFiles("/data/socket-streaming-wordcount.log")
ssc.start()
ssc.awaitTermination()
启动生产者 nc -lk 9999
在spark-shell中输入上边代码
在nc 的终端下,
输入字符操作1、第一个10秒,输入a,第二个10秒输入b,等待10秒,在spark-shell中确认第二次计算完成后,查看新产生文件,期望结果 【 (a,1) (b,1) 】 原因:最近1分钟,我们只输入了a、b
输入字符操作2、第四个10秒,输入c,第五个10秒输入d,等待10秒,在spark-shell中确认第二次计算完成后,查看新产生文件 期望 【 (a,1) (b,1) (c,1) (d,1)】 原因:最近1分钟,我们只输入了a、b、c、d
输入字符操作3、这时,不需要操作,等待30秒,在spark-shell中确认第三次计算完成后,查看新产生文件 期望 【 (a,0) (b,0) (c,1) (d,1)】 原因:最近1分钟,我们只输入了c、d ,1分钟之前输入的a、b将不再在统计范围之内
输入字符操作4、这时,仍不需要操作,等待30秒,在spark-shell中确认第四次计算完成后,查看新产生文件 期望 【 (a,0) (b,0) (c,0) (d,0)】原因:最近1分钟,我们没有任何输入,1 分钟之前输入的a、b、c、d将不再在统计范围之内
spark streaming之 windowDuration、slideDuration、batchDuration的更多相关文章
- Spark入门实战系列--7.Spark Streaming(下)--实时流计算Spark Streaming实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .实例演示 1.1 流数据模拟器 1.1.1 流数据说明 在实例演示中模拟实际情况,需要源源 ...
- Spark Streaming fileStream实现原理
fileStream是Spark Streaming Basic Source的一种,用于“近实时”地分析HDFS(或者与HDFS API兼容的文件系统)指定目录(假设:dataDirectory)中 ...
- Spark学习之Spark Streaming
一.简介 许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用,还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它 ...
- Spark Streaming之窗口函数和状态转换函数
流处理主要有3种应用场景:无状态操作.window操作.状态操作. reduceByKeyAndWindow import kafka.serializer.StringDecoder import ...
- Spark Streaming流式处理
Spark Streaming介绍 Spark Streaming概述 Spark Streaming makes it easy to build scalable fault-tolerant s ...
- Spark Streaming源码分析 – JobScheduler
先给出一个job从被generate到被执行的整个过程在JobGenerator中,需要定时的发起GenerateJobs事件,而每个job其实就是针对DStream中的一个RDD,发起一个Spark ...
- Spark Streaming源码分析 – InputDStream
对于NetworkInputDStream而言,其实不是真正的流方式,将数据读出来后不是直接去处理,而是先写到blocks中,后面的RDD再从blocks中读取数据继续处理这就是一个将stream离散 ...
- Spark Streaming源码分析 – DStream
A Discretized Stream (DStream), the basic abstraction in Spark Streaming, is a continuous sequence o ...
- Spark Streaming数据清理内幕彻底解密
本讲从二个方面阐述: 数据清理原因和现象 数据清理代码解析 Spark Core从技术研究的角度讲 对Spark Streaming研究的彻底,没有你搞不定的Spark应用程序. Spark Stre ...
随机推荐
- IIS7 Microsoft.Web.Administration 创建Application问题
在使用DirectoryEntry操作IIS时,可以设置很多属性.但使用Microsoft.Web.Administration中的一些类时,不知道在哪设置.例如:AccessScript,Acces ...
- 新建虚拟机与本机ping不通(一招解决)
初始新建虚拟机或者复制虚拟机后,发现虚拟机能ping通内外网,但是本机无法ping通虚拟机,xshell也无法连接虚拟机 这时候就很头疼了,因为要上传很多文件到虚拟机上面 解决办法: 1.关闭虚拟机后 ...
- Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句(原创)
Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句 查找活动的事务以及活动事务关联的会话信息 select s.sid 会话ID, s.serial# 会话序列号, s.usernam ...
- CCTV-2《遇见大咖》专访雷军----笔记记录
与央视记者约好两点采访,但因为公司会议拖到了三点.雷军对此表示抱歉,解释了一天的行程,并说:“今天不算密的,密的平均一天应该有十一个会.然后我现在基本每天中午饭,大概就是三分钟的时间.” 因为要上镜, ...
- centos7下配置iptables实现外网访问内网服务器
说明:Centos 7 默认的防火墙是 firewall,安装iptables之前需关闭Firewall 外网机器:外网ip:120.25.71.183内网ip:10.1.1.23 内网机器:内网ip ...
- java线程方面的知识
java中单继承,多实现的: 若为多继承,那么当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清,因此用了单继承. 为什么是多实现呢? 通过实现接口拓展了类的功能,若实现的多个接口中有重复的 ...
- 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解
源: 线性代数的本质 内容来自字幕. Let me quote without further comment from Dieudonné's "Foundations of Modern ...
- 刷新DNS解析缓存
为了提高网站的访问速度,系统会在成功访问某网站后将该网站的域名.IP地址信息缓存到本地.下次访问该域名时直接通过IP进行访问. 一些网站的域名没有变化,但IP地址发生变化,有可能因本地的DNS缓存没有 ...
- 软件测试技术作业3---PrintPrimes()
一.代码部分: private static void printPrimes (int n) { int curPrime; // Value currently considered for pr ...
- mysql创建账号
1.创建账号1)只读账号GRANT USAGE ON *.* TO 'testgao_r'@'192.168.1.1' IDENTIFIED BY 'password' WITH MAX_QUERIE ...