在Apache Kafka Flink中在运行时添加新规则

时间:2018-12-26 10:05:27

标签: apache-kafka apache-flink

我正在使用FlinkKafka在流上应用规则。以下是示例代码:

ObjectMapper mapper = new ObjectMapper();
List<JsonNode> rulesList = null;
try {
    // Read rule file
    rulesList = mapper.readValue(new File("ruleFile"), new TypeReference<List<JsonNode>>(){});

} catch (IOException e1) {
    System.out.println( "Error reading Rules file.");
    System.exit(-1);
}


for (JsonNode jsonObject : rulesList) {
    String id = (String) jsonObject.get("Id1").textValue();

    // Form the pattern dynamically
    Pattern<JsonNode, ?> pattern = null;
    pattern = Pattern.<JsonNode>begin("start").where(new SimpleConditionImpl(jsonObject.get("rule1")));
    // Create the pattern stream
    PatternStream<JsonNode> patternStream = CEP.pattern(data, pattern);

}

但是问题是,当我们启动程序时,FlinkKafka只读取一次文件,我希望在运行时动态添加新规则并将其应用于流。

有什么方法可以在Flink Kafka中实现?

1 个答案:

答案 0 :(得分:0)

Flink的CEP库(目前)还不支持动态模式。 (请参见FLINK-7129。)

此方法的标准方法是使用broadcast state在整个集群中通信和存储规则,但是您必须想出一些方法来评估/执行规则。

有关示例,请参见https://training.da-platform.com/exercises/taxiQuery.htmlhttps://github.com/dataArtisans/flink-training-exercises/blob/master/src/main/java/com/dataartisans/flinktraining/examples/datastream_java/broadcast/BroadcastState.java