当前位置: 首页 > 知识库问答 >
问题:

ApacheFlink-将流平等地划分为输入Kafka主题

仲孙德惠
2023-03-14

我想在Apache Flink中实现以下场景:

给定一个具有4个分区的Kafka主题,我想使用不同的逻辑在Flink中独立处理分区内数据,具体取决于事件的类型。

特别是,假设输入Kafka主题包含前面图像中描述的事件。每个事件具有不同的结构:分区1具有字段“a”作为关键字,分区2具有字段“b”作为关键字,等等。在Flink中,我希望根据事件应用不同的业务逻辑,所以我认为我应该以某种方式分割流。为了实现图片中描述的内容,我想只使用一个消费者来做类似的事情(我不明白为什么我应该使用更多的消费者):

FlinkKafkaConsumer<..> consumer = ...
DataStream<..> stream = flinkEnv.addSource(consumer);

stream.keyBy("a").map(new AEventMapper()).addSink(...);
stream.keyBy("b").map(new BEventMapper()).addSink(...);
stream.keyBy("c").map(new CEventMapper()).addSink(...);
stream.keyBy("d").map(new DEventMapper()).addSink(...);

(a)正确吗?另外,如果我想并行处理每个Flink分区,因为我只对按顺序处理由同一个Kafka分区排序的事件感兴趣,而不是全局考虑它们,(b)我该怎么办?我知道方法setParallelism()的存在,但我不知道在这种情况下将其应用在哪里。

我正在寻找关于标有(a)和(b)的问题的答案。提前谢谢你。

共有1个答案

韦飞尘
2023-03-14

如果您能像这样构建它,它将执行得更好:

具体来说,我的建议是

> < li>

将整个作业的并行度设置为与Kafka分区的数量完全匹配。那么每个< code>FlinkKafkaConsumerhtml" target="_blank">实例将从一个分区中读取数据。

如果可能,避免使用< code>keyBy,并避免改变并行度。然后,源、映射和接收都将链接在一起(这称为操作符链接),并且不需要序列化/反序列化和联网(在Flink中)。这不仅性能良好,而且您还可以利用细粒度恢复(令人尴尬的并行流式作业可以恢复一个失败的任务,而不会中断其他任务)。

您可以编写一个通用的事件映射器,用于检查正在处理的事件类型,然后执行适当的操作。或者,您可以尝试聪明地实现一个RichMapFunction,该功能在其open()中找出正在处理的分区,并加载相应的映射器。

 类似资料:
  • 我从教程中创建了示例Kafka Streams应用程序: 不幸的是,这个应用程序不读取输入流。我有一个来自PostgreSQL的JDBC源连接器,它正在处理来自一个数据库的精细流数据(我可以在本主题中的Kafka Connect UI数据上看到)。 我的问题是,即使我在BOOTSTRAP\u SERVERS\u CONFIG的Properties IP is localhost中更改了IP,我也不

  • 我有一个要求加入3个Kafka主题。前两个主题A和B将使用inner join添加,因为消息键相同,并且生成一个POJO与B相同的新Kafka流。现在,使用这个累积的流,我需要加入另一个主题C,并且我需要根据C中存在的字段对输出进行分组。 到目前为止,我有以下方法: 前两个主题(A和B)的KStream-KStream inner join是否可以不发布任何主题的累积输出,并且仍然可以在下面使用它

  • 我们有一个传入的kafka主题,多个基于Avro模式的消息序列化到其中。 我们需要将Avro格式的消息拆分为多个其他kafka主题,基于某个公共模式属性的值。 想了解如何实现它,同时避免在汇流平台上构建中间客户端来进行这种拆分/路由。

  • 我正在使用Spring Cloud Stream Kafka Binder。我有以下Kafka活页夹函数。 在yml中,我有: 如果我想从同一个功能向两个不同的主题发送数据,我需要做什么?

  • 我知道在你的流中的任何时间点都可能发生再平衡。当它发生时,由于没有提交给定偏移量的最新偏移量,可能会发生事件的重新处理。 Kafka流是否允许在重新平衡发生之前完成任何飞行中处理?我的意思是,你的应用程序正在消耗一个记录(在你的过程方法内部),发生一个再平衡事件。该处理是否立即中止或允许处理方法完成? 一个具体的例子是 最后一次计算是否会在状态存储中结束并转发到接收器主题?因此,这意味着当重新平衡