【问题标题】:Apache flink multi-threading/parallel executionApache flink 多线程/并行执行
【发布时间】:2018-03-08 09:25:43
【问题描述】:

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

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

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

Object3 -> "State":"Blocked"

Object4 -> “状态”:“活动”

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

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

【问题讨论】:

  • 您的处理逻辑是否因州而异? 'State' 的值是否仅限于上述 4 种之一,还是可以动态存在多个状态?
  • @narush 处理逻辑相同,目前状态有限,但未来可能会增加。

标签: java apache-flink stream-processing


【解决方案1】:

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

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

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

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

探索documentation 以实现实现目的。

【讨论】:

  • 感谢 narush 的回答。您能告诉我如何在有限的时间内(例如 10 分钟)继续获取输入并执行每个线程/键。我是 flink 的新手,只知道它的基本知识。
  • 无论如何,你都会继续输入特定的 keyedstream,直到你有 JSON 对象进入。如果你想在特定时间后执行一些操作,Flink 的窗口就会出现。请阅读维护良好的documentation 了解更多信息。
【解决方案2】:

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

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

正如上面提到的@narush,你应该阅读他链接到的文档,这样你才能了解 Windows 在 Flink 中是如何工作的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2017-09-09
    • 2016-05-28
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多