flink 处理实时数据的三重保障
flink 处理实时数据的三重保障
window+watermark 来处理乱序数据
对于TumblingEventTimeWindowswindow 的元数据startTime,endTime和程序启动时间无关,当你指定出 window.size 时, window的startTime,endTime就分配好了allowedLateness 来处理迟到的数据
相当于延迟了window 的生命周期, 【startTime,endTime) -> [startTime,endTime+ allowedLateness]sideOutput 是最后的兜底策略, 当window 的生命周期结束后, 延迟的数据可以通过侧输出收集起来,自定义后续的处理流程
测试
- 程序
 
import java.util.Date import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.AssignerWithPeriodicWatermarks
import org.apache.flink.streaming.api.scala.{OutputTag, StreamExecutionEnvironment}
import org.apache.flink.streaming.api.watermark.Watermark
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.triggers.EventTimeTrigger object LastElement { case class Goods(var id: Int = 0, var count: Int = 0, var time: Long = 0L) {
override def toString: String = s"Goods(id=$id,count=$count,time=$time)"
} def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1) // 创建延迟数据 OutputTag, 标记为 late-data
val lateOutputTag = OutputTag[Goods]("late-data") val stream = env
.socketTextStream("localhost", 9999)
.filter(_.nonEmpty)
.map(x => {
val arr = x.split(",")
Goods(arr(0).toInt, arr(1).toInt, arr(2).toLong) // id,count,time
})
.assignTimestampsAndWatermarks(new AssignerWithPeriodicWatermarks[Goods] {
val maxOutOfOrderness = 2L // 最大无序数据到达的时间,用来生成水印2ms
var currentMaxTimestamp: Long = _ override def getCurrentWatermark: Watermark = {
new Watermark(currentMaxTimestamp - maxOutOfOrderness)
} override def extractTimestamp(element: Goods, previousElementTimestamp: Long): Long = {
currentMaxTimestamp = Math.max(element.time, currentMaxTimestamp)
element.time
}
}) val streamFunc = stream
.keyBy(_.id)
.timeWindow(Time.milliseconds(10))
.trigger(EventTimeTrigger.create())
.allowedLateness(Time.milliseconds(3)) // 允许延时的最大时间
.sideOutputLateData(lateOutputTag) // 对延时数据进行标记
.reduce { (v1, v2) => Goods(v1.id, v1.count + v2.count, v2.time) } // lateOutputTag 从窗口结果中获取迟到数据局产生的统计结果
val lateStream = streamFunc.getSideOutput(lateOutputTag) stream
.print() streamFunc
.map(("_________sum: ", _))
.print() lateStream
.map(("+++++++++++late: ", _))
.print() env.execute(this.getClass.getSimpleName)
}
}
input:
1,1,0
1,1,9
1,2,10
1,1,5
1,2,11
1,1,8
1,2,13
1,1,2
1,2,17
1,1,3
1,3,20
1,3,21
output:
Goods(id=1,count=1,time=0)
Goods(id=1,count=1,time=9)
Goods(id=1,count=2,time=10)
Goods(id=1,count=1,time=5)
Goods(id=1,count=2,time=11)
(_________sum: ,Goods(id=1,count=3,time=5))
Goods(id=1,count=1,time=8)
(_________sum: ,Goods(id=1,count=4,time=8))
Goods(id=1,count=2,time=13)
Goods(id=1,count=1,time=2)
(_________sum: ,Goods(id=1,count=5,time=2))
Goods(id=1,count=2,time=17)
Goods(id=1,count=1,time=3)
(+++++++++++late: ,Goods(id=1,count=1,time=3))
Goods(id=1,count=3,time=20)
Goods(id=1,count=3,time=21)
(_________sum: ,Goods(id=1,count=8,time=17))
分析:
1,1,0 // win1 start
1,1,9 // win1 end 注意此时win1 没有关闭
1,2,10 // win2 start
1,1,5 // win1 这一条数据属于win1无序的数据,此时 watermark=7 < win1.endTime=9.
1,2,11 // win2 && win1 触发计算,原因是 watermark=9 >= win1.endTime=9 && win1中有数据。如果没有 allowedLateness(3ms)的话此时就已经 win1 关闭了,但是有延时3ms 所以还没有关闭
1,1,8 // win1 由于有 allowedLateness(3ms),这一条数据属于win1无序的数据,并触发 update;而不是 win1的 sideOutput 数据
1,2,13 // win2 && win1 处于 close 边缘,win1 真正的生命周期从 [0,9+2) -> [0,9+2+3]
1,1,2 // win1 allowedLateness(3ms) 导致 update
1,2,17 // win2 && win1 close
1,1,3 // win1 此时win1 已经close, 这条数据属于win1 的 sideOutput
1,3,20 // win3 start
1,3,21 // win3 && win2 触发计算 // 所以最后的结果:
win1: 1,5,2 + sideOutPut: 1,1,3
win2: 1,8,17
win3: 1,6,21
flink 处理实时数据的三重保障的更多相关文章
- 阿里云体验有奖:使用PolarDB-X与Flink搭建实时数据大屏
		
体验简介 场景将提供一台配置了CentOS 8.5操作系统的ECS实例(云服务器).通过本教程的操作带您体验如何使用PolarDB-X与Flink搭建一个实时数据链路,模拟阿里巴巴双十一GMV大屏. ...
 - Flink消费Kafka数据并把实时计算的结果导入到Redis
		
