0

输入流由 JSON 对象数组格式的数据组成。每个对象都有一个名为state的字段/键,我们需要通过它来分隔输入流,请参见下面的示例

对象1->“状态”:“活动”

对象2->“状态”:“空闲”

对象 3 ->“状态”:“阻塞”

对象4->“状态”:“活动”

我们必须在收到特定状态后立即开始处理/线程,如果新状态与前一个状态相似,则继续获取数据,让前一个线程处理它,否则为新状态启动一个新线程。此外,需要在有限时间内运行每个线程,并且所有线程应该并行运行。

请建议我如何在 Apache Flink 中做到这一点。伪代码和链接会有所帮助。

4

2 回答 2

0

这可以通过 Flink 的 Datastream API 来完成。每个 JSON 对象都可以被视为一个元组,可以使用任何Flink Operators对其进行处理。

               /----- * *  | Active
------ (KeyBy) ------ *    | Idle
               \----- *    | Blocked

现在,您可以使用 KeyBy 运算符将单个数据流拆分为多个流。该运算符将具有特定键(在您的情况下为状态)的所有元组拆分并组合在一起,形成一个并行处理的键控流。在内部,这是通过散列分区实现的。

任何新的密钥(状态)都会在为它们创建新的密钥流时动态处理。

探索用于实施目的的文档。

于 2018-03-08T10:48:07.570 回答
0

根据您的描述,我相信您首先需要一个并行度为 1 的运算符,按状态“分块”事件,并在输出记录中添加一个“块 ID”。每当您收到具有新状态的事件时,您都会增加块 ID。

然后通过块 id 键入,这将并行化下游处理。添加一个自定义函数,该函数以块 ID 为键,窗口持续时间为 10 分钟。这是您的大部分数据处理将发生的地方。

正如@narush 上面提到的,您应该阅读他链接到的文档,以便了解 Windows 在 Flink 中的工作方式。

于 2018-03-08T23:49:47.623 回答