flink,基于json动态输入数据的触发器事件(如map object数据)

ve7v8dk2  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(416)

我想知道Flink是否能支持我的要求,我已经写了很多文章,但不确定我的案子能否解决
案例:我有两个输入源。a) 事件b)controlset事件样本数据为:

event 1-
{
   "id" :100
   "data" : {
             "name" : "abc"
            }
}

event 2-
{
   "id" :500
   "data" : {
             "date" : "2020-07-10";
             "name" : "event2"
            }
}

如果您看到event-1和event-2在“data”中都有不同的属性。所以考虑like数据是自由形式的字段,属性的名称可以相同/不同。
controlset会给我们执行触发器的指令。例如,触发条件可以是

(id = 100 && name = abc) OR (id =500 && date ="2020-07-10")

请帮助我,如果这种情况可能运行在Flink和什么可能是最好的方式。我不认为patterncep或sql在这里有帮助,也不确定事件数据流是否可以作为json对象,是否可以像json路径一样进行查询。

bgibtngc

bgibtngc1#

是的,这可以和Flink一起完成。cep和sql也没有帮助,因为它们要求在编译时知道模式。
对于事件流,我建议按id对该流进行键控,并将属性/值数据存储在keyed中 MapState ,这是一种键控状态,flink知道如何在必要时管理、检查点、恢复和重新缩放。这给了我们一个分布式Map,将idMap到包含每个id的数据的散列Map。
对于控制流,让我首先描述一个简化版本的解决方案,其中控制查询的形式如下

(id == key) && (attr == value)

我们可以简单地通过查询中的id(即key)为这个流设置密钥,并将这个流连接到事件流。我们将使用 RichCoProcessFunction 为了保持上面描述的mapstate,当这些查询到达时,我们可以查看key有哪些数据,并检查 map[attr] == value .
处理更复杂的查询,比如问题中的查询

(id1 == key1 && attr1 == value1) OR (id2 == key2 && attr2 == value2)

我们可以做更复杂的事情。
在这里,我们需要为每个控件查询分配一个唯一的id。
一种方法是将这些查询广播给 KeyedBroadcastProcessFunction 它再一次保持了上面描述的mapstate。在 processBroadcastElement 方法,每个示例都可以使用 applyToKeyedState 检查该示例为其存储键控状态的查询组件的有效性(从偶数流中的数据字段派生的attr/值对)。对于查询的每个键控组件,示例可以在其中提供请求的信息,它会向下游发出一个结果。
然后在 KeyedBroadcastProcessFunction 我们通过控制查询id对流进行键控,并使用 KeyedProcessFunction 将来自不同示例的所有响应集合在一起 KeyedBroadcastProcessFunction ,并确定控制/查询消息的最终结果。
在这里不需要使用广播,但是我发现这个方案更容易解释。但您可以改为只将查询的键控副本路由到 RichCoProcessFunction 为控件查询中使用的键保留mapstate,然后对最终结果执行相同的组装。
这可能很难理解。我所提出的方法包含两种我以前在示例中编写的技术:https://github.com/alpinegizmo/flink-training-exercises/blob/master/src/main/java/com/ververica/flinktraining/solutions/datastream_java/broadcast/taxiquerysolution.java 是一个使用广播触发跨键控查询 predicate 求值的示例州,和https://gist.github.com/alpinegizmo/5d5f24397a6db7d8f1b12a15eeca6 是一个在并行执行多个充实之后使用唯一id重新组装单个响应的示例。

相关问题