Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink 如何在process()运算符之后动态分配窗口_Apache Flink_Flink Streaming - Fatal编程技术网

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并更改窗口。我希望它在新的/更改的窗口信息出现时输入

    创建这种结构的正确方法是什么?手动管理窗口还是使用这种自定义窗口分配程序

    另一参考: