Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Java apache flink中两个以上流的联合_Java_Apache Kafka_Apache Flink_Flink Streaming - Fatal编程技术网

Java apache flink中两个以上流的联合

Java apache flink中两个以上流的联合,java,apache-kafka,apache-flink,flink-streaming,Java,Apache Kafka,Apache Flink,Flink Streaming,我有一个关于ApacheFlink中两个以上流的联合的架构问题 我们有三个甚至更多的流,它们是我们可以使用的某种代码书 必须丰富主流。 代码书流是压缩的卡夫卡主题。代码本是不会改变的东西 经常(如货币)。主流是一个快速的事件流。 我们的目标是用代码书丰富主流 在我看来,有三种可能的方法: 将所有代码集合并,然后将其与主流连接并存储 浓缩数据为托管、键控状态(因此,当来自kafka的压缩事件过期时,我有 保存在状态中的代码本)。这是我现在唯一想做的事。 反序列化Kafka主题消息,以JSON格式发

我有一个关于ApacheFlink中两个以上流的联合的架构问题

我们有三个甚至更多的流,它们是我们可以使用的某种代码书 必须丰富主流。 代码书流是压缩的卡夫卡主题。代码本是不会改变的东西 经常(如货币)。主流是一个快速的事件流。 我们的目标是用代码书丰富主流

在我看来,有三种可能的方法:

  • 将所有代码集合并,然后将其与主流连接并存储 浓缩数据为托管、键控状态(因此,当来自kafka的压缩事件过期时,我有 保存在状态中的代码本)。这是我现在唯一想做的事。 反序列化Kafka主题消息,以JSON格式发送到POJO,如货币、组织单位等。 我用所有代码书制作了一个大包装类CodebookData,例如:
  • 接下来,我将每个卡夫卡主题的传入流映射到此包装器类,然后创建一个联合:

    DataStream<CodebookData> enrichedStream = mappedCurrency.union(mappedOrgUnit).union(mappedCustomer);
    
    我在这里停止了,因为我无法将此代码本流与主流连接起来并将代码本数据保存在值状态。我的代码本数据中没有唯一的外键,因为每个代码本都有自己的外键与主流连接,例如,货币有currencyId、organizationUnit orgID等。 我想做这样的事

    CodebookData{
    Currency{populated with data},
    OrganizationUnit=null,
    Customer=null
    }
    CodebookData{
    Curenncy=null,
    OrganizationUnit={populated with data},
    Customer=null
    }
    ...
    
    SingleOutputStreamOperator<CanonicalMessage> enrichedMainStream = mainStream
                .connect(enrichedStream)
                .keyBy(?????)
                .process(new MyKeyedCoProcessFunction());
    
    SingleOutputStreamOperator enrichedMainStream=主流
    .连接(enrichedStream)
    .keyBy(???)
    .process(新的MyKeyedCoProcessFunction());
    
    在myProcessFunction中,我将创建CodebookData类型的ValueState

    这是完全错误的还是我可以用它做点什么,如果它是我做错的两倍

  • 第二种方法是将一系列两个输入协处理函数运算符与每个kafka事件源级联,但我在某个地方读到这不是最佳方法

  • 第三种方法是广播状态,我不太熟悉。现在我看到了问题,如果我使用RocksDb进行检查点和保存点,我不确定是否可以使用广播状态


  • 我是否应该使用我目前正在努力的方法1中的其他方法?

    在许多情况下,您需要这样做几个独立的扩展联接,更好的模式是使用扇入/扇出方法,并并行执行所有联接

    类似这样的情况,在确保主流上的每个事件都有一个唯一的ID之后,您可以创建每个事件的3个或更多副本:

    然后,您可以按任何适当的方式为每个副本设置密钥—货币、组织单位等(或者我从中获取此图的示例中的客户、IP地址和商户)—然后将其连接到适当的cookbook流,并独立计算每个双向联接

    然后将这些并行连接结果流合并在一起,按添加到每个原始事件的随机nonce键,并将结果粘合在一起

    现在在三条流的情况下,这可能过于复杂了。在这种情况下,我可能只需要执行一系列三个双向联接,一个接一个,每次都使用keyBy和connect。但在某些情况下,随着时间的延长,以这种方式构建的管道往往会遇到性能/检查点问题


    这里有一个在中实现此扇入/扇出模式的示例。

    在许多情况下,您需要这样做几个独立的扩展联接,更好的模式是使用扇入/扇出方法,并并行执行所有联接

    类似这样的情况,在确保主流上的每个事件都有一个唯一的ID之后,您可以创建每个事件的3个或更多副本:

    然后,您可以按任何适当的方式为每个副本设置密钥—货币、组织单位等(或者我从中获取此图的示例中的客户、IP地址和商户)—然后将其连接到适当的cookbook流,并独立计算每个双向联接

    然后将这些并行连接结果流合并在一起,按添加到每个原始事件的随机nonce键,并将结果粘合在一起

    现在在三条流的情况下,这可能过于复杂了。在这种情况下,我可能只需要执行一系列三个双向联接,一个接一个,每次都使用keyBy和connect。但在某些情况下,随着时间的延长,以这种方式构建的管道往往会遇到性能/检查点问题


    这里有一个实现这种扇入/扇出模式的示例。

    谢谢,这很有效。我想知道您是否有关于使用一系列连接连接时出现的性能差/检查点问题的链接?我无法指出任何公开的示例,但我见过一些公司,他们每个公司都构建了一个连接连接链,长度超过10个连接。他们对这种方法都有一些问题。谢谢,这很有效。我想知道您是否有关于使用一系列连接连接时出现的性能差/检查点问题的链接?我无法指出任何公开的示例,但我见过一些公司,他们每个公司都构建了一个连接连接链,长度超过10个连接。他们对这种方法都有一些问题。
    SingleOutputStreamOperator<CanonicalMessage> enrichedMainStream = mainStream
                .connect(enrichedStream)
                .keyBy(?????)
                .process(new MyKeyedCoProcessFunction());