当前位置: 首页 > 知识库问答 >
问题:

Apache Flink:具有并行性的有序时间戳

宇文曦
2023-03-14

我有一个数据流,其中事件的顺序很重要。时间特性设置为EventTime,因为传入记录中有时间戳。

为了保证排序,我将程序的并行度设置为1。当我的程序变得更复杂时,这会成为性能方面的问题吗?

如果我理解正确的话,我需要给我的事件分配水印,如果我想让流按时间戳排序的话。这很简单。但我读到即使这样也不能保证秩序?稍后,我想对那个流进行有状态计算。因此,为此我使用了一个FlatMap函数,它需要对流进行键控。但是如果我输入了流,顺序又会丢失。这是因为不同的流分区,这是由并行性“导致”的。

我有两个问题:

  • 我需要并行吗?这里需要考虑哪些因素?
  • 我如何用我上面描述的实现“有序并行”?

共有1个答案

燕翼
2023-03-14

需要考虑以下几点:

将整个作业的并行度设置为1将防止扩展应用程序,从而影响性能。这是否真正重要取决于您的应用程序需求,但这肯定是一个限制,可能是一个问题。

如果您提到的聚合是要在所有事件记录中全局计算的,那么并行操作将需要并行执行一些预聚合。但是在这种情况下,您必须在作业图的后期将并行度降低到1,以便产生最终(全局)结果。

另一方面,如果要为某个键的每个值独立计算这些聚合,那么考虑对流进行键控并使用该分区作为并行操作的基础是有意义的。

您提到的所有操作都需要某种状态,无论是计算最大值、最小值、平均值还是正常运行时间和停机时间。例如,如果不记住目前遇到的最大值,就无法计算最大值。

如果我正确理解了Flink的NiFi源连接器的工作原理,那么如果源是并行操作的,那么对流进行键控将导致无序事件。

但是,您提到的任何操作都不需要按顺序传递数据。计算无序流的正常运行时间(和停机时间)将需要一些缓冲 - 这些操作需要等待无序数据到达才能产生结果 - 但这当然是可行的。这正是水印的用途;它们定义了等待无序数据的时间。可以使用 ProcessFunction 中的事件时间计时器来安排在处理完所有早期事件时调用 onTimer 回调。

你总是可以对键控流进行排序。这里有一个例子。

正常运行时间/停机时间的计算应该很容易使用Flink的CEP库(顺便说一句,它对输入进行排序)。

更新:

确实,在将ProcessFunction应用于已设置密钥的流之后,该流不再设置密钥。但在这种情况下,您可以安全地使用reinterpretAsKeyedStream通知Flink流仍为键控流。

至于CEP,这个库代表您使用状态,使得开发需要对模式做出反应的应用程序变得更加容易。

 类似资料:
  • 你能给我一些关于表的主键操作在Oracle中具有时间有效性的一些看法吗? 我创建了一个具有以下架构的表 是因为Oracle实际上并不关心主键上的有效期列吗? 提前道谢!

  • 我有一个表示当前状态对象“cell”列表。 我知道并行解决一个问题总是需要一个开销。在这种情况下,它在我的循环中加速。你能推荐什么方法来加速我的循环?

  • 问题内容: 我正在尝试从数据库表中仅选择今天的记录。 目前我使用 但这需要过去24小时的结果,我需要它只选择今天的结果,而忽略时间。如何仅根据日期选择结果? 问题答案: 使用和 我想 使用 仍然使用INDEX 。 在演示中查看执行计划

  • 我创建了两个表,如下所示: 这个剧本成功地完成了。但是,我在插入数据时遇到问题: 我在父表中执行了以下两个insert语句: 我打算使用这个period for特性来捕获记录的更改历史,作为闪回的替代方法。但是,这是否意味着在这种情况下我不应该使用主键? 提前道谢!

  • 我试图实现每个组的并行性,其中分组元素并行运行,组内每个元素按顺序工作。然而,对于下面的代码,第一个emit使用并行线程,但对于后续emit,它使用一些不同的线程池。如何实现组的并行性和组内元素的顺序执行。 日志