我是Flink的新手,很抱歉,如果这个问题很简单!
问题描述:
IoT sensors --> MQTT --> Apache Nifi --> Kafka --> Flink
(只有Flink与此相关!
传感器发送心跳和其他事件。 Hearbeats有两种不同的格式(不同的版本)。我的目标是统一流。
这是我的代码:
SplitStream<GatewayEvent<String>> splitedStream = gatewayStream
.split(new GatewayActionPathSplitter());
// GatewayEvent contains an 'action' (mqqt topic): 'up/hearbeat' action contains v30 and v31 heartbeats
SplitStream<GatewayEvent<String>> heartBeatStream = splitedStream
.select("up/heartbeat")
.split(new HeartBeatVersionSplitter());
// Map heartbeats v31 to HeartBeat objects
DataStream<GatewayEvent<HeartBeat>> hb31Stream = heartBeatStream
.select("V31")
.map(new HeartBeat31Mapper());
// Map heartbeats v30 to HeartBeat objects
DataStream<GatewayEvent<HeartBeat>> hb30Stream = heartBeatStream
.select("V30")
.map(new HeartBeat30Mapper());
DataStream<GatewayEvent<HeartBeat>> allHBStream = hb31Stream
.union(hb30Stream);
allHBStream.print();
我认为流会有以下事件(“HB30”是HeartBeatv30,“HB31”是HearBeatv31,“O”是其他事件)
gatewayStream = HB30, O, O, HB30, HB31, HB30, O
splitedStream = HB30, O, O, HB30, HB31, HB30, O
splitedStream.select("up/heartbeat") = HB30, HB30, HB31, HB30
heartBeatStream = HB30, HB30, HB31, HB30
heartBeatStream.select("V30") = HB30, HB30, HB30
//错误:还包含HB31
heartBeatStream.select("V31") = HB31
//错误:还包含HB30s
有人可以解释一下:
1-这段代码有什么问题?
2-是否有其他解决方案来实现此功能? (我已经有一个解决方法:我的GatewayActionPathSplitter类包括听力版本区别)。
感谢您的帮助
答案 0 :(得分:2)
不幸的是,split
操作不可堆叠,因为它们只是将路由策略应用于前一个运算符的输出。此问题已经打开JIRA。
另一个选择是将差异化逻辑合并到map
函数中。有点像:
.filter(event.getType.equals("HB31") || event.getType.equals("HB30")))
.map(event =>
event.getType match {
case "HB31" => new HeartBeat31Mapper()
case "HB30" => new HeartBeat30Mapper()
})