1、项目架构
2、mysql广播和kafka流合并
主要应用于实时流关联广播. 主要应该与实时流关联mysql上规则增加关联性. 我这个类主要是在process() 里面使用. 可以看我继承的BroadcastProcessFunction 方法就会明白.我这个类所使用的地方.为广播process
3、代码
package com.func
import com.bean.BuriedPointDetailBean
import org.apache.flink.api.common.state.MapStateDescriptor
import org.apache.flink.streaming.api.functions.co.BroadcastProcessFunction
import org.apache.flink.util.Collector
import org.slf4j.LoggerFactory
import scala.collection.immutable._
/**
* mysql广播和kafka流合并
*/
class BroadcastProcessFunc extends BroadcastProcessFunction [BuriedPointDetailBean, HashMap[String, Tuple4[String, String, String, String]], BuriedPointDetailBean] {
// 打印日志类
private val logger = LoggerFactory.getLogger(classOf[BroadcastProcessFunc])
/**定义MapStateDescriptor
* 存储的是 rule的规则原字段 Hashmap: config, label_id: bean
* */
val configDescriptor = new MapStateDescriptor[String, HashMap[String,Tuple4[String, String, String, String]]]("config",classOf[String],classOf[HashMap[String,Tuple4[String, String, String, String]]])
/**
* 读取状态,并基于状态,处理事件流中的数据
* 在这里,从上下文中获取状态,基于获取的状态,对事件流中的数据进行处理
* @param value 事件流中的数据
* @param ctx 上下文
* @param out 输出零条或多条数据
* @throws Exception 异常
*/
override def processElement(value: BuriedPointDetailBean,
ctx: BroadcastProcessFunction[BuriedPointDetailBean, HashMap[String, Tuple4[String, String, String, String]], BuriedPointDetailBean]#ReadOnlyContext,
out: Collector[BuriedPointDetailBean]): Unit = {
var evenId: String = value.event_id
//获取状态 HashMap [event_id , bean]
var broadcastState = ctx.getBroadcastState(configDescriptor)
var broadcastStateRuleInfo = broadcastState.get("config")//mysql规则数据
//配置中有此规则,则在该事件中。
//配置中没有此规则,则丢弃
if (broadcastStateRuleInfo != null) {
//value 是event_id
if(broadcastStateRuleInfo.values.map(_._2).toIterator.contains(evenId)) {
out.collect(value) //下发下游
}
//key是event_id
// if (broadcastStateUserInfo.contains(evenId)) {
// out.collect(value)
// }
}
}
/**
* 处理广播流中的每一条数据,并更新状态 Hashmap是mysql广播
* @param value 广播流中的数据,Tuple4你可以用一个bean对象
* @param ctx 上下文
* @param out 输出零条或多条数据
* @throws Exception 异常
*/
override def processBroadcastElement(value: HashMap[String, Tuple4[String, String, String, String]],
ctx: BroadcastProcessFunction[BuriedPointDetailBean, HashMap[String, Tuple4[String, String, String, String]], BuriedPointDetailBean]#Context,
out: Collector[BuriedPointDetailBean]): Unit = {
//获取上一条的广播状态 :labelId ,tuple<bean>
val broadcastState = ctx.getBroadcastState(configDescriptor)
//清空状态
broadcastState.clear()
logger.info("mysql rule init...")
//获取当前更新状态
broadcastState.put("config",value)
}
}
4、说明
要明白一点这里的两个广播是处理两个流的广播。
- 一个流processBroadcastElement是处理mysql的流,用于定时加载规则,定时删除规则。
- 一个流processElement是用于处理Kafka流,可以是复杂的逻辑,也可以是简单逻辑。自己在的流中写代码处理。
我的处理逻辑只要判断是否包含,进行一层过滤。contains