首页 > 解决方案 > 如何同时处理具有不同数据类型的 DataStream

问题描述

假设我有一个处理 aDataStream<X>并将返回值发送到 DB 的函数,但是我需要从另一个源读取,并且在处理这个新的 DataStream 时,我需要找到在将其存储DataStream<X>到 DB 之前可以生成的状态和找到它进入的一个 ID,DataStream<Y>然后触发一个动作。

我的问题是:

Co-ProcessFunction是否可以通过在 Flink 中使用例如 a来处理转换的结果DataStream<X>并在那里创建状态,同时处理DataStream<Y>在同一个运算符中具有状态和新流?

如果第一个问题完全错误,这是可能的,有什么办法可以做我需要做的吗?

希望有人能理解我需要做什么。

这是我需要做的图形概念。 在此处输入图像描述

标签: javaapache-flinkflink-streamingflink-cep

解决方案


是的,可以连接两个不同类型的流,并使用共享状态一起处理它们。

为了与 连接Stream<X>Stream<Y>让它们共享状态,您必须定义键选择器函数,该函数返回两个流的等效键。(就像在 SQL 中一样,为了连接两个表,您必须描述如何连接它们。)

在这个伪代码中,anotherFlinkFunction是一个RichCoFlatMapFunction. 我假设id当流 X 和流 Y 中的项目应该组合时,两个流都有一个具有相同值的字段。

x = env.addSource(...);
xTransformed = x.flatMap(...);
xTransformed.addSink(DB);

y = env.addSource(...);

z = xTransformed
  .connect(y)
  .keyBy(xt->xt.id, y->y.id)
  .flatMap(new anotherFlinkFunction());

z.addSink(...);

您可以在https://ci.apache.org/projects/flink/flink-docs-stable/learn-flink/etl.html#example的 Apache Flink 培训教程和 https 的随附练习中找到相关示例: //github.com/apache/flink-training/tree/master/rides-and-fares


推荐阅读