生产环境检查清单

生产环境检查清单

生产环境检查清单的目的是,当发布Flink任务到生产环境时,清单提供简要概述一些重要且需要仔细考虑配置项。大多数参数Flink在安装时提供了的默认设置,使Flink的使用和采用更加容易。对于大多数用户和场景,那些默认参数是一个好的起点,完全适用于一次性的任务。

然而,一旦计划将Flink应用程序发布到生产环境,对配置的要求就会提高。例如,如果需要(重新)扩展或升级Flink任务,又或者升级Flink的版本。

下文中,我们将介绍一系列配置选项,发布到生产环境前,必须先检查这些配置选项。

设置 operator 的最大并行度

最大并行度是Flink 1.2中新引入的配置参数,对Flink任务(重新)扩展性具有重要的意义。该参数可以对每个job和/或每个 operator 的粒度来设置您可以扩展operator的最大并行度。需要知道的是一旦任务运行后,将没有办法改变这个参数,除非完全重新启动你的任务(比如重一个新状态开始,而不是来自先前的checkpoint/savepoint)。

即使 Flink 将来可能提供一些方法来改变现有savepoints的最大并行度,但是你需要知道的是,对于大状态的改变将会消耗很长的时间来运行,我们应该避免这种操作。在这一点上,您可能想知道为什么不给该参数设置一个非常大的默认值。原因在于非常大的并行度可能会对你的应用程序的性能甚至状态大小产生一些影响。因为Flink必须维护一定元数据来保证它有重新伸缩的能力,这可以通过最大的并行性来增加。一般来说,你应该选择一个最大的并行度足以保证你的未来的可扩展性需求,但保持尽可能低的值可以提供略微更好的性能。尤其是,最大并行度高于128通常会导致 keyed backends 产生稍微更大的状态快照。

请注意,最大并行度必须满足以下条件:

0 < 并行度 <= 最大并行度 <= 2^15

可以通过 setMaxParallelism(int maxparallelism) 设置最大并行度。 默认情况下,Flink任务首次启动时会选择最大并行度作为并行性的函数:

  • 128 : 并行度小于128时.
  • MIN(nextPowerOfTwo(parallelism + (parallelism / 2)), 2^15) : 并行度大于128时.

给 operators 设置 UUID

savepoints的文档中所述, 用户应该为给 operator 设置 uid。这些operator 的 uid 对 flink 中 operator states 和 operators 对应关系很重要, 这点反过来对于savepoints是至关重要的。默认情况下,operator 的 uid 通过遍历JobGraph和Hash 特定operator 的属性来生成的。 虽然从用户的角度来看,这是很舒适的,但它也非常脆弱,因为对JobGraph的更改(例如,交换operator)将导致产生新的UUID。 为了建立稳定的映射,我们需要用户来通过 setUid(String uid) 来设定稳定的operator uid。

选择state backend

目前,Flink有一个局限性,它只能从保存点的同一状态后端 恢复到的savepoint的state。 例如,这意味着我们无法使用内存的state backend做savepoint,因此任务更改为使用RocksDB tate backend并进行还原。 虽然我们计划在不久的将来使 backend 间可以交互,但现在还没有实现。 这也意味着在生产环境中,应该仔细考虑给你的任务使用对应的backend。

一般来说,我们建议使用RocksDB,因为这是目前唯一的一种state backend能够支持大状态(state)(例如,状态(state)超过可用主内存)和异步快照。 根据我们的经验,异步快照对于大型状态(state)非常重要,因为它们不会阻塞 operator ,Flink可以在不停止流处理的情况下写入快照(snapshot)。 然而,RocksDB的性能可能会比例如基于内存的 state backend 要差。 如果能保证你的状态(state)永远不会超过主内存,也不阻碍数据流的写入,它就不是问题, 你可以考虑来使用RocksDB backend。 但是,在这一点上,我们强烈建议生产环境中使用RocksDB。