三、窗口

1、窗口的介绍

(1)含义

将无限的流式数据切割为有限块处理,以便于聚合等操作

(2)图解

2、窗口的分类

(1)按性质分

Flink 支持三种划分窗口的方式,time、count和会话窗口(Session Windows):session间隔定义了非活跃周期的长度,一段时间没有接收到新数据就会生成新的窗口。如果根据时间划分窗口,那么它就是一个time-window(时间窗口);如果根据数据划分窗口,那么它就是一个count-window(数量窗口)。一段时间没有接收到新数据就会生成新的窗口,则为会话窗口。

(2)按类型分

窗口又可以分为滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。

滚动窗口无重叠数据,而滑动窗口有重叠数据。

3、窗口API

窗口包含两个重要属性(size窗口大小和interval间隔-多久统计一次),如果size=interval,那么就会形成tumbling-window(无重叠数据) 如果size>interval,那么就会形成sliding-window(有重叠数据) 如果size< interval,那么窗口将会丢失数据。

例如:每5秒钟,统计过去3秒的通过路口汽车的数据,将会漏掉2秒钟的数据

组合后可以形成下列四种窗口

time-tumbling-window 无重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5))

time-sliding-window 有重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5), Time.seconds(3))

count-tumbling-window无重叠数据的数量窗口,设置方式举例:countWindow(5)

count-sliding-window 有重叠数据的数量窗口,设置方式举例:countWindow(5,3)

4、API补充

windowfunction:增量聚合(每次到来都计算)、全窗口函数(全部到来再遍历)

其它可选API:.trigger()——触发器、.evitor()——移除器、.allowedLateness()——允许处理迟到的数据、.getSideOutput() —— 获取侧输出流

四、时间语义与水印

1、时间语义分类

流式数据处理的时间可以分为事件时间,进入时间和处理时间三种

Event Time:事件的创建时间,消息本身携带

Ingestion Time:进入时间,以client客户端时间为准

Processing Time:处理时间(默认的时间属性),以服务端时间为准

通常根据日志的生成时间(Event Time)进行统计

引入时间语义:

val env = StreamExecutionEnvironment.getExecutionEnvironment

// 从调用时刻开始给env创建的每一个stream追加时间特征

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

2、Watermark水印

(1)含义

Flink 为了处理 EventTime 窗口延迟计算提出的一种机制,本质是一种时间戳。每条消息都有一个事件时间和一个水印时间(计算得出,例如maxEventTime-t)。

通常与Window一起处理乱序事件。由于网络延迟等原因,不能无限期的等下去,保证特定时间后,必须触发窗口进行计算。

(2)实现原理

添加水印后,窗口会等5秒,再执行计算。若超过5秒,则舍弃。

窗口执行计算时间由水印时间来触发(而非窗口结束时间),当接收到消息的watermark >= endtime时,触发窗口的计算

(3)具体操作

实现TimestampAssigner接口,实现根据事件时间计算水印时间

五、ProcessFunctionAPI(底层API)

1、含义

是flink的底层转换算子,通过这些底层转换算子可以访问数据的时间戳、watermark以及注册定时事件等,还可以输出特定的一些事件,例如超时事件等。

2、组成

ProcessFunction

KeyedProcessFunction

CoProcessFunction

ProcessJoinFunction

BroadcastProcessFunction

KeyedBroadcastProcessFunction

ProcessWindowFunction

ProcessAllWindowFunction

3、调用方式

inputData.flatMap(new MySpliter())

.process(new KeyedProcessFunction<String, Sensor, String>() {})

所有的Process Function都实现了RichFunction接口,都有open()、close()和getRuntimeContext()等方法

4、KeyedProcessFunction

按照key对元素进行处理,额外提供下列两个方法

processElement(Sensor sensor, Context context, Collector collector), 流中的每个元素都会调用此方法,调用结果将会放在Collector数据类型中输出;context包含上下文信息,包括当前数据的时间戳、key以及时间服务,还可以将数据放到侧输出流

onTimer(long timestamp, OnTimerContext ctx, Collector out)是一个回调函数。当定时器触发时调用。timestamp是定时器的触发时间戳,ctx上下文信息,out收集输出信息

