一、window滑动窗口

1、概述

  1. Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,
  2. 会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,
  3. 3秒内的3RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口计算。所以每个滑动窗口操作,都必须指定
  4. 两个参数,窗口长度以及滑动间隔,而且这两个参数值都必须是batch间隔的整数倍。(Spark Streaming对滑动窗口的支持,是比Storm更加完善和强大的)

2、window滑动窗口操作

案例:热点搜索词滑动统计,每隔10秒钟,统计最近60秒钟的搜索词的搜索频次,并打印出排名最靠前的3个搜索词以及出现次数

2、java案例

  1. package cn.spark.study.streaming;
  2.  
  3. import java.util.List;
  4.  
  5. import org.apache.spark.SparkConf;
  6. import org.apache.spark.api.java.JavaPairRDD;
  7. import org.apache.spark.api.java.function.Function;
  8. import org.apache.spark.api.java.function.Function2;
  9. import org.apache.spark.api.java.function.PairFunction;
  10. import org.apache.spark.streaming.Durations;
  11. import org.apache.spark.streaming.api.java.JavaDStream;
  12. import org.apache.spark.streaming.api.java.JavaPairDStream;
  13. import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
  14. import org.apache.spark.streaming.api.java.JavaStreamingContext;
  15.  
  16. import scala.Tuple2;
  17.  
  18. /**
  19. * 基于滑动窗口的热点搜索词实时统计
  20. * @author Administrator
  21. *
  22. */
  23. public class WindowHotWord {
  24.  
  25. public static void main(String[] args) {
  26. SparkConf conf = new SparkConf()
  27. .setMaster("local[2]")
  28. .setAppName("WindowHotWord");
  29. JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1));
  30.  
  31. // 说明一下,这里的搜索日志的格式
  32. // leo hello
  33. // tom world
  34. JavaReceiverInputDStream<String> searchLogsDStream = jssc.socketTextStream("spark1", 9999);
  35.  
  36. // 将搜索日志给转换成,只有一个搜索词,即可
  37. JavaDStream<String> searchWordsDStream = searchLogsDStream.map(new Function<String, String>() {
  38.  
  39. private static final long serialVersionUID = 1L;
  40.  
  41. @Override
  42. public String call(String searchLog) throws Exception {
  43. return searchLog.split(" ")[1];
  44. }
  45.  
  46. });
  47.  
  48. // 将搜索词映射为(searchWord, 1)的tuple格式
  49. JavaPairDStream<String, Integer> searchWordPairDStream = searchWordsDStream.mapToPair(
  50.  
  51. new PairFunction<String, String, Integer>() {
  52.  
  53. private static final long serialVersionUID = 1L;
  54.  
  55. @Override
  56. public Tuple2<String, Integer> call(String searchWord)
  57. throws Exception {
  58. return new Tuple2<String, Integer>(searchWord, 1);
  59. }
  60.  
  61. });
  62.  
  63. // 针对(searchWord, 1)的tuple格式的DStream,执行reduceByKeyAndWindow,滑动窗口操作
  64. // 第二个参数,是窗口长度,这里是60秒
  65. // 第三个参数,是滑动间隔,这里是10秒
  66. // 也就是说,每隔10秒钟,将最近60秒的数据,作为一个窗口,进行内部的RDD的聚合,然后统一对一个RDD进行后续
  67. // 计算
  68. // 所以说,这里的意思,就是,之前的searchWordPairDStream为止,其实,都是不会立即进行计算的
  69. // 而是只是放在那里
  70. // 然后,等待我们的滑动间隔到了以后,10秒钟到了,会将之前60秒的RDD,因为一个batch间隔是,5秒,所以之前
  71. // 60秒,就有12个RDD,给聚合起来,然后,统一执行redcueByKey操作
  72. // 所以这里的reduceByKeyAndWindow,是针对每个窗口执行计算的,而不是针对某个DStream中的RDD
  73. JavaPairDStream<String, Integer> searchWordCountsDStream =
  74. //Function2<T1, T2, R>:一个双参数函数,它接受类型为T1和T2的参数并返回一个R
  75. searchWordPairDStream.reduceByKeyAndWindow(new Function2<Integer, Integer, Integer>() {
  76.  
  77. private static final long serialVersionUID = 1L;
  78.  
  79. @Override
  80. public Integer call(Integer v1, Integer v2) throws Exception {
  81. return v1 + v2;
  82. }
  83.  
  84. }, Durations.seconds(60), Durations.seconds(10));
  85.  
  86. // 到这里为止,就已经可以做到,每隔10秒钟,出来,之前60秒的收集到的单词的统计次数
  87. // 执行transform操作,因为,一个窗口,就是一个60秒钟的数据,会变成一个RDD,然后,对这一个RDD
  88. // 根据每个搜索词出现的频率进行排序,然后获取排名前3的热点搜索词
  89. JavaPairDStream<String, Integer> finalDStream = searchWordCountsDStream.transformToPair(
  90.  
  91. new Function<JavaPairRDD<String,Integer>, JavaPairRDD<String,Integer>>() {
  92.  
  93. private static final long serialVersionUID = 1L;
  94.  
  95. @Override
  96. public JavaPairRDD<String, Integer> call(
  97. JavaPairRDD<String, Integer> searchWordCountsRDD) throws Exception {
  98. // 执行搜索词和出现频率的反转
  99. JavaPairRDD<Integer, String> countSearchWordsRDD = searchWordCountsRDD
  100. .mapToPair(new PairFunction<Tuple2<String,Integer>, Integer, String>() {
  101.  
  102. private static final long serialVersionUID = 1L;
  103.  
  104. @Override
  105. public Tuple2<Integer, String> call(
  106. Tuple2<String, Integer> tuple)
  107. throws Exception {
  108. return new Tuple2<Integer, String>(tuple._2, tuple._1);
  109. }
  110. });
  111.  
  112. // 然后执行降序排序
  113. JavaPairRDD<Integer, String> sortedCountSearchWordsRDD = countSearchWordsRDD
  114. .sortByKey(false);
  115.  
  116. // 然后再次执行反转,变成(searchWord, count)的这种格式
  117. JavaPairRDD<String, Integer> sortedSearchWordCountsRDD = sortedCountSearchWordsRDD
  118. .mapToPair(new PairFunction<Tuple2<Integer,String>, String, Integer>() {
  119.  
  120. private static final long serialVersionUID = 1L;
  121.  
  122. @Override
  123. public Tuple2<String, Integer> call(
  124. Tuple2<Integer, String> tuple)
  125. throws Exception {
  126. return new Tuple2<String, Integer>(tuple._2, tuple._1);
  127. }
  128.  
  129. });
  130.  
  131. // 然后用take(),获取排名前3的热点搜索词
  132. List<Tuple2<String, Integer>> hogSearchWordCounts =
  133. sortedSearchWordCountsRDD.take(3);
  134. for(Tuple2<String, Integer> wordCount : hogSearchWordCounts) {
  135. System.out.println(wordCount._1 + ": " + wordCount._2);
  136. }
  137.  
  138. return searchWordCountsRDD;
  139. }
  140.  
  141. });
  142.  
  143. // 这个无关紧要,只是为了触发job的执行,所以必须有output操作
  144. finalDStream.print();
  145.  
  146. jssc.start();
  147. jssc.awaitTermination();
  148. jssc.close();
  149. }
  150.  
  151. }
  152.  
  153. ##在eclipse中启动程序
  154.  
  155. ##服务器上启动nc,并输入内容
  156. [root@spark1 ~]# nc -lk 9999
  157. leo hello
  158. tom word
  159. leo hello
  160. jack you
  161. leo you
  162.  
  163. ##统计结果
  164. (hello,2)
  165. (word,1)
  166. (you,2)

