我试图了解在提交 Flink 作业之前需要考虑哪些重要功能。
我的问题是并行数是多少,是否有上限(物理上)?并行性如何影响我的工作绩效?
例如,我有一个 CEP Flink 作业,它从非键控流中检测模式,并行数将始终为 1,除非我使用 KeyBy 运算符对数据流进行分区。
如果我错了,请纠正我:
如果我对数据流进行分区,那么我将拥有等于不同键的数量的并行度。但问题是模式匹配是针对每个键独立完成的,因此我无法定义需要来自具有不同键的 2 个分区的信息的模式。
我试图了解在提交 Flink 作业之前需要考虑哪些重要功能。
我的问题是并行数是多少,是否有上限(物理上)?并行性如何影响我的工作绩效?
例如,我有一个 CEP Flink 作业,它从非键控流中检测模式,并行数将始终为 1,除非我使用 KeyBy 运算符对数据流进行分区。
如果我错了,请纠正我:
如果我对数据流进行分区,那么我将拥有等于不同键的数量的并行度。但问题是模式匹配是针对每个键独立完成的,因此我无法定义需要来自具有不同键的 2 个分区的信息的模式。
使用并行度 = 1 的 Flink 还不错。但它违背了使用 Flink 的主要目的(能够扩展)。
通常,您不应该拥有比核心更高的并行度(物理或虚拟取决于用例),因为您希望尽可能地使核心饱和。超出此范围的任何事情都会对您的性能产生负面影响,因为它需要更多的通信开销和上下文切换。通过横向扩展,您可以从网络中的分布式计算节点添加内核,这是使用大数据技术与手动编写应用程序相比的主要优势。
正如您所说,如果您对数据进行分区,您只能使用并行性。如果您有一个需要所有数据的算法,您最终需要在一个核心上处理它。但是,通常您可以在最终核心合并数据之前并行执行大量预处理(过滤、转换)和部分聚合。例如,考虑简单地计算所有事件。您可以计算每个分区的数据,然后在最后一步简单地总结部分计数,这几乎可以完美地扩展。
如果您的算法不允许将其拆分,那么您的用例可能不允许分布式处理。在这种情况下,Flink 并不合适。但是,如果替代算法(有时是近似算法)也足以满足您的用例,则值得探索。这是将单一算法拆分为可并行化子算法的数据工程艺术。