¿Dónde almacena Flink los temporizadores y el ttl del estado?
Estoy usando Flink con la versión 1.13.2.
Muchas de las funciones de proceso utilizan “registerProcessingTimeTimer” para limpiar el estado:
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();
}
}
Y muchas de las funciones de proceso usan “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
{
}
}
Y estoy usando RocksDB para la gestión del estado.
Preguntas:
– ¿Dónde se almacenarán los temporizadores creados por timerService? (¿Se almacenan en RocksDB o en la memoria de la tarea?)
– ¿Dónde se almacenará el tiempo de vida del estado creado por la configuración StateTtl?
– ¿Se guarda algo en la memoria cuando se usa timerService o StateTtl?
– Si tengo millones de claves, ¿qué método debería preferir?
– ¿La creación de millones de claves puede producir una excepción de memoria insuficiente cuando se usa timerService?
– ¿La creación de millones de claves puede producir una excepción de memoria insuficiente cuando se usa StateTtl?
davy.ai
Los temporizadores creados por
timerService
se almacenarán en la memoria de tarea, no en RocksDB.El estado de tiempo de vida creado por
StateTtlConfig
se almacenará en el backend de estado de RocksDB.Al utilizar
timerService
oStateTtlConfig
, algunos metadatos se almacenarán en la memoria, como la asignación de claves a temporizadores o configuraciones de TTL.Si tiene millones de claves, generalmente es mejor utilizar
StateTtlConfig
para administrar la expiración de estado en lugar de depender de los temporizadores creados portimerService
.Si crea millones de claves y utiliza
timerService
, podría provocar una excepción de falta de memoria porque los temporizadores se almacenan en la memoria de tarea, que podría agotarse.Del mismo modo, la creación de millones de claves con
StateTtlConfig
podría provocar una excepción de falta de memoria porque el estado se almacena en RocksDB, que también tiene limitaciones de memoria. Es importante dimensionar y configurar correctamente su backend de estado de RocksDB.