【问题标题】:What happens if total parallel instances of operators are higher than the parallelism Flink Application?如果算子的并行实例总数高于 Flink 应用程序的并行度会怎样?
【发布时间】:2020-10-21 04:49:25
【问题描述】:

如果算子的并行实例总数高于 flink 系统的并行度会怎样?

这是场景:

  • 假设我有一个独立的 flink 应用程序,有 1 个 JobManager 和 1 个 TaskManager(有 5 个 CPU)
  • 我已经设置了taskmanager.numberOfTaskSlots=5parallelism.default=5
  • 有 2 个数据源(假设有两个不同的 kafka 主题,每个主题有五个分区)
  • 为所有运算符禁用链式策略
  • 我的应用程序的数据流(我只有一项工作,其中包括两个 kafka 源):
kafkaSource1.map(Mapper1).sink(sink1);
kafkaSource2.map(Mapper2).sink(sink1);

在以 5 并行部署此数据流后,TaskManager 是否会出现过载?

据我了解,Tasks 会像这样分散到 TaskManager 的插槽中:

  • 如果这是正确的图表,则在此图表中,每个插槽都有 2 个不同的运营商实例。它将如何运作?它将以并行或顺序方式工作(首先是 kafka1->map1->sink1,然后是 kafka2->map2->sink1)
  • 如果不正确,它将如何工作,任务将如何分配到插槽?

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    图表是正确的。如果禁用运算符链接,则每个插槽将包含 5 个任务,如图所示。每个任务都会有一个 Java 线程,它会一直阻塞在网络上,直到有输入要处理。所有这些任务都将独立并行运行。

    但是,禁用运算符链接是一个非常糟糕的主意。您将为此付出很大的性能损失,因为它会导致在不需要的地方发生序列化/反序列化。 (另外,如果映射器只是简单地从 Kafka 进行反序列化,那么如果您使用适当的 KafkaDeserializationSchema 并消除映射器,您将获得更好的性能。)

    任务管理器会超载吗?可能不会,前提是您对运算符链接等做出了正确的选择。我只会担心映射器正在做一些异常昂贵的事情。但这部分取决于您需要达到的吞吐量。

    【讨论】:

    • 大卫,我以为“每秒处理的记录数”会减少一半。因为 flink 网站上的所有示例都表明,每个 slot 只有一个不同的任务。但是在我的图片中,一个插槽包含不同的任务实例(kafka1-1,kafka2-1。-在 flink 的网站上,一个插槽包含 kafka1-1,另一个插槽包含 kafka2-1)。我对每秒处理的#records 是否正确?不:我对禁用chaning并不严格,可以设置也可以不设置。
    • 您必须对此进行基准测试以查看哪个更好。我的直觉是,最好将每个接收器分成两个接收器,以便每个槽包含两个独立的 kafka -> 映射器 -> 接收器链。这样每个链都可以有自己的线程,同时避免不必要的 ser/de。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多