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

Flink如何使用联合运算符处理水印?

仲孙宇定
2023-03-14

我读到了四个Kinesis流的数据。每个流中的数据都是不同的数据类型。读取所有四个流后,我分配时间戳和水印,并聚合来自每个流的数据。四个聚合的结果都是使用相同的泛型对象输出的。我想合并四个流的结果,这样我就可以将合并后的流发送到一个ProcessFunction。这基本上允许我像使用CoProcessFunction一样使用ProcessFunction,但我可以处理来自两个以上流的数据(在本例中,ProcessFunction将接收来自所有四个单独流的聚合)。

另外:如果泛型对象的联合由于水印问题而不能工作,那么当Flink只支持两个流的CoProcessFunction时,组合四个不同聚合的结果的最佳方法是什么?

共有1个答案

干亮
2023-03-14

将2个以上的流连接在一起的另一种方法是建立一个树,进行成对连接,直到所有的流都连接在一起。要么作为一棵平衡的树,像这样:

A--->
     A+B---->
B--->

            A+B+C+D------------>

C--->
     C+D---->
D--->

或者一次添加一个流,如下所示:

a--->
     a+b--->
b--->
            a+b+c--->
     c----->
                     a+b+c+d--->
            d------->

FWIW,FLIP-92是一个为Flink添加N元流运算符的提议,但即使实现了,它也可能不是用户可见的,至少一开始是这样的。

 类似资料:
  • Flink源函数引入水印,这些水印向下传递给下游操作符,根据这些操作符可以执行不同的基于时间的操作。对于使用多个流的操作员,将传入水印的最小值视为此时操作员的水印。 将源流拆分为多个逻辑流,然后将这些逻辑流传递给下游操作员(例如处理函数)。 Eg. 假设Process函数有4个子任务(例如),并且有100个关键组(假设),每个子任务处理25个关键组,即,等等。 如果从下午5点开始DriverStr

  • 有2个指定了时间戳的数据流和定义如下的水印生成器。 当这两个流在一个操作符中连接时,来自streamA或streamB的最小水印作为连接操作符的水印。 组合B运算符的水印是A或B中的最小值。基于C类元素是否标记为延迟。 但是,由于我们没有附加任何分配给的时间戳,这是否意味着运算符中的任何元素都没有被标记为延迟?因此在C上窗口不会有任何延迟记录被删除? 假设我们将分配的时间戳和水印生成器附加到C,如

  • 主要内容:算术运算符,关系运算符,逻辑运算符,赋值运算符,按位运算符运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。 在批处理脚本中,以下类型的操作符是可以执行的。 算术运算符 关系运算符 逻辑运算符 赋值运算符 按位运算符 算术运算符 批处理脚本语言支持任何语言的普通算术运算符。 以下是可用的算术运算符。 算术运算符示例 运算符 描述 示例 两个操作数相加 的结果为: 从第一个减去第二个操作数 的结果为: 两个操作数的乘法 的结果为: 分母除以分子 的结

  • 我想使用Flink的事件时间戳,并计划实现一个简单的emitWatermark,即系统。currentTimeInMillis-10秒。我的理解是,翻滚窗口将触发start\u time window\u间隔10秒。因此,如果事件晚于水印到达,则会删除这些事件。 有没有办法将Flink丢弃的所有事件写入S3这样的接收器?

  • 然后需要对图进行处理/搜索,并可能向下游发出事件。我希望图运算符能够水平伸缩,即每个并行运算符处理图的一个子集(但这将要求每个运算符能够访问整个图)。我感兴趣的是如何将负载分散到所有并行运算符上。 我想我可以使用来确保每个键控操作符的所有输出都发送给每个下游操作符。 获取一个对象流,在内部状态中创建一个图,并可选地生成一个对象流。我希望每个并行运算符处理图的一个子集。不管存在的运算符的并行实例的数

  • 我有一个时间窗口,我尝试确定我是否在一段时间内获得一个新的密钥。我正在通过kafka推送数据,当我调试它时,我看到数据到达方法,但它没有到达方法,并且没有被收集器收集。我正在使用来分配水印: 如有任何协助,我将不胜感激