1. 完成的场景 在很多大数据场景下,要求数据形成数据流的形式进行计算和存储.上篇博客介绍了Flink消费Kafka数据实现Wordcount计算,这篇博客需要完成的是将实时计算的结果写到redis. ...
 - Flink实战| Flink+Redis实时防刷接口作弊
		
随着人口红利的慢慢削减,互联网产品的厮杀愈加激烈,大家开始看好下沉市场的潜力,拼多多,趣头条等厂商通过拉新奖励,购物优惠等政策率先抢占用户,壮大起来.其他各厂商也紧随其后,纷纷推出自己产品的极速版,如 ...
 - DataPipeline丨构建实时数据集成平台时,在技术选型上的考量点
		
文 | 陈肃 DataPipeline CTO 随着企业应用复杂性的上升和微服务架构的流行,数据正变得越来越以应用为中心. 服务之间仅在必要时以接口或者消息队列方式进行数据交互,从而避免了构建单一数 ...
 - (二)基于商品属性的相似商品推荐算法——Flink SQL实时计算实现商品的隐式评分
		
系列随笔: (总览)基于商品属性的相似商品推荐算法 (一)基于商品属性的相似商品推荐算法--整体框架及处理流程 (二)基于商品属性的相似商品推荐算法--Flink SQL实时计算实现商品的隐式评分 ( ...
 - 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计
		
作者:吴云涛,腾讯 CSIG 高级工程师导语 | 最近梳理了一下如何用 Flink 来实现实时的 UV.PV 指标的统计,并和公司内微视部门的同事交流.然后针对该场景做了简化,并发现使用 Flink ...
 - Kafka ETL 之后,我们将如何定义新一代实时数据集成解决方案?
		
上一个十年,以 Hadoop 为代表的大数据技术发展如火如荼,各种数据平台.数据湖.数据中台等产品和解决方案层出不穷,这些方案最常用的场景包括统一汇聚企业数据,并对这些离线数据进行分析洞察,来达到辅助 ...
 - 搭建企业级实时数据融合平台难吗?Tapdata + ES + MongoDB 就能搞定
		
摘要:如何打造一套企业级的实时数据融合平台?Tapdata 已经找到了最佳实践,下文将以 Tapdata 的零售行业客户为例,与您分享:基于 ES 和 MongoDB 来快速构建一套企业级的实时数 ...
 - Tapdata肖贝贝:实时数据引擎系列(三) - 流处理引擎对比
		
摘要:本文将选取市面上一些流计算框架包括 Flink .Spark .Hazelcast,从场景需求出发,在核心功能.资源与性能.用户体验.框架完整性.维护性等方面展开分析和测评,剖析实时数据框架 ...
 
随机推荐
- [LeetCode]534. 游戏玩法分析 III(Mysql)
			
题目 Table: Activity +--------------+---------+ | Column Name | Type | +--------------+---------+ | pl ...
 - [程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)
			
题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp ...
 - 基于Socket的编程
			
2020/7/5 客户端步骤: 1.创建Socket. 根据指定服务端的IP地址或者端口号构造Socket类对象: Socket socket = new Socket(InetAddress. ...
 - Webservice报错客户端发现响应内容类型为“application/json;charset=UTF-8”,但应为“text/xml”。
			
控制台对接Webservice正常,同样的方法在Web项目上报错: 客户端发现响应内容类型为“application/json;charset=UTF-8”,但应为“text/xml”.请求失败,错误 ...
 - 学习 | css3实现进度条加载
			
进度条加载是页面加载时的一种交互效果,这样做的目的是提高用户体验. 进度条的的实现分为3大部分:1.页面布局,2.进度条动效,3.何时进度条增加. 文件目录 加载文件顺序 <link rel=& ...
 - 在VS2019使用MASM编写汇编程序
			
具体的配置步骤可以参考: 汇编环境搭建 Windows10 VS2019 MASM32 本文主要是入门向的教程,VS2019中要调用C语言函数需要加上 includelib ucrt.lib incl ...
 - ABP VNext从单体切换到微服务
			
注:此处的微服务只考虑服务部分,不考虑内外层网关.认证等. ABP VNext从单体切换到微服务,提供了相当大的便利性,对于各模块内部不要做任何调整,仅需要调整承载体即可. ABP can help ...
 - RabbitMQ 3.6.12延迟队列简单示例
			
简介 延迟队列存储的消息是不希望被消费者立刻拿到的,而是等待特定时间后,消费者才能拿到这个消息进行消费.使用场景比较多,例如订单限时30分钟内支付,否则取消,再如分布式环境中每隔一段时间重复执行某操作 ...
 - PyCharm-缩进 格式化代码
			
格式化代码 Ctrl + Alt + l 缩进代码 Tab 向右缩进4格 Shift + Tab 向左缩进4格
 - 编辑 编译 乱码 透彻 讲解 keil vscode notepad++
			
1. 2.此时VSCODE内的改文件是乱码现象,进行如下操作,选择 通过编码重新打开, 选择GB 2312即可.(GB2312是兼容ANSI编码的) 详细解释一下: KEIL内是ANSI编码,VSCO ...