3、scala案例

  1. package cn.spark.study.streaming
  2.  
  3. import org.apache.spark.SparkConf
  4. import org.apache.spark.streaming.StreamingContext
  5. import org.apache.spark.streaming.Seconds
  6.  
  7. /**
  8. * @author Administrator
  9. */
  10. object WindowHotWord {
  11.  
  12. def main(args: Array[String]): Unit = {
  13. val conf = new SparkConf()
  14. .setMaster("local[2]")
  15. .setAppName("WindowHotWord")
  16. val ssc = new StreamingContext(conf, Seconds(1))
  17.  
  18. val searchLogsDStream = ssc.socketTextStream("spark1", 9999)
  19. val searchWordsDStream = searchLogsDStream.map { _.split(" ")(1) }
  20. val searchWordPairsDStream = searchWordsDStream.map { searchWord => (searchWord, 1) }
  21. val searchWordCountsDSteram = searchWordPairsDStream.reduceByKeyAndWindow(
  22. (v1: Int, v2: Int) => v1 + v2,
  23. Seconds(60),
  24. Seconds(10))
  25.  
  26. val finalDStream = searchWordCountsDSteram.transform(searchWordCountsRDD => {
  27. val countSearchWordsRDD = searchWordCountsRDD.map(tuple => (tuple._2, tuple._1))
  28. val sortedCountSearchWordsRDD = countSearchWordsRDD.sortByKey(false)
  29. val sortedSearchWordCountsRDD = sortedCountSearchWordsRDD.map(tuple => (tuple._1, tuple._2))
  30.  
  31. val top3SearchWordCounts = sortedSearchWordCountsRDD.take(3)
  32. for(tuple <- top3SearchWordCounts) {
  33. println(tuple)
  34. }
  35.  
  36. searchWordCountsRDD
  37. })
  38.  
  39. finalDStream.print()
  40.  
  41. ssc.start()
  42. ssc.awaitTermination()
  43. }
  44.  
  45. }
  46.  
  47. ##在eclipse中启动程序
  48.  
  49. ##服务器上启动nc,并输入内容
  50. [root@spark1 ~]# nc -lk 9999
  51. leo hello
  52. leo hello
  53. leo hello
  54. leo word
  55. leo word
  56. leo word
  57. leo hello
  58. leo you
  59. leo you
  60.  
  61. ##统计结果
  62. (hello,4)
  63. (word,3)
  64. (you,2)

