如果运算符的总并行示例数高于flink系统的并行示例数,会发生什么情况?
以下是场景:
假设我有一个独立的flink应用程序,有一个jobmanager和一个taskmanager(有5个cpu)
我已经准备好了 taskmanager.numberOfTaskSlots=5
以及 parallelism.default=5
有2个数据源(假设两个不同的Kafka主题,每个主题有5个分区)
对所有操作员禁用链接策略
我的应用程序的数据流(我只有一个作业,其中包括两个kafka源):
kafkaSource1.map(Mapper1).sink(sink1);
kafkaSource2.map(Mapper2).sink(sink1);
在用5个并行度部署这个数据流之后,taskmanager会遭受过载吗?
据我所知,任务将分布到taskmanager的槽中,如下所示:
如果这是正确的图,在这个图中,每个插槽有2个不同的操作符示例。它将如何工作?它将以并行或顺序的方式工作(首先是kafka1->map1->sink1,然后是kafka2->map2->sink1)
如果不正确,它将如何工作,任务将如何分配到插槽?
1条答案
按热度按时间e3bfsja21#
图表是正确的。如果禁用操作符链接,则每个插槽将包含5个任务,如图所示。每个任务都有一个java线程,它将被阻塞在网络上,直到有输入要处理。所有这些任务都将独立、并行地运行。
但是,禁用操作符链接是一个非常糟糕的主意。您将为此付出巨大的性能代价,因为这将导致在不需要序列化/反序列化的地方发生序列化/反序列化(另外,如果Map程序只是从kafka进行反序列化,那么如果使用适当的kafkadeserializationschema并消除Map程序,您将获得更好的性能。)
任务管理器会过载吗?可能不会,前提是你在操作符链接等方面做出了很好的选择。我只会担心如果Map程序正在做一些异常昂贵的事情。但这在一定程度上取决于您需要实现的吞吐量。