flink基础之window
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的更多相关文章
- Flink资料(1)-- Flink基础概念(Basic Concept)
Flink基础概念 本文描述Flink的基础概念,翻译自https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/con ...
- Flink基础:时间和水印
往期推荐: Flink基础:入门介绍 Flink基础:DataStream API Flink基础:实时处理管道与ETL Flink深入浅出:资源管理 Flink深入浅出:部署模式 Flink深入 ...
- Flink入门-第一篇:Flink基础概念以及竞品对比
Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...
- Flink中的window、watermark和ProcessFunction
一.Flink中的window 1,window简述 window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...
- Flink基础:实时处理管道与ETL
往期推荐: Flink基础:入门介绍 Flink基础:DataStream API Flink深入浅出:资源管理 Flink深入浅出:部署模式 Flink深入浅出:内存模型 Flink深入浅出:J ...
- flink中对于window和watermark的一些理解
package com.chenxiang.flink.demo; import java.io.IOException; import java.net.ServerSocket; import j ...
- flink基础篇
Flink面试--核心概念和基础考察 1.简单介绍一下 Flink 2.Flink 相比传统的 Spark Streaming 有什么区别? 3.Flink 的组件栈有哪些? 面试知识 ...
- 彻底搞清Flink中的Window
窗口 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理.当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的 ...
- 1. flink 基础
flink word count 程序 1. 数据集模式 pom.xml 文件 <?xml version="1.0" encoding="UTF-8" ...
- Python3 tkinter基础 Text window 文本框中插入按钮
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
随机推荐
- Nginx 配置 HTTPS 完整过程
配置站点使用 https,并且将 http 重定向至 https. 1. nginx 的 ssl 模块安装 查看 nginx 是否安装 http_ssl_module 模块. $ /usr/local ...
- 在 Hugging Face Spaces 上使用 Gradio 免费运行 ComfyUI 工作流
简介 在本教程中,我将逐步指导如何将一个复杂的 ComfyUI 工作流转换为一个简单的 Gradio 应用程序,并讲解如何将其部署在 Hugging Face Spaces 的 ZeroGPU 无服务 ...
- 【Win32】VC6 Visual C/C++ 6.0 修改程序图标
零.需求 就想给自己的C程序加个图标,好看些 一.解决 1.操作步骤 1.新建一个资源脚本 2.在新建的脚本上右键,选择插入 3.选择Icon,点新建或者引入,如果你没有准备图标点新建,有的话直接点引 ...
- leetcode每日一题:对角线上的质数
题目 2614. 对角线上的质数 给你一个下标从 0 开始的二维整数数组 nums . 返回位于 nums 至少一条 对角线 上的最大 质数 .如果任一对角线上均不存在质数,返回 0 . 注意: 如果 ...
- AIops
How does AIOps work?With AIOps, your organization takes a more proactive approach to resolve IT oper ...
- Python科学计算系列4—函数和数列极限
1.数列极限 例1:求下列数列的极限 代码如下: from sympy import * n, k = symbols('n k') f1 = limit(n / (factorial(n) ** ( ...
- Robot Framework绝对路径转相对路径
如上图,添加商品需要上传商品图片,如此,设计脚本时候会填入图片的路径,使自动化能够自动到目的路径内获取图片上传 C:\\Users\\Beckham\\Desktop\\test2\\autoTest ...
- 再谈kettle两种循环之--调用http分页接口循环获取数据
再谈kettle两种循环之 – 调用http分页接口循环获取数据 1.场景介绍: 由于数据量比较大,接口有返回限制,需要用到循环分页获取数据 2.案例适用范围: 循环job可参考,变量运用可参考,调用 ...
- Asp.net core 少走弯路系列教程(一)了解 W3C
前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...
- 通用型产品发布解决方案(SpringBoot+SpringCloud+Spring CloudAlibaba+Vue+ElementUI+MyBatis-Plus+MySQL+Git+Maven)03
通用型产品发布解决方案(基于分布式微服务技术栈:SpringBoot+SpringCloud+Spring CloudAlibaba+Vue+ElementUI+MyBatis-Plus+MySQL+ ...