flink会把数据分成不同的窗口,然后进行汇总和统计。

  flink的窗口分为timeWindow, countWindow, sessionWindow, gapWindow。

  timeWindow分为基于时间的滚动窗口和滑动窗口。

  举个例子,统计每60秒的访问量需要的就是滚动窗口;每5分钟统计一次一个小时内的访问量或者获取访问前几的top值,这个时候就需要用到滑动窗口了。

  如果还不明白,看下面的图,图片来源flink官网的blog里。有一个传感器一直录入值,然后需要统计每个窗口里边的汇总值,效果就是这个样子。

  再来看一下滑动窗口的图,假如sensor给到的是15秒钟汽车穿过马路的数量,现在需要每30秒统计1分钟的穿过马路的数量。第一次 9+6+8+4 = 22, 然后往右边滑两个数,8+4+7+3=22, 然后再往右边滑两个数,依此类推。

  这里边需要注意的是,窗口的大小和滑动大小。分为三种情况:

  1. 窗口的大小=滑动的大小,那么效果和滚动窗口是一样的。

  2. 窗口的大小>滑动的大小,数据就会被重复计算,上边举的这样例子就是这样的。

  3. 窗口的大小<滑动的大小,那么统计的时候会出现丢数据。

  countWindow也分为滑动计数窗口,滚动计数窗口,也就是这个窗口达到了指定个数后即触发统计计算,滑动窗口比如countWindow(5,2),说明只要有2个数据到达后就可以往后统计5个数据的值。

  sessionWindow就是多久的session为一个窗口,假如设置的sessionWindow位5秒,那么5秒钟时间内只要有数据这个窗口就会一直存在,5秒钟之内没有任何数据,那么这个就触发一个窗口进行统计汇总。

  好了,咱们来用代码看一下,我把所有代码放到一个代码中。如下:

package flink;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector; public class SocketWindowCount { public static void main(String[] args) throws Exception{ //创建env
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); //监听本地的9000端口
DataStream<String> text = env.socketTextStream("localhost", 9000, "\n"); //将输入的单词进行解析和收集
DataStream<WordCount> wordCountStream = text.flatMap(new FlatMapFunction<String, WordCount>() {
@Override
public void flatMap(String value, Collector<WordCount> out) throws Exception {
for(String word : value.split("\\s")) {
out.collect(WordCount.of(word, 1L));
}
}
}); //timeWindow 滚动窗口 将收集的单词进行分组和计数
DataStream<WordCount> windowsCounts = wordCountStream.
keyBy("word").
timeWindow(Time.seconds(5)).
sum("count"); //timeWindow 滑动窗口 将收集的单词进行分组和计数
// DataStream<WordCount> windowsCounts = wordCountStream.
// keyBy("word").
// timeWindow(Time.seconds(10), Time.seconds(2)).
// sum("count"); //countWindow 滚动窗口
// DataStream<WordCount> windowsCounts = wordCountStream.
// keyBy("word").
// countWindow(2).
// sum("count"); //countWindow 滚动窗口
// DataStream<WordCount> windowsCounts = wordCountStream.
// keyBy("word").
// countWindow(5L, 2L).
// sum("count"); //sessionWindow 窗口
// DataStream<WordCount> windowsCounts = wordCountStream.
// keyBy("word").
// window(ProcessingTimeSessionWindows.withGap(Time.seconds(5))).
// sum("count"); //打印时采用单线程打印
windowsCounts.print().setParallelism(1); //提交所设置的执行
env.execute("Socket Window WordCount"); } public static class WordCount { public String word;
public Long count; public static WordCount of(String word, Long count) {
WordCount wordCount = new WordCount();
wordCount.word = word;
wordCount.count = count;
return wordCount;
} @Override
public String toString() {
return "word:" + word + " count:" + count;
}
} }

  里边几种场景都涉及到了,下面只运行第一种情况。在电脑里边输入命令:nc -lk 9000,这个工具就是创建9000的socket服务,并且可以往里边输入数据。

  运行本地程序,第一个例子用timeWindow进行滚动窗口统计每五秒的单词数量。

  前五秒的时候输入  hello world hello, 然后又输入了 hello this, 如下图:

  输出的结果如下:

  这样就统计出来了,你是否get到了?有问题欢迎指正。

