Mau*_*ino 4 parallel-processing partitioning apache-kafka apache-flink kafka-topic
我想在 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(...);
Run Code Online (Sandbox Code Playgroud)
(一)正确吗?另外,如果我想并行处理每个 Flink 分区,因为我只想按顺序处理按同一 Kafka 分区排序的事件,而不是全局考虑它们,(b) 我该怎么办?我知道该方法的存在setParallelism(),但我不知道在这种情况下将其应用到哪里。
我正在寻找有关标记(a)和(b)的问题的答案。先感谢您。
如果你能像这样构建它,它的性能会更好:
具体来说,我的建议是
设置整个作业的并行度与Kafka分区的数量完全匹配。然后每个FlinkKafkaConsumer实例将从一个分区中读取数据。
如果可能,请避免使用keyBy,并避免更改并行度。然后源、映射和接收器将全部链接在一起(这称为运算符链接),并且不需要序列化/反序列化,也不需要网络(在 Flink 内)。这不仅表现良好,而且您还可以利用细粒度恢复(极其并行的流作业可以恢复一个失败的任务,而不会中断其他任务)。
您可以编写一个通用的 EventMapper 来检查正在处理的事件类型,然后执行适当的操作。或者您可以尝试聪明地实现一个,RichMapFunction它open()可以确定正在处理哪个分区,并加载适当的映射器。
| 归档时间: |
|
| 查看次数: |
4052 次 |
| 最近记录: |