首页 > 其他分享 >聊聊Flink的必知必会(三)

聊聊Flink的必知必会(三)

时间:2023-06-16 18:25:31浏览次数:47  
标签:Flink 窗口 Stream 必知 元素 Keyed 聊聊 如下

概述

在进行流处理时,很多时候想要对流的有界子集进行聚合分析。例如有如下的需求场景:
(1)每分钟的页面浏览(PV)次数。

(2)每用户每周的会话次数。

(3)每分钟每传感器的最高温度。

(4)当电商发布一个秒杀活动时,想要每隔10min了解流量数据。

对于这些需求的处理,程序需要处理元素组,而不是单个元素,因此,通常使用窗口来限定在数据流上的聚合(如count、sum等)的范围,例如"过去5min内的计数"或"最后100个元素的总和",所以在处理流数据时,通常更有意义的是考虑有限窗口上的聚合,而不是整个流。

在阿里的限流框架Sentinel中,关键的资源数据统计算法也是基于窗口的概念来做的。

窗口(window)是处理无限流的核心,使用窗口计算无界流上的聚合。窗口将流分割为有限大小的组,用户可以对这样的组进行计算。窗口可以是由时间驱动的(例如,每30s),也可以是由数据驱动的(例如,每100个元素)。如下所示

image

Flink流窗口

通俗点来说,窗口(window)可以将无界流分成有限大小的「桶」,我们基于这个「桶」之上,可以构建各种各样的计算。而无界流的拆分方式可以按时间、或者事件的数量,我们可以根据业务场景来定义窗口的大小。

如何对定义创建流窗口?Flink支持不同类型的窗口,分别介绍如下。

(1)滚动窗口:Tumbling Window,是在流中创建不重叠的相邻窗口。它们是固定长度的窗口,没有重叠。可以根据时间对元素进行分组(例如,从10:00到10:05的所有元素进入一个组),或者根据计数(前50个元素进入一个单独的组)对元素进行分组。例如,可以用它来回答这样的问题:“在不重叠的5min间隔内计算流中元素的数量”。

(2)滑动窗口:Sliding Window,类似于滚动窗口,但是窗口可以重叠。滑动窗口是固定长度的窗口,通过用户给定的窗口滑动参数与前面的窗口重叠。例如,如果需要计算最后5min的指标,但希望每分钟显示一个输出时。

(3)会话窗口:Session Window,当对发生的事件进行分组时,将时间接近的分到一组(一个窗口中)。还可以提供会话间隔的配置参数,该参数指示在关闭会话之前需要等待多长时间。

(4)全局窗口:Global Window,Flink将所有元素放到一个窗口中。通常在这种情况下,每个元素都被分配给一个单一的per-key全局窗口(Global Window)。如果不指定任何触发器,就不会触发任何计算。这只有在定义自定义触发器时才有用,该触发器定义了窗口何时结束。

这几种窗口类型表示,可按如下图表示

image

窗口分配器

窗口分配器用于定义如何将元素分配给窗口。这是通过在调用window()(针对Keyed Stream)或windowAll()(针对non-keyed stream)时指定所选择的WindowAssigner实现的。WindowAssigner负责将每个传入元素分配给一个或多个窗口。

内置窗口分配器

Flink为最常见的场景(滚动时间窗口、滑动时间窗口、全局窗口和会话窗口)提供了预定义的窗口分配器,它们分别如下。

(1)滚动时间窗口:例如,每分钟PV数据(浏览量),代码如下:

TumblingEventTimeWindows.of(Time.minutes(1))

(2)滑动时间窗口:例如,每10s计算一次每分钟的页面浏览量,代码如下:

SlidingEventTimeWindows.of(Time.minutes(1),Time.seconds(10))

(3)会话窗口:例如,每个会话的PV数据,其中会话定义为会话之间至少30min的间隔,代码如下:

EventTimeSessionWindows.withGap(Time.minutes(30))

所有内置的窗口分配器(全局窗口除外)都根据时间向窗口分配元素。基于时间的窗口分配程序(包括会话窗口)有事件时间和处理时间两种形式。示例如下:

