提交 436cd39e 编写于 作者: Y Yu Li 提交者: Stephan Ewen

[FLINK-14495][docs] Synchronize the Chinese document for state backend with the English version

上级 9afcf31f
......@@ -36,7 +36,7 @@ under the License.
* ToC
{:toc}
## 可用的 State Backends
# 可用的 State Backends
Flink 内置了以下这些开箱即用的 state backends :
......@@ -175,18 +175,148 @@ env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints"
配置文件的部分示例如下所示:
{% highlight yaml %}
# The backend that will be used to store operator state checkpoints
# 用于存储 operator state 快照的 State Backend
state.backend: filesystem
# Directory for storing checkpoints
# 存储快照的目录
state.checkpoints.dir: hdfs://namenode:40010/flink/checkpoints
{% endhighlight %}
#### RocksDB State Backend Config Options
# RocksDB State Backend 进阶
{% include generated/rocks_db_configuration.html %}
*该小节描述 RocksDBStateBackend 的更多细节*
### 增量快照
RocksDBStateBackend 支持*增量快照*。不同于产生一个包含所有数据的全量备份,增量快照中只包含自上一次快照完成之后被修改的记录,因此可以显著减少快照完成的耗时。
一个增量快照是基于(通常多个)前序快照构建的。由于 RocksDB 内部存在 compaction 机制对 sst 文件进行合并,Flink 的增量快照也会定期重新设立起点(rebase),因此增量链条不会一直增长,旧快照包含的文件也会逐渐过期并被自动清理。
和基于全量快照的恢复时间相比,如果网络带宽是瓶颈,那么基于增量快照恢复可能会消耗更多时间,因为增量快照包含的 sst 文件之间可能存在数据重叠导致需要下载的数据量变大;而当 CPU 或者 IO 是瓶颈的时候,基于增量快照恢复会更快,因为从增量快照恢复不需要解析 Flink 的统一快照格式来重建本地的 RocksDB 数据表,而是可以直接基于 sst 文件加载。
虽然状态数据量很大时我们推荐使用增量快照,但这并不是默认的快照机制,您需要通过下述配置手动开启该功能:
-`flink-conf.yaml` 中设置:`state.backend.incremental: true` 或者
- 在代码中按照右侧方式配置(来覆盖默认配置):`RocksDBStateBackend backend = new RocksDBStateBackend(filebackend, true);`
### 内存管理
Flink 致力于控制整个进程的内存消耗,以确保 Flink 任务管理器(TaskManager)有良好的内存使用,从而既不会在容器(Docker/Kubernetes, Yarn等)环境中由于内存超用被杀掉,也不会因为内存利用率过低导致不必要的数据落盘或是缓存命中率下降,致使性能下降。
为了达到上述目标,Flink 默认将 RocksDB 的可用内存配置为任务管理器的单槽(per-slot)托管内存量。这将为大多数应用程序提供良好的开箱即用体验,即大多数应用程序不需要调整 RocksDB 配置,简单的增加 Flink 的托管内存即可改善内存相关性能问题。
当然,您也可以选择不使用 Flink 自带的内存管理,而是手动为 RocksDB 的每个列族(ColumnFamily)分配内存(每个算子的每个 state 都对应一个列族)。这为专业用户提供了对 RocksDB 进行更细粒度控制的途径,但同时也意味着用户需要自行保证总内存消耗不会超过(尤其是容器)环境的限制。请参阅 [large state tuning]({{ site.baseurl }}/ops/state/large_state_tuning.html#tuning-rocksdb-memory) 了解有关大状态数据性能调优的一些指导原则。
**RocksDB 使用托管内存**
这个功能默认打开,并且可以通过 `state.backend.rocksdb.memory.managed` 配置项控制。
Flink 并不直接控制 RocksDB 的 native 内存分配,而是通过配置 RocksDB 来确保其使用的内存正好与 Flink 的托管内存预算相同。这是在任务槽(per-slot)级别上完成的(托管内存以任务槽为粒度计算)。
为了设置 RocksDB 实例的总内存使用量,Flink 对同一个任务槽上的所有 RocksDB 实例使用共享的 [cache](https://github.com/facebook/RocksDB/wiki/Block-cache) 以及 [write buffer manager](https://github.com/facebook/rocksdb/wiki/write-buffer-manager)
共享 cache 将对 RocksDB 中内存消耗的[三个主要来源](https://github.com/facebook/rocksdb/wiki/Memory-usage-in-rocksdb)(块缓存、索引和bloom过滤器、MemTables)设置上限。
Flink还提供了两个参数来控制*写路径*(MemTable)和*读路径*(索引及过滤器,读缓存)之间的内存分配。当您看到 RocksDB 由于缺少写缓冲内存(频繁刷新)或读缓存未命中而性能不佳时,可以使用这些参数调整读写间的内存分配。
- `state.backend.rocksdb.memory.write-buffer-ratio`,默认值 `0.5`,即 50% 的给定内存会分配给写缓冲区使用。
- `state.backend.rocksdb.memory.high-prio-pool-ratio`,默认值 `0.1`,即 10% 的 block cache 内存会优先分配给索引及过滤器。
我们强烈建议不要将此值设置为零,以防止索引和过滤器被频繁踢出缓存而导致性能问题。此外,我们默认将L0级的过滤器和索引将被固定到缓存中以提高性能,更多详细信息请参阅 [RocksDB 文档](https://github.com/facebook/rocksdb/wiki/Block-Cache#caching-index-filter-and-compression-dictionary-blocks)
<span class="label label-info">注意</span> 上述机制开启时将覆盖用户在 [`PredefinedOptions`](#predefined-per-columnfamily-options)[`OptionsFactory`](#passing-options-factory-to-rocksdb) 中对 block cache 和 write buffer 进行的配置。
<span class="label label-info">注意</span> *仅面向专业用户*:若要手动控制内存,可以将 `state.backend.rocksdb.memory.managed` 设置为 `false`,并通过 [`ColumnFamilyOptions`](#passing-options-factory-to-rocksdb) 配置 RocksDB。
或者可以复用上述 cache/write-buffer-manager 机制,但将内存大小设置为与 Flink 的托管内存大小无关的固定大小(通过 `state.backend.rocksdb.memory.fixed-per-slot` 选项)。
注意在这两种情况下,用户都需要确保在 JVM 之外有足够的内存可供 RocksDB 使用。
### 计时器(内存 vs. RocksDB)
计时器(Timer)用于安排稍后的操作(基于事件时间或处理时间),例如触发窗口或回调 `ProcessFunction`
当选择 RocksDBStateBackend 时,默认情况下计时器也存储在 RocksDB 中。这是一种健壮且可扩展的方式,允许应用程序使用很多个计时器。另一方面,在 RocksDB 中维护计时器会有一定的成本,因此 Flink 也提供了将计时器存储在 JVM 堆上而使用 RocksDB 存储其他状态的选项。当计时器数量较少时,基于堆的计时器可以有更好的性能。
您可以通过将 `state.backend.rocksdb.timer-service.factory` 配置项设置为 `heap`(而不是默认的 `rocksdb`)来将计时器存储在堆上。
<span class="label label-info">注意</span> *在 RocksDBStateBackend 中使用基于堆的计时器的组合当前不支持计时器状态的异步快照。其他状态(如 keyed state)可以被异步快照。*
### 开启 RocksDB 原生监控指标
您可以选择使用 Flink 的监控指标系统来汇报 RocksDB 的原生指标,并且可以选择性的指定特定指标进行汇报。
请参阅 [configuration docs]({{ site.baseurl }}/ops/config.html#rocksdb-native-metrics) 了解更多详情。
<div class="alert alert-warning">
<strong>注意:</strong> 启用 RocksDB 的原生指标可能会对应用程序的性能产生负面影响。
</div>
### 列族(ColumnFamily)级别的预定义选项
<span class="label label-info">注意</span> 在引入 [RocksDB 使用托管内存](#memory-management) 功能后,此机制应限于在*专家调优**故障处理*中使用。
使用*预定义选项*,用户可以在每个 RocksDB 列族上应用一些预定义的配置,例如配置内存使用、线程、Compaction 设置等。目前每个算子的每个状态都在 RocksDB 中有专门的一个列族存储。
有两种方法可以选择要应用的预定义选项:
- 通过 `state.backend.rocksdb.predefined-options` 配置项将选项名称设置进 `flink-conf.yaml`
- 通过程序设置:`RocksDBStateBackend.setPredefinedOptions(PredefinedOptions.SPINNING_DISK_OPTIMIZED_HIGH_MEM)`
该选项的默认值是 `DEFAULT` ,对应 `PredefinedOptions.DEFAULT`
### 通过 RocksDBOptionsFactory 配置 RocksDB 选项
<span class="label label-info">注意</span> 在引入 [RocksDB 使用托管内存](#memory-management) 功能后,此机制应限于在*专家调优**故障处理*中使用。
您也可以通过配置一个 `RocksDBOptionsFactory` 来手动控制 RocksDB 的选项。此机制使您可以对列族的设置进行细粒度控制,例如内存使用、线程、Compaction 设置等。目前每个算子的每个状态都在 RocksDB 中有专门的一个列族存储。
有两种方法可以将 `RocksDBOptionsFactory` 传递给 RocksDBStateBackend:
- 通过 `state.backend.rocksdb.options-factory` 选项将工厂实现类的名称设置到`flink-conf.yaml`
- 通过程序设置,例如 `RocksDBStateBackend.setOptions(new MyOptionsFactory());`
<span class="label label-info">注意</span> 通过程序设置的 `RocksDBOptionsFactory` 将覆盖 `flink-conf.yaml` 配置文件的设置,且 `RocksDBOptionsFactory` 设置的优先级高于预定义选项(`PredefinedOptions`)。
<span class="label label-info">注意</span> RocksDB是一个本地库,它直接从进程分配内存,
而不是从JVM分配内存。分配给 RocksDB 的任何内存都必须被考虑在内,通常需要将这部分内存从任务管理器(`TaskManager`)的JVM堆中减去。
不这样做可能会导致JVM进程由于分配的内存超过申请值而被 YARN/Mesos 等资源管理框架终止。
**从 flink-conf.yaml 中读取列族选项**
一个实现了 `ConfigurableRocksDBOptionsFactory` 接口的 `RocksDBOptionsFactory` 可以直接从配置文件(`flink-conf.yaml`)中读取设定。
`state.backend.rocksdb.options-factory` 的默认配置是 `org.apache.flink.contrib.streaming.state.DefaultConfigurableOptionsFactory`,它默认会将 [这里定义]({{ site.baseurl }}/ops/config.html#advanced-rocksdb-state-backends-options) 的所有配置项全部加载。
因此您可以简单的通过关闭 RocksDB 使用托管内存的功能并将需要的设置选项加入配置文件来配置底层的列族选项。
下面是自定义 `ConfigurableRocksDBOptionsFactory` 的一个示例 (开发完成后,请将您的实现类全名设置到 `state.backend.rocksdb.options-factory`).
{% highlight java %}
public class MyOptionsFactory implements ConfigurableRocksDBOptionsFactory {
private static final long DEFAULT_SIZE = 256 * 1024 * 1024; // 256 MB
private long blockCacheSize = DEFAULT_SIZE;
@Override
public DBOptions createDBOptions(DBOptions currentOptions, Collection<AutoCloseable> handlesToClose) {
return currentOptions.setIncreaseParallelism(4)
.setUseFsync(false);
}
@Override
public ColumnFamilyOptions createColumnOptions(
ColumnFamilyOptions currentOptions, Collection<AutoCloseable> handlesToClose) {
return currentOptions.setTableFormatConfig(
new BlockBasedTableConfig()
.setBlockCacheSize(blockCacheSize)
.setBlockSize(128 * 1024)); // 128 KB
}
@Override
public OptionsFactory configure(Configuration configuration) {
this.blockCacheSize =
configuration.getLong("my.custom.rocksdb.block.cache.size", DEFAULT_SIZE);
return this;
}
}
{% endhighlight %}
{% top %}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册