flink基础之window的更多相关文章

  1. Flink资料(1)-- Flink基础概念(Basic Concept)

    Flink基础概念 本文描述Flink的基础概念,翻译自https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/con ...

  2. Flink基础:时间和水印

    ​ 往期推荐: Flink基础:入门介绍 Flink基础:DataStream API Flink基础:实时处理管道与ETL Flink深入浅出:资源管理 Flink深入浅出:部署模式 Flink深入 ...

  3. Flink入门-第一篇:Flink基础概念以及竞品对比

    Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...

  4. Flink中的window、watermark和ProcessFunction

    一.Flink中的window 1,window简述  window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...

  5. Flink基础:实时处理管道与ETL

    ​ 往期推荐: Flink基础:入门介绍 Flink基础:DataStream API Flink深入浅出:资源管理 Flink深入浅出:部署模式 Flink深入浅出:内存模型 Flink深入浅出:J ...

  6. flink中对于window和watermark的一些理解

    package com.chenxiang.flink.demo; import java.io.IOException; import java.net.ServerSocket; import j ...

  7. flink基础篇

    Flink面试--核心概念和基础考察 1.简单介绍一下 Flink 2.Flink 相比传统的 Spark Streaming 有什么区别? 3.Flink 的组件栈有哪些?         面试知识 ...

  8. 彻底搞清Flink中的Window

    窗口 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理.当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的 ...

  9. 1. flink 基础

    flink word count  程序 1. 数据集模式 pom.xml 文件 <?xml version="1.0" encoding="UTF-8" ...

  10. Python3 tkinter基础 Text window 文本框中插入按钮

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

随机推荐

  1. RAFT光流估计

    RAFT Introduction RAFT: Recurrent All-Pairs Field Transforms for Optical Flow:观其名便知道这是一篇关于光流估计的论文. 模 ...

  2. 【Java】关键字的使用

    java中有很多的关键字,他们的使用让Java语言变得更加灵活.易用,下面将介绍Java中最常用的几个关键字并说明其用法. 一.关键字:return--跳出 使用在方法体中,用于:① 结束方法② 针对 ...

  3. 高格发票勾稽之BUG

    select (INVNO) AS INVCODE, SDATE ,* FROM STKSALE1 WHERE LEN(INVSCODE) > 0 AND INVSCODE = '3100000 ...

  4. PandasAI:当数据分析遇上自然语言处理

    数据科学的新范式 在数据爆炸的时代,传统的数据分析工具正面临着前所未有的挑战.数据科学家们常常需要花费70%的时间在数据清洗和探索上,而真正的价值创造时间却被大幅压缩.PandasAI的出现,正在改变 ...

  5. Caddy一个强大的web服务器和代理服务器

    什么是Caddy Caddy是一个强大的.可扩展的平台,可以为您的站点.服务和应用程序提供服务,它是用Go编写的.虽然大多数人使用它作为web服务器或代理,但其实他支持更多的功能: Caddy是唯一自 ...

  6. 使用open-feign进行远程服务调用

    想要远程调用别的服务 1).引入open-feign包 2).编写一个接口,告诉SpringCloud这个接口是调用哪个远程的服务 a.声明接口的每一个方法都是调用哪个远程服务的那个请求 3).开启远 ...

  7. DPDI(Dispatch PDI)kettle调度管理平台介绍

    DPDI online产品简介 DPDI Online 是一款基于Kettle的强大在线任务调度平台,凭借其高效与灵活性,专为调度和监控Kettle客户端生成的ETL任务而设计 DPDI Online ...

  8. Tortoise-ORM与FastAPI集成:异步模型定义与实践

    title: Tortoise-ORM与FastAPI集成:异步模型定义与实践 date: 2025/04/20 11:38:23 updated: 2025/04/20 11:38:23 autho ...

  9. xshell远程连接出现WARNING! The remote SSH server rejected X11 forwarding request.

    解决办法: 编辑sshd配置文件 vi /etc/ssh/sshd_config 设置 X11Forwarding yes UserLogin no //原本的注释解开 yum install -y ...

  10. linux期末考试题(2)

    linux期末考试题 一.选择题(共30分,每小题2分) 1.以下关于自由软件的说法,正确的是(D) A.自由软件是一种有版权保护的软件 B.修改自由软件应取得原作者的许可 C.微软的 Ofice 软 ...