如何在Flink中连接2个以上的流?

时间:2020-10-30 21:28:30

标签: apache-flink flink-streaming

我有3种不同类型的键控数据流。

DataStream<A> first;
DataStream<B> second;
DataStream<C> third;

每个流都有自己定义的处理逻辑,并在它们之间共享状态。我想将这3个流连接起来,以便在任何流中都有可用数据时触发各自的处理功能。可以连接两个流。

first.connect(second).process(<CoProcessFunction>)

由于类型不同,我不能使用并集(允许多个数据流)。我想避免创建包装器并将所有流转换为相同类型。

2 个答案:

答案 0 :(得分:2)

包装器方法还不错。您可以创建类似于Flink现有EitherOfThree<T1, T2, T3>的{​​{1}}包装类,然后在单个函数中处理这些记录的流。像这样:

Either<Left, Right>

Flink的 DataStream <EitherOfThree<A,B,C>> combo = first.map(r -> new EitherOfThree<A,B,C>(r, null, null)) .union(second.map(r -> new EitherOfThree<A,B,C>(null, r, null))) .union(third.map(r -> new EitherOfThree<A,B,C>(null, null, r))); combo.process(new MyProcessFunction()); 类具有更优雅的实现,但是对于您的用例,应该可以使用一些简单的方法。

答案 1 :(得分:1)

除联合以外,标准方法是在级联中使用connect,例如

from matplotlib.collections import LineCollection # ... line_interval = np.array([[rad_line_start], [rad_line_end]]) segments = np.array([xc + np.cos(theta) * line_interval, yc + np.sin(theta) * line_interval]).T lc = LineCollection(segments, colors='gold', lw=10) ax1.add_collection(lc)

您将无法在一个地方共享所有三个流之间的状态。无论后续流程功能需要什么,都可以输出第一个流程功能,但是第三个流将无法影响第一个流程功能的状态,这在某些用例中是一个问题。

另一种可能是利用较低级别的机制-参见FLIP-92: Add N-Ary Stream Operator in Flink。但是,此机制仅供内部使用(Table / SQL API将此机制用于n路联接),因此需要谨慎对待。有关详细信息,请参见mailing list discussion。我出于完整性的考虑而提及此问题,但我怀疑在接口进一步开发之前,这是一个好主意。

您可能还想看看stateful functions api,它克服了数据流api的许多限制。