为什么以并行度= 1执行Flink作业会很糟糕?

时间:2020-05-15 06:00:21

标签: apache-flink flink-streaming flink-cep flink-sql flink-batch

我正在尝试了解提交Flink作业之前需要考虑哪些重要功能。

我的问题是并行度的数量是多少(物理上)?并行性如何影响我的工作绩效?

例如,我有一个CEP Flink作业可以检测来自非键流的模式,除非我使用KeyBy运算符对数据流进行分区,否则并行度将始终为1。

Plz如果我输入错误,请纠正我:

如果我对数据流进行分区,那么我将得到的并行度等于不同键的数量。但是问题在于模式匹配是针对每个键独立完成的,因此我无法定义一个模式,该模式需要来自具有不同键的2个分区的信息。

1 个答案:

答案 0 :(得分:0)

使用并行度= 1的Flink并不坏,但是它违反了使用Flink的主要目的(能够扩展)。

通常,您不应该拥有比内核更高的并行度(物理或虚拟取决于用例),因为您希望尽可能地使内核饱和。一切都会对您的性能造成负面影响,因为这需要更多的通信开销和上下文切换。通过横向扩展,您可以从网络中的分布式计算节点添加核心,这是使用大数据技术与手动编写应用程序相比的主要好处。

正如您所说,只有在对数据进行分区时才能使用并行性。如果您有一种需要所有数据的算法,则最终需要在一个内核上进行处理。但是,通常在将数据合并到最终核心之前,您可以并行进行大量预处理(过滤,转换)和部分聚合。例如,考虑简单地计算所有事件。您可以对每个分区的数据进行计数,然后在最后一步中简单地对部分计数求和,这几乎可以完美地扩展。

如果您的算法不允许拆分,则您的用例可能不允许分布式处理。在这种情况下,Flink不太适合。但是,值得探索的是替代算法(有时是近似算法)是否也能满足您的用例。这是将单片算法拆分为可并行化的子算法的数据工程技术。