window是处理数据的核心。按需选择你需要的窗口类型后,它会将传入的原始数据流切分成多个buckets,所有计算都在window中进行。

flink本身提供的实例程序TopSpeedWindowing.java

  1. import org.apache.flink.api.common.functions.RichMapFunction;
  2. import org.apache.flink.api.java.tuple.Tuple4;
  3. import org.apache.flink.api.java.utils.ParameterTool;
  4. import org.apache.flink.streaming.api.TimeCharacteristic;
  5. import org.apache.flink.streaming.api.datastream.DataStream;
  6. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  7. import org.apache.flink.streaming.api.functions.source.SourceFunction;
  8. import org.apache.flink.streaming.api.functions.timestamps.AscendingTimestampExtractor;
  9. import org.apache.flink.streaming.api.functions.windowing.delta.DeltaFunction;
  10. import org.apache.flink.streaming.api.windowing.assigners.GlobalWindows;
  11. import org.apache.flink.streaming.api.windowing.evictors.TimeEvictor;
  12. import org.apache.flink.streaming.api.windowing.time.Time;
  13. import org.apache.flink.streaming.api.windowing.triggers.DeltaTrigger;
  14.  
  15. import java.util.Arrays;
  16. import java.util.Random;
  17. import java.util.concurrent.TimeUnit;
  18.  
  19. /**
  20. * An example of grouped stream windowing where different eviction and trigger
  21. * policies can be used. A source fetches events from cars every 100 msec
  22. * containing their id, their current speed (kmh), overall elapsed distance (m)
  23. * and a timestamp. The streaming example triggers the top speed of each car
  24. * every x meters elapsed for the last y seconds.
  25. */
  26. public class TopSpeedWindowing {
  27.  
  28. // *************************************************************************
  29. // PROGRAM
  30. // *************************************************************************
  31.  
  32. public static void main(String[] args) throws Exception {
  33.  
  34. final ParameterTool params = ParameterTool.fromArgs(args);
  35.  
  36. final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  37. env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
  38. env.getConfig().setGlobalJobParameters(params);
  39.  
  40. @SuppressWarnings({"rawtypes", "serial"})
  41. DataStream<Tuple4<Integer, Integer, Double, Long>> carData;
  42. if (params.has("input")) {
  43. carData = env.readTextFile(params.get("input")).map(new ParseCarData());
  44. } else {
  45. System.out.println("Executing TopSpeedWindowing example with default input data set.");
  46. System.out.println("Use --input to specify file input.");
  47. carData = env.addSource(CarSource.create(2));
  48. }
  49.  
  50. int evictionSec = 10;
  51. double triggerMeters = 50;
  52. DataStream<Tuple4<Integer, Integer, Double, Long>> topSpeeds = carData
  53. .assignTimestampsAndWatermarks(new CarTimestamp()) //1
  54. .keyBy(0)
  55. .window(GlobalWindows.create()) //2
  56. .evictor(TimeEvictor.of(Time.of(evictionSec, TimeUnit.SECONDS))) //3
  57. .trigger(DeltaTrigger.of(triggerMeters,
  58. new DeltaFunction<Tuple4<Integer, Integer, Double, Long>>() {//4
  59. private static final long serialVersionUID = 1L;
  60.  
  61. @Override
  62. public double getDelta(
  63. Tuple4<Integer, Integer, Double, Long> oldDataPoint,
  64. Tuple4<Integer, Integer, Double, Long> newDataPoint) {
  65. return newDataPoint.f2 - oldDataPoint.f2;
  66. }
  67. }, carData.getType().createSerializer(env.getConfig())))//4
  68. .maxBy(1);
  69.  
  70. if (params.has("output")) {
  71. topSpeeds.writeAsText(params.get("output"));
  72. } else {
  73. System.out.println("Printing result to stdout. Use --output to specify output path.");
  74. topSpeeds.print();
  75. }
  76.  
  77. env.execute("CarTopSpeedWindowingExample");
  78. }
  79.  
  80. // *************************************************************************
  81. // USER FUNCTIONS
  82. // *************************************************************************
  83.  
  84. private static class CarSource implements SourceFunction<Tuple4<Integer, Integer, Double, Long>> {
  85.  
  86. private static final long serialVersionUID = 1L;
  87. private Integer[] speeds;
  88. private Double[] distances;
  89.  
  90. private Random rand = new Random();
  91.  
  92. private volatile boolean isRunning = true;
  93.  
  94. private CarSource(int numOfCars) {
  95. speeds = new Integer[numOfCars];
  96. distances = new Double[numOfCars];
  97. Arrays.fill(speeds, 50);
  98. Arrays.fill(distances, 0d);
  99. }
  100.  
  101. public static CarSource create(int cars) {
  102. return new CarSource(cars);
  103. }
  104.  
  105. @Override
  106. public void run(SourceContext<Tuple4<Integer, Integer, Double, Long>> ctx) throws Exception {
  107.  
  108. while (isRunning) {
  109. Thread.sleep(100);
  110. for (int carId = 0; carId < speeds.length; carId++) {
  111. if (rand.nextBoolean()) {
  112. speeds[carId] = Math.min(100, speeds[carId] + 5);
  113. } else {
  114. speeds[carId] = Math.max(0, speeds[carId] - 5);
  115. }
  116. distances[carId] += speeds[carId] / 3.6d;
  117. Tuple4<Integer, Integer, Double, Long> record = new Tuple4<>(carId,
  118. speeds[carId], distances[carId], System.currentTimeMillis());
  119. ctx.collect(record);
  120. }
  121. }
  122. }
  123.  
  124. @Override
  125. public void cancel() {
  126. isRunning = false;
  127. }
  128. }
  129.  
  130. private static class ParseCarData extends RichMapFunction<String, Tuple4<Integer, Integer, Double, Long>> {
  131. private static final long serialVersionUID = 1L;
  132.  
  133. @Override
  134. public Tuple4<Integer, Integer, Double, Long> map(String record) {
  135. String rawData = record.substring(1, record.length() - 1);
  136. String[] data = rawData.split(",");
  137. return new Tuple4<>(Integer.valueOf(data[0]), Integer.valueOf(data[1]), Double.valueOf(data[2]), Long.valueOf(data[3]));
  138. }
  139. }
  140.  
  141. private static class CarTimestamp extends AscendingTimestampExtractor<Tuple4<Integer, Integer, Double, Long>> {
  142. private static final long serialVersionUID = 1L;
  143.  
  144. @Override
  145. public long extractAscendingTimestamp(Tuple4<Integer, Integer, Double, Long> element) {
  146. return element.f3;
  147. }
  148. }
  149.  
  150. }

