Apache flink FLINK,基于JSON动态输入数据的触发器事件(如映射对象数据)

Apache flink FLINK,基于JSON动态输入数据的触发器事件(如映射对象数据),apache-flink,flink-streaming,flink-cep,flink-sql,flink-batch,Apache Flink,Flink Streaming,Flink Cep,Flink Sql,Flink Batch,我想知道FLINK是否能支持我的要求,我已经阅读了很多文章,但不确定我的案件是否能得到解决 案例: 我有两个输入源。a) 事件b)控制集 事件样本数据为: event 1- { "id" :100 "data" : { "name" : "abc" } } event 2- { "id" :500 "data&q

我想知道FLINK是否能支持我的要求,我已经阅读了很多文章,但不确定我的案件是否能得到解决

案例: 我有两个输入源。a) 事件b)控制集 事件样本数据为:

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

event 2-
{
   "id" :500
   "data" : {
             "date" : "2020-07-10";
             "name" : "event2"
            }
}
如果您看到事件1和事件2在“数据”中都有不同的属性。因此,考虑数据是自由形式的字段,属性的名称可以是相同的/不同的。 ControlSet将为我们提供执行触发器的指令。例如,触发条件可以是

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

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

是的,这可以通过Flink完成。CEP和SQL没有帮助,因为它们要求在编译时知道模式

对于事件流,我建议通过id为该流设置密钥,并将属性/值数据存储在keyed
MapState
中,这是一种keyed状态,Flink知道如何根据需要管理、检查点、恢复和重新缩放。这为我们提供了一个分布式映射,将id映射到包含每个id的数据的哈希映射

对于控制流,让我首先描述一个简化版本的解决方案,其中控制查询的形式如下

(id == key) && (attr == value)
我们可以简单地通过查询中的id(即key)为这个流设置密钥,并将这个流连接到事件流。我们将使用
RichCoProcessFunction
保存上述映射状态,当这些查询到达时,我们可以查看键的数据,并检查
map[attr]==value

处理更复杂的查询,如问题中的查询

(id1 == key1 && attr1 == value1) OR (id2 == key2 && attr2 == value2)
我们可以做更复杂的事情

在这里,我们需要为每个控件查询分配一个唯一的id

一种方法是将这些查询广播到一个
KeyedBroadcastProcessFunction
,该函数再次保持上述MapState。在
processBroadcastElement
方法中,每个实例都可以使用
applyToKeyedState
检查查询组件的有效性,该实例正在为其存储键控状态(从偶数流中的数据字段派生的属性/值对)。对于查询的每个键控组件,实例可以提供请求的信息,它会在下游发出一个结果

然后在
KeyedBroadcastProcessFunction
之后,我们通过控制查询id对流进行键控,并使用
KeyedProcessFunction
将来自
KeyedBroadcastProcessFunction
各个实例的所有响应组合在一起,并确定控制/查询消息的最终结果

这里并没有必要使用广播,但我发现这个方案更容易解释。但是,您可以将查询的键控副本路由到只包含控件查询中使用的键的MapState的
RichCoProcessFunction
实例,然后对最终结果执行相同的组装


这可能很难做到。我提出的方法涉及到组合两种我以前在示例中编写过的技术:一种是使用广播触发跨键控状态查询谓词求值的示例,并且是一个在并行执行多个充实后使用唯一id重新组装单个响应的示例。

这些触发条件是在编译时提供的还是在应用程序运行时提供的?在查询中如何使用id有固定的模式吗?您是否需要扩展它以使其并行运行?感谢David的快速回复,是的,这些条件将在运行时出现,如果支持并行,那就太好了!!但挑战是“数据”中的不可预测事件数据属性(类似于地图数据)。抱歉,我之前的评论被错误删除:(…我尝试按照您提到的方法或按照您的回购协议执行,但如果其中任何一个事件或控件是慢蒸汽,则它开始抛出NPE,以检查每个新控件或事件的条件。在我的情况下,当FLink启动时,它将一次获得所有控件集,并且事件将继续出现。控件集可能在d期间出现是的,但频率会非常低。我遗漏了什么吗?另外,标量函数是否会对此有所帮助?对于事件之前出现的控制消息,您可以将来自控制流的消息存储为键控或广播状态(取决于它们的通信方式),然后在新事件到达时使用它们。我不理解您关于标量函数的问题。好吧,在阅读本文并使用ScalarFunction时,我们可以定义自己的函数并将其注册到表env中。然后它将有助于查询映射数据类型的数据。