本章学习用的项目来自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作为key
  • process(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?