其中,

1. 定义时间戳,上篇文章<flink中的时间戳如何使用?---Watermark使用及原理>上进行了介绍,本篇不做赘述。

2.窗口类型,Windows Assigner定义如何将数据流分配到一个或者多个窗口;其层次结构如下:

evictor:用于数据剔除,其层次结构如下:

3. trigger:窗口触发器,其层次结构如下:

4. Window function定义窗口内数据的计算逻辑,其层次结构如下:

参考资料

【1】https://www.jianshu.com/p/5302b48ca19b

flink window实例分析的更多相关文章

  1. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  2. 一些有用的javascript实例分析(三)

    原文:一些有用的javascript实例分析(三) 10 输入两个数字,比较大小 window.onload = function () { var aInput = document.getElem ...

  3. 一些有用的javascript实例分析(一)

    原文:一些有用的javascript实例分析(一) 本文以http://fgm.cc/learn/链接的实例索引为基础,可参见其实际效果.分析和整理了一些有用的javascript实例,相信对一些初学 ...

  4. 一些有用的javascript实例分析(二)

    原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...

  5. Camera图像处理原理及实例分析

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  6. Watchdog问题实例分析

    1.日志获取 Watchdog相关的问题甚至需要以下所有的日志: logcat 通过adb logcat命令输出Android的一些当前运行日志,可以通过logcat的 -b 参数指定要输出的日志缓冲 ...

  7. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  8. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

  9. (转)实例分析:MySQL优化经验

    [IT专家网独家]同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力,严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月.MySQL使用是很具伸缩性的算法,因此你通 ...

随机推荐

  1. 【Android】解决微信调起支付接口没反应,调不起来微信的问题

    原文:[Android]解决微信调起支付接口没反应,调不起来微信的问题 //#前言 吐槽一下,微信支付的sdk真难用,文档混乱,坑不少. 正文:可能引起这种情况的问题 1. 最不能出现的 你的APPI ...

  2. WPF 创建无边框的圆角窗口

    原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为Tru ...

  3. 如何在XAML中转义大括号

    原文:如何在XAML中转义大括号 如何在XAML中转义大括号                                       周银辉 我们知道大括号"{}"在XAML中 ...

  4. QML中实现setTimeout和setInterval

    Qt的QML中,js未提供setTimeout和setInterval,可以通过下面的代码实现. Timer {id: timer} function setTimeout(cb,delayTime) ...

  5. 8086 CPU 寄存器简介(超详细,图文并茂)

    http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html

  6. VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测(超详细截图)

    http://www.cnblogs.com/yipu/p/3611611.html http://bbs.feng.com/read-htm-tid-7625465.html OS X Maveri ...

  7. Java虚拟机性能监控与调优实战

    From:  https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...

  8. 移动端数据爬取和Scrapy框架

    移动端数据爬取 注:抓包工具:青花瓷 1.配置fiddler 2.移动端安装fiddler证书 3.配置手机的网络 - 给手机设置一个代理IP:port a. Fiddler设置 打开Fiddler软 ...

  9. .NET中扩展方法和Enumerable(System.Linq)

    LINQ是我最喜欢的功能之一,程序中到处是data.Where(x=x>5).Select(x)等等的代码,她使代码看起来更好,更容易编写,使用起来也超级方便,foreach使循环更加容易,而不 ...

  10. You can't specify target table 'tbl_students' for update in FROM clause错误

    此问题只出现在mysql中 oracle中无此问题 在同一语句中,当你在select某表的数据后,不能update这个表,如: DELETE FROM tbl_students WHERE id NO ...