【发布时间】:2021-12-01 15:28:34
【问题描述】:
我正在使用带有 v1.13.2 的 Flink
许多进程函数使用registerProcessingTimeTimer 来清除状态:
public class ProcessA ...
{
@Override
public void processElement(Object value, Context ctx, Collector<...> out) throws Exception
{
if (...)
{
ctx.timerService().registerProcessingTimeTimer(value.getTimestampMs() + 23232);
}
}
@Override
public void onTimer(long timestamp, OnTimerContext ctx, Collector<ValidationResult> out)
{
state.clear();
}
}
而且很多进程函数都使用StateTtlConfig:
public class ProcessB extends...
{
@Override
public void open(Configuration parameters)
{
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.minutes(15))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.build();
ValueStateDescriptor descriptor = ...
descriptor.enableTimeToLive(ttlConfig);
}
@Override
public void processElement(...) throws Exception
{
}
}
我正在使用 RocksDB 进行状态管理。
问题:
- 由 timerService 创建的计时器将存储在哪里? (存储在 RocksDB 或任务内存中)
- statettl config 创建的状态生存时间将存储在哪里?
- 当我使用 timerService 或 statettl 时,内存中是否保存了任何内容?
- 如果我有数百万个密钥,我应该选择哪种方式?
- 使用 timerService 时创建数百万个键会导致内存不足异常?
- 当我使用 statettl 时,创建数百万个键会导致内存不足异常
【问题讨论】:
标签: apache-flink flink-streaming