Apache flink Apache Flink RocksDB状态管理
我在同一份flink jobs中读了两个卡夫卡主题Apache flink Apache Flink RocksDB状态管理,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我在同一份flink jobs中读了两个卡夫卡主题 Stream1:来自第一个主题的消息将保存到rocksdb,然后它将与stream2合并 Stream2:来自第二个主题的消息使用stream1保存的状态进行了丰富,然后它将与stream1合并 主题1和主题2是不同的来源,但两个来源的输出基本相同。我必须用topic1的数据来充实topic2的数据 这里是流动 val stream1 = readKafkaTopic1().keyBy(_.memberId).map(saveMemberD
:来自第一个主题的消息将保存到rocksdb,然后它将与stream2合并Stream1
:来自第二个主题的消息使用stream1保存的状态进行了丰富,然后它将与stream1合并Stream2
val stream1 = readKafkaTopic1().keyBy(_.memberId).map(saveMemberDetailsToRocksDB)
val stream2 = readKafkaTopic2().keyBy(_.memberId).map(readMemberDetailsAndEnrich)
stream1.union(stream2).addSink(kafkaProducer)
以下是问题
stream2
能否访问由stream1
为同一memberId
保存的状态似乎您应该能够通过使用
KeyedCoProcessFunction
实现您想要的目标。这或多或少是这样的:
stream1
.keyBy(_.memberId)
.connect(stream2.keyBy(_.memberId))
.process(new CustomKeyedCoProcessFunction())
通过这种方式,您可以将状态保持在单个键控协处理函数中,这样您就可以访问stream1
和stream2
的状态
所以,对于processElement1
您可以在map
中为stream1
执行与在processElement2
中为stream2执行相同的操作。似乎您应该能够通过使用键控协处理函数
。这或多或少是这样的:
stream1
.keyBy(_.memberId)
.connect(stream2.keyBy(_.memberId))
.process(new CustomKeyedCoProcessFunction())
通过这种方式,您可以将状态保持在单个键控协处理函数中,这样您就可以访问stream1
和stream2
的状态
所以,对于processElement1
您可以在map
中为stream1
和processElement2
执行与在map
中为stream2执行相同的操作。您的意思是手动使用RocksDB还是仅使用由RocksDB支持的Flink状态是由RocksDb支持,而不是手动你的意思是手动使用RocksDb还是只使用由RocksDb支持的Flink state?由RocksDb支持的Flink state,而不是手动使用这很酷。那么,如果我想添加像stream2这样的新流呢?我想我可以连接3条不同的河流?你不能。您必须分两个单独的步骤执行此操作,因此首先将stream1
连接到stream2
,然后将其结果连接到stream3
。如果您要连接更多的流,那么您可以尝试的一个技巧是简单地使用union
所有流,然后使用.keyBy(uu.memberId)
并最终调用process
。在这种情况下,您必须在单个函数中处理来自所有流的元素,所以您必须手动实现对特定流元素的处理。那么,如果我想添加像stream2这样的新流呢?我想我可以连接3条不同的河流?你不能。您必须分两个单独的步骤执行此操作,因此首先将stream1
连接到stream2
,然后将其结果连接到stream3
。如果您要连接更多的流,那么您可以尝试的一个技巧是简单地使用union
所有流,然后使用.keyBy(uu.memberId)
并最终调用process
。在这种情况下,您必须在单个函数中处理来自所有流的元素,所以您必须手动实现对特定流元素的处理。