5、TimerService和定时器对象

(1)含义及组成

TimerService是Context上下文和OnTimerContext 的对象,均包含下列方法:

//返回当前处理时间

long currentProcessingTime();

//返回当前水位线

long currentWatermark();

//注册当前key的process time定时器,process time到达定时时间时触发timer

void registerProcessingTimeTimer(long var1);

//注册当前key的event time定时器,当watermark大于等于定时时间时触发timer

void registerEventTimeTimer(long var1);

//删除指定时间戳的process time定时器

void deleteProcessingTimeTimer(long var1);

//删除指定时间戳的event time定时器

void deleteEventTimeTimer(long var1);

(3)举例:温度传感器

传感器温度在1秒内持续升高则发出报警信息。

.process(new KeyedProcessFunction<String, Sensor, String>()

实现processElement()方法负责根据值注册和清除定时器

实现onTimer()方法用于发出报警【回调函数】


6、侧输出流(SideOutput)

(1)含义

默认算子单一输出,用侧输出流可以产生多条不同数据类型的流

每个输出流可以定义为定义为OutputTag[X]对象,并通过Context对象发射到指定事件或对象

(2)使用方式

val monitoredReadings: DataStream[SensorReading] = readings

.process(new FreezingMonitor)

monitoredReadings

.getSideOutput(new OutputTag[String]("freezing-alarms"))

.print() //输出指定的流信息

readings.print() //输出全部的流信息

(3)FreezingMonitor函数具体实现

class FreezingMonitor extends ProcessFunction[SensorReading, SensorReading] {

// 定义一个侧输出标签

lazy val freezingAlarmOutput: OutputTag[String] =

new OutputTag[String]("freezing-alarms")

override def processElement(r: SensorReading,

ctx: ProcessFunction[SensorReading, SensorReading]#Context,

out: Collector[SensorReading]): Unit = {

// 温度在32F以下时,输出警告信息

if (r.temperature < 32.0) {

ctx.output(freezingAlarmOutput, s"Freezing Alarm for ${r.id}")

}

// 所有数据直接常规输出到主流

out.collect(r)

}

}

7、CoProcessFunction

(1)含义

使用CoProcessFunction可以合并两条流,根据id将两个流中的数据组合

(2)实现

提供了操作每一个输入流的方法:processElement1()和processElement2()

第一个流ValueState<String>的值不为空,则在第二个流中合并

// 流2的处理逻辑与流1的处理逻辑类似

@Override

public void processElement2(String value, Context ctx, Collector<Tuple2<String, String>> out) throws Exception {

String value1 = state1.value();

if (value1 != null) {

out.collect(Tuple2.of(value1, value));

state1.clear();

ctx.timerService().deleteEventTimeTimer(timeState.value());

timeState.clear();

} else {

state2.update(value);

long time = 1111L + 60000;

timeState.update(time);

ctx.timerService().registerEventTimeTimer(time);

}

}

//在定时器中将value不为空的tag进行输出

【大数据面试】Flink 03-窗口、时间语义和水印、ProcessFunction底层API的更多相关文章

  1. 面试系列二:精选大数据面试真题JVM专项-附答案详细解析

    公众号(五分钟学大数据)已推出大数据面试系列文章-五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 大数据笔面试系列文章分为两种类型: ...

  2. LAXCUS大数据操作系统3.03版本发布,欢迎使用试用

    LAXCUS大数据操作系统3.03正式发布,欢迎下载使用试用.LAXCUS大数据操作系统,集成虚拟化.大数据.数据库.容器.中间件的多集群多用户多任务全栈通用系统软件,运行.开发.维护管理为一体的平台 ...

  3. Hadoop大数据面试--Hadoop篇

    本篇大部分内容參考网上,当中性能部分參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performanc ...

  4. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  5. 大数据学习(03)——HDFS的高可用

    高可用架构图 先上一张搜索来的图. 如上图,HDFS的高可用其实就是NameNode的高可用. 上一篇里,SecondaryNameNode是NameNode单节点部署才会有的角色,它只帮助NameN ...

  6. 大数据面试(HR电话了解)

    1什么是HA集群? 所谓HA,即高可用(7*24小时不中断服务) HA集群是hadoop高可用集群,即有两个namenode,一个active,一个stanby,active的name挂掉之后,sta ...

  7. 【大数据系列】windows环境下搭建hadoop开发环境使用api进行基本操作

    前言 搭建完hadoop集群之后在windows环境下搭建java项目进行测试 操作hdfs中的文件 版本一 package com.slp.hadoop274.hdfs; import java.i ...

  8. 大数据时代,银行BI应用的方案探讨

    大数据被誉为21世纪发展创造的新动力,BI(商业智能)成为当下最热门的数据应用方案.据资料显示:当前中国大数据IT投资最高的为五个行业中,互联网最高.其次是电信.金融.政府和医疗.而在金融行业中,银行 ...

  9. 大数据技术 - MapReduce的Shuffle及调优

    本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要 ...

  10. 为什么说LAXCUS颠覆了我的大数据使用体验

    切入正题前,先做个自我介绍. 本人是从业三年的大数据小码农一枚,在帝都一家有点名气的广告公司工作,同时兼着大数据管理员的职责. 平时主要的工作是配合业务部门,做各种广告大数据计算分析工作,然后制成各种 ...

随机推荐

  1. 【学习笔记】 Adaboost算法

    前言 之前的学习中也有好几次尝试过学习该算法,但是都无功而返,不仅仅是因为该算法各大博主.大牛的描述都比较晦涩难懂,同时我自己学习过程中也心浮气躁,不能专心. 现如今决定一口气肝到底,这样我明天就可以 ...

  2. 使用 Loki 收集 Traefik 日志

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492264&idx=1&sn=f443c92664 ...

  3. 密码学奇妙之旅、02 混合加密系统、AES、RSA标准、Golang代码

    CTR 计数器模式 计数器模式CTR是分组密码模式中的一种.通过将逐次累加的计数器进行加密来生成密钥流的流密码.每次加密时会生成一个不同的值来作为计数器的初始值. 可以事先进行加密.解密的准备. 加密 ...

  4. Docker MySql 查看版本的三种方法

    目录 Docker MySql 查看版本的三种方法 1.mysql -V命令查看版本 2.status命令查看版本 3.version命令查看版本 Docker MySql 查看版本的三种方法 1.m ...

  5. MES会成为象ERP一样的标准产品吗?

    首先ERP不是完全的标准产品,只是标准化程度高低的问题,即使是头部ERP品牌产品也一样,包括SAP对每个企业都有客制,并且随着企业的成长变化也会跟着变,所以SAP就有"Rise With S ...

  6. 实验02_Proteus仿真数码管显示报告

    一.原理总结   利用两个寄存器 R4 和 R5 来存储两个数码管的显示数字,R4 用来存储前一个数码管显示数字,而 R5 用来存储后一个数码管显示数字,利用左移操作 RLC 取 A 中首位放入 C ...

  7. P3834 【模板】可持久化线段树 2

    P3834 主席树模板,求区间第k小. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define lc tr[i].ch[0] ...

  8. Windows应急响应——敬请期待!

    检查内容 进程.服务.用户.网络连接.漏洞补丁.木马查杀. 工具 火绒剑. 防护措施 杀毒软件

  9. LcdTools如何实现PX01设置不同的画面不同的背光亮度

    背光驱动分两种原理:恒压模式和恒流模式.恒压背光顾名思义提供恒定电压即可,这种屏正常来讲自带背光驱动电路,只需提供背光工作电压.背光使能和背光调光占空比控制.恒流背光指屏的背光只有纯灯串,需外部提供相 ...

  10. 微信支付v3接口的 官方 Java SDK

    啰嗦几句:微信支付v3版接口麻烦吗?在对接微信支付v3接口时,本来是一件很简单的事情,其实微信支付v3接口并不是很复杂,但是微信团队的管理很混乱,给我们开发者带来了巨大的麻烦. 微信支付v3版接口对接 ...