

# 生产准备清单

> 译者：[flink.sojb.cn](https://flink.sojb.cn/)


## 生产准备清单

此生产准备清单的目的是提供重要的配置选项概述，如果您计划将Flink作业投入**生产**，则需要**仔细考虑**。对于大多数这些选项，Flink提供开箱即用的默认设置，以便更轻松地使用和采用Flink。对于许多用户和场景，这些默认值是开发的良好起点，并且完全足以用于“一次性”作业。

但是，一旦您计划将Flink应用程序投入生产，通常会增加需求。例如，您希望您的工作（重新）可扩展，并为您的工作和新的Flink版本提供良好的升级故事。

在下文中，我们提供了一系列配置选项，您应该在作业投入生产之前检查这些选项。

### 明确地为 算子设置最大并行度

最大并行度是Flink 1.2中新引入的配置参数，对Flink作业的（重新）可伸缩性具有重要意义。此参数可以按作业和/或每个算子的粒度设置，确定可以扩展 算子的最大并行度。重要的是要了解（截至目前）**没有办法改变**作业启动后的此参数，除了从头开始完全重新启动作业（即使用新状态，而不是从以前的检查点/保存点）。即使Flink将来会提供某种方法来改变现有保存点的最大并行度，您也可以假设对于大型状态，这可能是您想要避免的长时间运行 算子操作。此时，您可能想知道为什么不仅仅使用非常高的值作为此参数的默认值。这背后的原因是高最大并行度会对应用程序的性能甚至状态大小产生一些影响，因为Flink必须维护某些元数据，因为它能够重新调整大小，并且可以通过最大并行度来增加。通常，您应该选择足够高的最大并行度以满足您在可伸缩性方面的未来需求，但保持尽可能低可以提供稍好的性能。特别是，高于128的最大并行度通常会导致来自被Keys化后台的稍微更大的状态SNAPSHOT。

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

`0 &lt; parallelism &lt;= max parallelism &lt;= 2^15`

您可以设置最大并行度`setMaxParallelism(int maxparallelism)`。默认情况下，Flink将在作业首次启动时选择最大并行度作为并行度的函数：

*   `128` ：对于所有并行度&lt;= 128。
*   `MIN(nextPowerOfTwo(parallelism + (parallelism / 2)), 2^15)` ：对于所有并行度&gt; 128。

### 为算子设置UUID

如[保存点](https://flink.sojb.cn/ops/state/savepoints.html)文档中所述，用户应为算子设置uid。这些 算子uid对于Flink将 算子状态映射到 算子非常重要，而 算子状态对于保存点也是必不可少的。默认情况下，通过遍历JobGraph并散列某些 算子属性来生成 算子uid。虽然从用户的角度来看这很舒服，但它也非常脆弱，因为对JobGraph的更改（例如，交换算子）将导致新的UUID。为了建立稳定的映射，我们需要用户提供稳定的 算子uid `setUid(String uid)`。

### 选择状态后台

目前，Flink的局限性在于它只能从保存点恢复保存点的相同状态后台的状态。例如，这意味着我们不能使用具有内存状态后台的保存点，然后将作业更改为使用RocksDB状态后台并恢复。虽然我们计划在不久的将来使后台可以互 算子操作，但它们还没有。这意味着在开始生产之前，您应该仔细考虑将哪个后台用于工作。

通常，我们建议使用RocksDB，因为这是目前唯一支持大状态（即超出可用主内存的状态）和异步SNAPSHOT的状态后台。根据我们的经验，异步SNAPSHOT对于大型状态非常重要，因为它们不会阻止 算子，Flink可以在不停止流处理的情况下编写SNAPSHOT。但是，RocksDB的性能可能比基于内存的状态后台更差。如果您确定您的状态永远不会超过主内存并阻止流处理写入它不是问题，您**可以考虑**不使用RocksDB后台。但是，在这一点上，我们**强烈建议**使用RocksDB进行生产。

### 配置JobManager高可用性（HA）

JobManager协调每个Flink部署。它负责_调度_和_资源管理_。

默认情况下，每个Flink群集都有一个JobManager实例。这会产生_单点故障_（SPOF）：如果JobManager崩溃，则无法提交新程序并且运行程序失败。

使用JobManager High Availability，您可以从JobManager故障中恢复，从而消除_SPOF_。我们**强烈建议**您为生产配置[高可用性](https://flink.sojb.cn/ops/jobmanager_high_availability.html)。

