Apache flink多线程/并行执行

时间:2018-03-08 09:25:44

标签: java apache-flink stream-processing

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

对象1 - > “状态”: “有效”

Object2 - > “状态”: “空闲”

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

Object4 - > “状态”: “有效”

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

请建议我如何在Apache Flink中执行此操作。伪代码和链接会有所帮助。

2 个答案:

答案 0 :(得分:0)

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

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

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

随着为它们创建新的密钥流,动态处理任何新密钥(状态)。

探索documentation以实现目的。

答案 1 :(得分:0)

根据您的描述,我相信您需要首先拥有一个并行度为1的运算符,即" chunk"国家的事件,并添加一个"块ID"到输出记录。每当您获得具有新状态的事件时,您都会增加块ID。

然后键入chunk id,它将并行化下游处理。添加由块ID键控的自定义函数,窗口持续时间为10分钟。这是您进行大量数据处理的地方。

正如上面提到的@narush,你应该阅读他链接的文档,这样你才能理解Windows在Flink中的运作方式。