如何在keyedbroadcastprocessfunction

时间:2020-06-01 10:37:33

标签: apache-flink flink-streaming flink-cep

我试图通过一组规则对广播流进行验证,以针对一组规则验证数据流以检测flink中的模式,我使用for循环来收集map中的所有模式并在其中进行迭代寻找一个模式样本代码的processElement fn如下

MapState描述符和Side输出流如下

public static final MapStateDescriptor<String, String> ruleSetDescriptor =
        new MapStateDescriptor<String, String>("RuleSet", BasicTypeInfo.STRING_TYPE_INFO,
                BasicTypeInfo.STRING_TYPE_INFO);

public final static OutputTag<Tuple2<String, String>> unMatchedSideOutput =
        new OutputTag<Tuple2<String, String>>(
                "unmatched-side-output") {
        };

处理功能和广播功能如下:

@Override
    public void processElement(Tuple2<String, String> inputValue, ReadOnlyContext ctx,
                               Collector<Tuple2<String,
                                       String>> out) throws Exception {


        for (Map.Entry<String, String> ruleSet:
                ctx.getBroadcastState(broadcast.patternRuleDescriptor).immutableEntries()) {

            String ruleName = ruleSet.getKey();


//If the rule in ruleset is matched then send output to main stream and break the program
            if (this.rule) {
                out.collect(new Tuple2<>(inputValue.f0, inputValue.f1));
                break;
            }
        }

        // Writing output to sideout if no rule is matched 
        ctx.output(Output.unMatchedSideOutput, new Tuple2<>("No Rule Detected", inputValue.f1));
    }


    @Override
    public void processBroadcastElement(Tuple2<String, String> ruleSetConditions, Context ctx, Collector<Tuple2<String,String>> out) throws Exception {

        ctx.getBroadcastState(broadcast.ruleSetDescriptor).put(ruleSetConditions.f0,
                ruleSetConditions.f1);

    }

我能够检测到模式,但是我也得到了sideoutput,因为如果我的匹配规则最后出现,那么我将尝试逐一遍历规则,因为初始的规则集是程序将输出发送到sideoutput不匹配。如果所有规则都不满足,我只想打印一次侧面输出,我是flink的新手,请帮助我如何实现它。

1 个答案:

答案 0 :(得分:0)

在我看来,您想要做更多这样的事情:

@Override
public void processElement(Tuple2<String, String> inputValue, ReadOnlyContext ctx, Collector<Tuple2<String, String>> out) throws Exception {

    transient boolean matched = false;

    for (Map.Entry<String, String> ruleSet:
      ctx.getBroadcastState(broadcast.patternRuleDescriptor).immutableEntries()) {

        String ruleName = ruleSet.getKey();

        if (this.rule) {
            matched = true;
            out.collect(new Tuple2<>(inputValue.f0, inputValue.f1));
            break;
        }
    }

    // Writing output to sideout if no rule was matched
    if (!matched) {
        ctx.output(Output.unMatchedSideOutput, new Tuple2<>("No Rule Detected", inputValue.f1));
    }
}
相关问题