
Flink
文章平均质量分 89
IT阿牛
不定时更新计算机专业相关知识
展开
-
Flink的状态后端(State Backends)(管理状态)
Flink中提供了两类不同的状态后端,一种是“哈希表状态后端”(HashMapStateBackend),另一种是“内嵌RocksDB状态后端”(EmbeddedRocksDBStateBackend)。在Flink中,状态的存储、访问以及维护,都是由一个可插拔的组件决定的,这个组件就叫作状态后端(state backend)。普通的状态,以及窗口中收集的数据和触发器,都会以键值对的形式存储起来,所以底层是一个哈希表(HashMap),这种状态后端也因此得名。的机制,这在很多情况下可以大大提升保存效率。原创 2024-06-03 10:05:33 · 1599 阅读 · 1 评论 -
Flink的状态生存时间(TTL)
状态的失效其实不需要立即删除,所以我们可以给状态附加一个属性,也就是状态的“失效时间”。之后如果有对状态的访问和修改,我们可以再对失效时间进行更新;当设置的清除条件被触发时(比如,状态被访问的时候,或者每隔一段时间扫描一次失效状态),就可以判断状态是否失效、从而进行清除了。在实际应用中,很多状态会随着时间的推移逐渐增长,如果不加以限制,最终就会导致存储空间的耗尽。这时就需要配置一个状态的“生存时间”(time-to-live,TTL),当状态在内存中存在的时间超出这个值时,就将它清除。原创 2024-05-25 11:47:03 · 601 阅读 · 0 评论 -
Flink中的按键分区状态
顾名思义,状态中只保存一个“值”(value)。这里的T是泛型,表示状态的数据内容可以是任何具体的数据类型。如果想要保存一个长整型值作为状态,那么类型就是ValueState< Long >。我们可以在代码中读写值状态,实现对于状态的访问和更新。T value():获取当前状态的值;:对状态进行更新,传入的参数value就是要覆写的状态值。在具体使用时,为了让运行时上下文清楚到底是哪个状态,我们还需要创建一个“状态描述器”(StateDescriptor)来提供状态的基本信息。原创 2024-05-25 11:46:52 · 550 阅读 · 0 评论 -
Top N案例
实时统计一段时间内的出现次数最多的水位。例如,统计最近10秒钟内出现次数最多的两个水位,并且每5秒钟更新一次。我们知道,这可以用一个滑动窗口来实现。于是就需要开滑动窗口收集传感器的数据,按照不同的水位进行统计,而后汇总排序并最终输出前两名。一种最简单的想法是,我们干脆不区分不同水位,而是将所有访问数据都收集起来,统一进行统计计算。所以可以不做keyBy,直接基于DataStream开窗,然后使用全窗口函数ProcessAllWindowFunction来进行处理。在窗口中可以用一个HashMap来保存每个原创 2024-05-15 09:26:24 · 464 阅读 · 0 评论 -
基于时间的合流——双流联结(Join)
于是对于时间戳为2的A中元素,它的可匹配区间就是[0, 3],流B中有时间戳为0、1的两个元素落在这个范围内,所以就可以得到匹配数据对(2, 0)和(2, 1)。顾名思义,间隔联结的思路就是针对一条流的每个数据,开辟出其时间戳前后的一段时间间隔,看这期间是否有来自另一条流的数据匹配。这里.window()传入的就是窗口分配器,之前讲到的三种时间窗口都可以用在这里:滚动窗口(tumbling window)、滑动窗口(sliding window)和会话窗口(session window)。原创 2024-05-11 16:13:51 · 410 阅读 · 0 评论 -
Flink对于迟到数据的处理
比如一个0-10s的窗口,设置了延迟时间是2s,后来来了一条12s的数据,窗口要触发然后关闭,紧接着又来了一条6s的数据,这个数据应该属于0-10s,但是窗口的延迟时间已经过去并且窗口已经关闭了,此时这条数据就叫做迟到数据。原创 2024-05-06 10:16:33 · 488 阅读 · 0 评论 -
Flink中的水位线
在Flink中,用来衡量事件时间进展的标记,就被称作“水位线”(Watermark)。具体实现上,水位线可以看作一条特殊的数据记录,它是插入到数据流中的一个标记点,主要内容就是一个时间戳,用来指示当前的事件时间。而它插入流中的位置,就应该是在某个数据到来之后;这样就可以从这个数据中提取时间戳,作为当前水位线的时间戳了。周期性生成器一般是通过onEvent()观察判断输入的事件,而在onPeriodicEmit()里发出水位线。import org。原创 2024-05-03 15:16:38 · 639 阅读 · 0 评论 -
Flink中的时间窗口和计数窗口效果演示
会话窗口中,最重要的参数就是会话的超时时间,也就是两个会话窗口之间的最小距离。如果相邻两个数据到来的时间间隔小于指定的大小那说明还在保持会话,它们就属于同一个窗口;这里的结果如果觉得不好理解就不要想那么多,反正就是一个步长一定有一个窗口触发和输出。还有一种方法可以动态的获取时间间隔,也就是说超时时间是动态变化的。那么新来的数据就应该属于新的会话窗口,而前个窗口就应该关闭了。20s一个窗口,窗口是连续的,而且没有时间重叠。原创 2024-05-03 15:16:15 · 382 阅读 · 0 评论 -
Flink中的窗口
注意:Flink中窗口并不是静态准备好的,而是动态创建——当有落在这个窗口区间范围的数据达到时,才创建对应的窗口。另外,这里我们认为到达窗口结束时间时,窗口就触发计算并关闭,事实上“触发计算”和“窗口关闭”两个行为也可以分开,这部分内容我们会在后面详述。我们定义了窗口分配器之后,我们只是知道了数据属于哪一个窗口,可以将数据收集起来了,至于收集起来要干什么,做什么计算,还是未知。与增量聚合函数不同,全窗口函数需要先收集窗口中的数据,并在内部缓存起来,等到窗口要输出结果的时候再取出数据进行计算。原创 2024-05-03 15:15:58 · 590 阅读 · 0 评论 -
Flink的转换算子【2】
调用.map()方法时传入的不再是一个简单的MapFunction,而是一个CoMapFunction,表示分别对两条流中的数据执行map操作。这种做法非常极端,通过调用.global()方法,会将所有的输入流数据都发送到下游算子的第一个并行子任务中去。轮询就是雨露均沾,很有规律,比如一共有两个分区,第一条数据去一号分区,第二条数据就去二号分区,第三条数据又去了一号分区…根据条件筛选数据的需求,本身非常容易实现:只要针对同一条流多次独立调用.filter()方法进行筛选,就可以得到拆分之后的流了。原创 2024-05-03 15:15:37 · 454 阅读 · 0 评论 -
Flink的转换算子【1】
数据源读入数据之后,我们就可以使用各种转换算子,将一个或多个DataStream转换为新的DataStream。return id;return ts;return vc;} }Objects;return id;return ts;return vc;@Override@Override类是公有(public)的有一个无参的构造方法所有属性都是公有(public)的。原创 2024-05-03 15:15:04 · 1098 阅读 · 0 评论