Apache flink 如何在process()运算符之后动态分配窗口
我试着做如下的流媒体处理Apache flink 如何在process()运算符之后动态分配窗口,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我试着做如下的流媒体处理 从源收集传感器事件 收集为设备定义的规则事件(流式传输传感器事件) 对于任何设备,使用窗口信息为聚合过程定义的规则可能会有所不同 当在流中看到窗口信息的设备的规则时,则创建一个窗口(翻滚) 如果新规则没有窗口信息,请删除窗口并在没有窗口功能的情况下处理 我将此作为参考: 我的流媒体代码如下: mappedDataSource .connect(mappedRuleStream) .keyBy(…设备ID…) .process(新的RuleProcessorFunctio
mappedDataSource
.connect(mappedRuleStream)
.keyBy(…设备ID…)
.process(新的RuleProcessorFunction())
.windowAll(新的CustomTimeWindowing())
.apply(新的AllWindowFunction(){
@凌驾
public void apply(TimeWindow窗口、Iterable值、Collector out)抛出异常{
System.out.println(“你好”);
}
});
规则处理器功能是:
公共类RuleProcessorFunction扩展协处理器函数{
私有状态;
@凌驾
public void processElement1(SensorEvent值、上下文ctx、收集器输出)引发异常{
System.out.println(“过程元素设备id:+value.deviceId”);
System.out.println(“过程元素解决方案id:+value.solutionId”);
state.update(Tuple2.of(value,null));
RuleEvent规则=state.value().f1;
//如果传入事件上有已定义的规则,则执行
}
@凌驾
public void processElement2(RuleEvent值、上下文ctx、收集器输出)引发异常{
System.out.println(“规则流元素实体:+value.solutionId+“设备ID:+value.deviceId”);
state.value().f1=值;
//在内存中存储规则
//已处理事件将存储窗口信息,下游为窗口分配
ProcessedEvent ProcessedEvent=新ProcessedEvent();
processedEvent.deviceId=value.deviceId;
processedEvent.solutionId=value.solutionId;
processedEvent.windowInfo=value.window;
processedEvent.ruleId=value.ruleId;
out.收集(processedEvent);
}
@凌驾
public void open(配置参数)引发异常{
ValueStateDescriptor状态描述符=
新的ValueStateDescriptor(“处理器”,TypeInformation.of(新的TypeHint(){
}));
state=getRuntimeContext().getState(stateDescriptor);
}
@凌驾
public void onTimer(长时间戳、OnTimerContext ctx、收集器输出)引发异常{
//规则触发器
}
}
CustomWindowAssigner
是:
公共类CustomTimeWindowing扩展TumblingEventTimeWindows{
公共CustomTimeWindowing(){
super(1,0);
}
@凌驾
公共集合assignWindows(对象元素、长时间戳、WindowAssignerContext上下文){
System.out.println(“创建窗口:”);
ProcessedEvent ProcessedEvent=(ProcessedEvent)元素;
int windowInfo=processedEvent.windowInfo;
System.out.println(“创建窗口规则:+processedEvent.ruleId”);
长尺寸=windowInfo*1000;
System.out.println(“以毫秒为单位的窗口信息:+大小”);
长启动=时间戳-(时间戳%size);
长端=起点+尺寸;
返回集合。singletonList(新的时间窗口(开始、结束));
}
}
当ruleEvent出现时,我将添加有关窗口信息的元数据,并将其添加到收集器中以保持流式传输。但如果我在processElement1中为SensorEvent执行此操作,则会再次调用windowAssigner并更改窗口。我希望它在新的/更改的窗口信息出现时输入
创建这种结构的正确方法是什么?手动管理窗口还是使用这种自定义窗口分配程序
另一参考: