Flink实时数据处理实践经验
首先需要知道的一些知识:
- Flink中所说的UDF在官方文档中定义为用户自己通过继承类或实现接口的自定义类、已有方法中传入匿名内部类、在已有函数中用Lambda表达式。
- Flink实现结果实时展示(一些简单的分组聚合逻辑)可以直接在流中分组聚合写入Redis/MySQL,而需要在线实时多维分析需要将数据存入ClickHouse交给CK来处理。
1. 数据输入与预处理
- 首先,Flink的每项实时任务需要通过FlinkKafkaComsumer获取对接Kafka的流式处理环境,所以可以对获取DataStream封装一个工具类。这个工具类根据传入的配置文件和具体的反序列化方式类型
Class<? extends DeserializationSchema<T>>
(如SimpleStringSchema.class),在内部为每个实时任务创建唯一执行环境和返回对接Kafka的DataStream。 - 其次,在获取到对应的DataStream后,需要对每条JSON数据解析成Java Bean对象。而解析的方法可以通过封装一个UDF(实现ProcessFunction,内部fastjson解析)。
2. 实时数据处理
在实时数仓实践中比较有意思的一些部分的总结:
- 流量域相关:
- 地理维度集成
FLink对每条数使用map进行查询是同步的做法,效率低下。这里可以使用Flink中的AsyncDataStream进行异步I/O查询。一般会在优先请求本地缓存的地理位置信息库,如果没有查询结果请求地图服务商API,在获取本次查询结果后再完善本地地理位置信息库。
- 关于新老用户标签:
离线数仓中