随笔分类 - flink
摘要:问题描述 使用 FlinkSql 的 jdbc 连接器 读取 mysql 的一张表,总是提示 Exception in thread "main" org.apache.flink.table.api.ValidationException: Unable to create a source fo
阅读全文
摘要:场景描述 采用 单作业模式提交作业后发现报错了 报错内容 Exception in thread “Thread-5” java.lang.IllegalStateException: Trying to access closed classloader. Please check if you
阅读全文
摘要:在实际应用中,我们一般都需要将数据按照某个key进行分区,然后再进行计算处理;所以最为常见的状态类型就是Keyed State。之前介绍到keyBy之后的聚合、窗口计算,算子所持有的状态,都是Keyed State。另外,我们还可以通过富函数类(Rich Function)对转换算子进行扩展、实现自
阅读全文
摘要:Flink处理机制的核心,就是“有状态的流式计算”。之前已经多次提到了“状态”(state),不论是简单聚合、窗口聚合,还是处理函数的应用,都会有状态的身影出现。有状态流处理,状态就如同事务处理时数据库中保存的信息一样,是用来辅助进行任务计算的数据。而在Flink这样的分布式系统中,不仅需要定义出状
阅读全文
摘要:在有些场景下,我们要处理的时间间隔可能并不是固定的。比如,在交易系统中,需要实时地对每一笔交易进行核验,保证两个账户转入转出数额相等,也就是所谓的“实时对账”。两次转账的数据可能写入了不同的日志流,它们的时间戳应该相差不大,所以我们可以考虑只统计一段时间内是否有出账入账的数据匹配。这时显然不应该用滚
阅读全文
摘要:对于两条流的合并,很多情况我们并不是简单地将所有数据放在一起,而是希望根据某个字段的值将它们联结起来,“配对”去做处理。例如用传感器监控火情时,我们需要将大量温度传感器和烟雾传感器采集到的信息,按照传感器ID分组、再将两条流中数据合并起来,如果同时超过设定阈值就要报警。我们发现,这种需求与关系型数据
阅读全文
摘要:CoProcessFunction 简介 对于连接流ConnectedStreams的处理操作,需要分别定义对两条流的处理转换,因此接口中就会有两个相同的方法需要实现,用数字“1”“2”区分,在两条流中的数据到来时分别调用。我们把这种接口叫作“协同处理函数”(co-process function)
阅读全文
摘要:流的联合虽然简单,不过受限于数据类型不能改变,灵活性大打折扣,所以实际应用较少出现。除了联合(union),Flink还提供了另外一种方便的合流操作——连接(connect)。顾名思义,这种操作就是直接把两条流像接线一样对接起来 1、连接流(ConnectedStreams) 为了处理更加灵活,连接
阅读全文
摘要:应用中,我们经常会遇到来源不同的多条流,需要将它们的数据进行联合处理。所以Flink中合流的操作会更加普遍,对应的API也更加丰富。 Union 最简单的合流操作就是直接将多条流合在一起,这种操作称作为流的 “联合”(union) ,如下图所示,进行联合操作的流的数据类型需要保持一致,合并之后的流会
阅读全文
摘要:今天介绍一下 Flink从kafka 读取数据后,再将数据写回 kafka 的一个案例 示例代码 /** * 从一个 topic 读取数据,在写回另一个 topic */ public class SinkToKafka0824 { public static void main(String[]
阅读全文
摘要:Kafka作为分布式消息传输队列,是一个高吞吐、易于扩展的消息系统。而消息队列的传输方式,恰恰和流处理是完全一致的。所以可以说Kafka和Flink天生一对,是当前处理流式数据的双子星。在如今的实时流处理应用中,由Kafka进行数据的收集和传输,Flink 进行分析计算,这样的架构已经成为众多企业的
阅读全文
摘要:所谓“分流”,就是将一条数据流拆分成完全独立的两条、甚至多条流。也就是基于一个DataStream,得到完全平等的多个子DataStream,如下图所示。一般来说,会定义一些筛选条件,将符合条件的数据拣选出来放到对应的流里。 处理函数本身可以认为是一个转换算子,它的输出类型是单一的,处理之后得到的仍
阅读全文
摘要:窗口的计算处理,在实际应用中非常常见。对于一些比较复杂的需求,如果增量聚合函数无法满足,就需要考虑使用窗口处理函数这样的“大招”了。网站中一个非常经典的例子,就是实时统计一段时间内的热门url。例如,需要统计最近10秒钟内最热门的两个url链接,并且每5秒钟更新一次。这可以用一个滑动窗口来实现,而“
阅读全文
摘要:除了KeyedProcessFunction,另外一大类常用的处理函数,就是基于窗口的ProcessWindowFunction和ProcessAllWindowFunction了. 1、窗口处理函数的使用 进行窗口计算,可以直接调用现成的简单聚合方法(sum/max/min),也可以通过调用.re
阅读全文
摘要:在Flink程序中,为了实现数据的聚合统计,或者开窗计算之类的功能,一般都要先用keyBy算子对数据流进行“按键分区”,得到一个KeyedStream。也就是指定一个键(key),按照它的哈希值(hash code)将数据分成不同的“组”,然后分配到不同的并行子任务上执行计算;这相当于做了一个逻辑分
阅读全文
摘要:1、联合(Union) 最简单的合流操作,就是直接将多条流合在一起,叫作流的“联合”(union),如下图所示。联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变。这种合流方式非常简单粗暴,就像公路上多个车道汇在一起一样 在代码中,只要基于DataStream直
阅读全文
摘要:处理函数主要是定义数据流的转换操作,所以也可以把它归到转换算子中。在Flink中几乎所有转换算子都提供了对应的函数类接口,处理函数也不例外;它所对应的函数类,就叫作ProcessFunction。 1、处理函数的功能和使用 之前学习的转换算子,一般只是针对某种具体操作来定义的,能够拿到的信息比较有限
阅读全文
摘要:有了事件时间、水位线和窗口的相关知识,现在就可以系统性地讨论一下怎样处理迟到数据了。所谓的“迟到数据”(late data),是指某个水位线之后到来的数据,它的时间戳其实是在水位线之前的。所以只有在事件时间语义下,讨论迟到数据的处理才是有意义的。事件时间里用来表示时钟进展的就是水位线(waterma
阅读全文
摘要:增量聚合和全窗口函数的对比 已经了解了Window API中两类窗口函数的用法,下面先来做个简单的总结。增量聚合函数处理计算会更高效。举一个最简单的例子,对一组数据求和。大量的数据连续不断到来,全窗口函数只是把它们收集缓存起来,并没有处理;到了窗口要关闭、输出结果的时候,再遍历所有数据依次叠加,得到
阅读全文
摘要:与增量聚合函数不同,全窗口函数需要先收集窗口中的数据,并在内部缓存起来,等到窗口要输出结果的时候再取出数据进行计算。很明显,这就是典型的批处理思路了——先攒数据,等一批都到齐了再正式启动处理流程。这样做毫无疑问是低效的:因为窗口全部的计算任务都积压在了要输出结果的那一瞬间,而在之前收集数据的漫长过程
阅读全文