传递两个流以使用Flink Job中的MainStream进行操作

时间:2020-06-03 05:00:23

标签: apache-flink flink-streaming

在Flink-Job中,目前,我有两个流,一个主要数据流是每分钟从Kafka主题更新的,另一个是流(广播流),它用于KeyedBroadcastProcessFunction的过程元素函数中,用于与主流数据进行某些计算。< / p>

现在我有一个新的要求,即添加一个与其他两个流在结构上完全不同的流。

1)如何传递必须处于Flink状态的第三流以及主要数据和广播状态数据一起进行计算?在keyedBroadcastProcess函数中?

2)我们可以有两个用于主要数据的广播流吗?

3)加入将不起作用,因为流数据是完全不同的数据,广播,并且第三数据流的更改频率不高。它类似于主数据,与主数据流一起用于计算 找不到任何解决方案,请提供帮助。请分享一些我可以参考的链接。

1 个答案:

答案 0 :(得分:1)

Flink不提供具有三个输入的任何过程功能。

您可以将两个广播流合并在一起(在广播之前)。我很欣赏它们是非常不同的类型,但是您总是可以找到使它们共存的方法。如果没有更自然的方法来统一这两种类型,则可以使用Either。要将两种不同的类型合并为一个流,可以执行以下操作:

DataStream<String> strings = env.fromElements("one", "two", "three");
DataStream<Integer> ints = env.fromElements(1, 2, 3);

DataStream<Either<String, Integer>> stringsOnTheLeft = strings
        .map(new MapFunction<String, Either<String, Integer>>() {
            @Override
            public Either<String, Integer> map(String s) throws Exception {
                return Either.Left(s);
            }
        });

DataStream<Either<String, Integer>> intsOnTheRight = ints
        .map(new MapFunction<Integer, Either<String, Integer>>() {
            @Override
            public Either<String, Integer> map(Integer i) throws Exception {
                return Either.Right(i);
            }
        });

DataStream<Either<String, Integer>> stringsAndInts = stringsOnTheLeft.union(intsOnTheRight);

或者,如果您可以在不同的阶段将广播流应用于主流,则可以有两个KeyedBroadcastProcessFunction函数的序列,其中一个输出馈入另一个:

events
    .keyBy(x -> x.foo)
    .connect(broadcast1)
    .process(new process1())
    .keyBy(x -> x.foo)
    .connect(broadcast2)
    .process(new process2())

更新:

如果我们像这样合并并广播,那么任何人的更新 流将更新广播状态,或者将创建一个新条目 处于广播状态?

这完全在您的控制之下。广播状态始终是地图状态;我想您会选择一种简单易用的键来使用,因此您将拥有MapState<String, Either<T1, T2>>之类的东西。映射状态的工作方式与任何哈希图一样:如果重用键,它将替换条目;如果引入新键,则将创建一个新条目。

... [I]如何为[广播]流提供这些密钥的通用密钥?

键不必相同,而必须是相同类型。