image

自定义窗口分配器

一个Flink窗口程序的总体结构如下
Keyed Stream表示如下,在Keyed Stream的情况下,可以使用传入事件的任何属性作为key。在Keyed Stream的窗口计算由多个任务并行执行,因为每个逻辑Keyed Stream都可以独立于其他流进行处理。所有引用相同key的元素将被发送到相同的并行任务。

// Keyed Windows
stream
    .keyBy(...)
    .window()
    .reduce/aggregate/apply()

non-keyed-stream表示如下,在Keyed Stream的情况下,可以使用传入事件的任何属性作为key。在Keyed Stream的窗口计算由多个任务并行执行,因为每个逻辑Keyed Stream都可以独立于其他流进行处理。所有引用相同key的元素将被发送到相同的并行任务。

// Keyed Windows
stream
    .windowAll()
    .reduce/aggregate/apply()

参考
《Flink原理深入与编程实战》

Flink的Window

标签:Flink,窗口,Stream,必知,元素,Keyed,聊聊,如下
From: https://www.cnblogs.com/zhiyong-ITNote/p/17486241.html

相关文章

  • Flink提交任务命令整理
     环境:Flink1.13.6和Flink1.14.4yarn-session模式:--启动yarnseeionbin/yarn-session.sh\-s8\-jm4g\-tm16g\-nmyarn-session-flink\-dyarn-session.sh-jm1g-tm8g-s4-d参数解释:-jm1024表示jobmanager1024M内存-tm1024表示taskmanager......
  • HTTP请求:requests模块基础使用必知必会
    1背景http请求是常见的一种网页协议,我们看到的各种网页,其实都是发送了http请求得到了服务器的响应,从而将数据库中复杂的数据以简单、直观的方式呈现出来,方便大众阅读、使用。而如何发送http请求呢?今天来探讨一下使用requests模块,达到高效、简单的http请求操作。2什么是request......
  • Flink1.13.6 部署踩坑记录
    环境  Hadoop集群是Ambari2.7.5的版本   Flink是1.13.6_2.12的版本问题记录  1.缺少jar包报错:ERRORorg.apache.flink.yarn.cli.FlinkYarnSessionCli[]-ErrorwhilerunningtheFlinksession.java.lang.NoClassDefFoundError:com/sun/jerse......
  • JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)
    关键字:java面试题基本类型intlongbooleanfloatdoublechar作者:臧圩人(zangweiren)基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一......
  • Flink重启策略
    Flink默认重启策略是通过Flink的配置文件设置的flink-conf.yaml,配置参数restart-strategy定义采用的策略。注意:如果启用了checkpoint并且没有显式配置重启策略,会默认使用fixeddelay策略,最大重试次数为Integer.MAX_VALUE。1.固定延迟重启策略固定延迟重启策略是尝试给定次数重......
  • jenkins 自动化部署 flink job
    JenkinsfiledefdeployIp='192.168.1.53'defremote=[:]remote.name=deployIpremote.host=deployIpremote.user='root'remote.password=LCX_PWD_5sremote.allowAnyHosts=truedefgitUrl='http://192.168.1.43:8600/bigda......
  • Flink 的 checkpoint 机制对比 spark 有什么不同和优势?
    sparkstreaming的checkpoint仅仅是针对driver的故障恢复做了数据和元数据的checkpoint。而flink的checkpoint机制要复杂很多,它采用的是轻量级的分布式快照,实现了每个算子的快照,及流动中的数据的快照。......
  • 聊聊什么是分布式事务
    概述分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,以上是百度百科的解释。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要......
  • Redis系列16:聊聊布隆过滤器(原理篇)
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • kettle和Flink做ETL的区别
    Kettle和Flink都可以用于ETL(抽取、转换和加载)处理,但它们有一些不同之处。Kettle是一款基于图形化界面的ETL工具,可以通过拖放组件的方式来设计和构建ETL流程。它提供了大量的内置组件和步骤,可以用于处理各种数据源和格式。Kettle的优点是易于使用和学习,适合于小型数据处理任务和快......