本章学习用的项目来自Flink官方文档《Fraud Detection with the DataStream API》,再写如何搭建就显得很累赘,所以省去搭建/测试过程,直接写心得部分。
点击查看【processon】
通过此次Demo的学习,可以粗略总结出整个Flink任务通常会包含三个元素,如上图Flink入门架构图1所示:
- Source,数据源
- Compute,计算过程
- Dest,数据目的地
那么不同的数据源怎么读?数据目的地怎么写?Flink框架提供了 SourceFunction
接口和 SinkFunction
,前者提供了自由的数据读取方式,后者提供了自由的数据写入方式,从而保证的多元化的输入源和目的地。此时我们可以整理出如下的示意图:
点击查看【processon】
解决了数据读取和数据写入的问题之后,我们把目光放在计算方式上。我想多元化的输入/输出其实并不算什么亮点,更重要的是Flink提供了怎样方便的或强大的计算功能?
在此次Demo中,我主要用到了以下几个函数:
keyBy(KeySelector<IN, OUT>)
,IN表示输入进来的元素类型,OUT表示选择的KEY的类型。就拿官方的Demo来说,keyBy(Transaction::getAccountId)
就是获取Transaction类型的元素的AccountId作为keyprocess(KeyedProcessFunction<KEY, T, R>)
,KEY表示key的类型,I表示输入元素的类型,O表示输出元素的类型。在这个方法里,官方Demo是创建了一个FraudDetector
类,该类继承了KeyedProcessFunction
,在processElement()
里进行处理每一个元素
点击查看【processon】
这之后,官方又做了两次“升级”,V1版提供了计算状态存储的演示、V2版提供了定时器的功能,这里先将介绍状态存储:
ValueStateDescriptor
,一个状态描述符,通过该描述符可以创建出一个对应类型的ValueState
- 一个Key对应一个ValueState,怎么实现的?感觉是通过RuntimeContext完成的,有待考证
context.timerService()
,获取时间服务通过registerProcessingTimeTimer
,注册到了指定时间回调onTimer()
方法
遗留问题
- Flink如何实现
flagState.value()
不同的key可以获取到不同的value?