开发者社区> 问答> 正文

带有并行性的有序时间戳

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

为了保证订购,我将程序的并行性设置为1.当我的程序变得更复杂时,这会成为一个问题吗?

如果我理解正确,我需要为我的事件分配水印,如果我想保持按时间戳排序的流。这很简单。但我正在读,即使这不保证秩序?稍后,我想对该流进行有状态计算。因此,为此,我使用FlatMap函数,该函数需要对流进行键控。但是,如果我键入流,则订单会再次丢失。 AFAIK这是因为不同的流分区,这是由并行性“引起的”。

我有两个问题:

我需要并行吗?我需要考虑哪些因素?
我将如何实现上述“有序并行”?"

展开
收起
flink小助手 2018-11-28 16:03:59 2007 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    "需要考虑以下几点:

    将整个作业的并行度设置为1将阻止扩展应用程序,这将影响性能。这实际上是否重要取决于你的应用要求,但它肯定是限制,可能是一个问题。

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

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

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

    如果我正确理解Flink的NiFi源连接器是如何工作的,那么如果源并行运行,则键入流将导致无序事件。

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

    你始终可以对键控流进行排序。这是一个例子。

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

    更新:

    确实,在将ProcessFunction应用于键控流之后,流不再是键控的。但在这种情况下,您可以安全地使用reinterpretAsKeyedStream来通知Flink流仍然是键控的。

    对于CEP,此库代表你使用状态,从而可以更轻松地开发需要对模式做出反应的应用程序。"

    2019-07-17 23:16:48
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载