57、Spark Streaming: window滑动窗口以及热点搜索词滑动统计案例的更多相关文章

  1. 48、Spark SQL之与Spark Core整合之每日top3热点搜索词统计案例实战

    一.概述 1.需求分析 数据格式: 日期 用户 搜索词 城市 平台 版本 需求: 1.筛选出符合查询条件(城市.平台.版本)的数据 2.统计出每天搜索uv排名前3的搜索词 3.按照每天的top3搜索词 ...

  2. Spark Streaming实战

    1.Storm 和 SparkStreaming区别 Storm                      纯实时的流式处理,来一条数据就立即进行处理 SparkStreaming 微批处理,每次处理 ...

  3. Spark Streaming之五:Window窗体相关操作

    SparkStreaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被聚 ...

  4. Spark-Streaming之window滑动窗口应用

    Spark-Streaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被 ...

  5. spark streaming (二)

    一.基础核心概念 1.StreamingContext详解 (一) 有两种创建StreamingContext的方式:             val conf = new SparkConf().s ...

  6. Spark Streaming初探

    1.  介绍 Spark Streaming是Spark生态系统中一个重要的框架,建立在Spark Core之上,与Spark SQL.GraphX.MLib相并列. Spark Streaming是 ...

  7. Spark 学习笔记之 Streaming Window

    Streaming Window: 上图意思:每隔2秒统计前3秒的数据 slideDuration: 2 windowDuration: 3 例子: import org.apache.kafka.c ...

  8. Spark Streaming流式处理

    Spark Streaming介绍 Spark Streaming概述 Spark Streaming makes it easy to build scalable fault-tolerant s ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十二)Spark Streaming接收流数据及使用窗口函数

    官网文档:<http://spark.apache.org/docs/latest/streaming-programming-guide.html#a-quick-example> Sp ...

随机推荐

  1. XML和Json的特点

    Xml特点: 1.有且只有一个根节点: 2.数据传输的载体 3.所有的标签都需要自定义 4.是纯文本文件 Json(JavaScript Object Notation)特点: json分为两种格式: ...

  2. C#设计模式之12:中介者模式

    中介者模式 在asp.net core中实现进程内的CQRS时用mediatR是非常方便的,定义command,然后定义commandhandler,或者notification和notificati ...

  3. 七牛云图床存储+Alfread工作流+使用QSHELL

    layout: post title: 七牛云图床存储+Alfread工作流+使用QSHELL 来源:http://www.cnblogs.com/cmi-sh-love/p/8901620.html ...

  4. 2019 携程旅行网java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.蚂蚁金服等公司offer,岗位是Java后端开发,因为发展原因最终选择去了携程,入职一年时间了,也成为了面试官 ...

  5. spring中bean的作用域属性singleton与prototype的区别

    1.singleton 当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会 ...

  6. 【转载】C#中List集合中Last和LastOrDefault方法的差别

    在C#的List集合操作中,Last方法和LastOrDefault方法都会用来查找集合中最后一个符合条件的元素对象,但Last和LastOrDefault方法还是有差别的,建议使用LastOrDef ...

  7. vue 利用v-model实现父子组件数据双向绑定

    v-model父组件写法: v-model子组件写法: 子组件export default中的model:{}里面两个值,prop代表着我要和props的那个变量相对应,event表示着事件,我触发事 ...

  8. 【前端】将前台table数据导出excel表格

    1.首先引用jquery以及table2excel <script type="text/javascript" src="js/jquery.table2exce ...

  9. js中console.info的使用

    语法:console.info(obj1 [, obj2, ..., objN]);console.info(msg [, subst1, ..., substN]); 参数obj1 ... objN ...

  10. Caffeine用法

    Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava.如果出现Caffeine,CaffeineCacheManager将会自动配置.使用sp ...