Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink Apache Flink RocksDB状态管理_Apache Flink_Flink Streaming - Fatal编程技术网

Apache flink Apache Flink RocksDB状态管理

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

我在同一份flink jobs中读了两个卡夫卡主题

  • Stream1
    :来自第一个主题的消息将保存到rocksdb,然后它将与stream2合并
  • Stream2
    :来自第二个主题的消息使用stream1保存的状态进行了丰富,然后它将与stream1合并
主题1和主题2是不同的来源,但两个来源的输出基本相同。我必须用topic1的数据来充实topic2的数据

这里是流动

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
    。在这种情况下,您必须在单个函数中处理来自所有流的元素,所以您必须手动实现对特定流元素的处理。