Apache Flink: MapState автоматически обновляется, когда я изменяю сохраненный объект? - PullRequest
0 голосов
/ 12 ноября 2018

Необходимо ли использовать MapState.put() для обновления состояния вручную или автоматически обновляется состояние при изменении объекта?

private transient MapState<String, Word> words;
.......
Word w = words.get(word);             
if (w == null) {
  w = new Word(word);
  //words.put(word, w);  //A
}              
if (....) {
  w.countBad(1);   // countXXX modifies a the private variable in a Word object 
} else {
  w.countGood(1);
}    
//words.put(word, w);   //B

Q : если я используюМетод, будет ли следующий расчет количества автоматически обновлять соответствующее состояние Mapstate?Или мне нужно использовать метод B, чтобы вручную обновить состояние после завершения расчета?

1 Ответ

0 голосов
/ 12 ноября 2018

С точки зрения API, вам всегда нужно вручную обновлять состояние.

Однако фактическое поведение зависит от состояния бэкэнда. Если приложение использует InMemoryStateBackend или FsStateBackend, все локальные состояния сохраняются в куче JVM рабочего процесса, т. Е. Бэкэнд состояния просто содержит ссылку на объект. Следовательно, состояние изменяется непосредственно при изменении объекта.

Если вы используете RocksDBStateBackend, то все обращения к состоянию де / сериализуются и считываются / записываются в RocksDB. В этом случае изменение объекта не влияет на состояние.

Я рекомендую всегда явно обновлять состояние, поскольку это обеспечит возможность переключения бэкэнда состояния без изменения логики вашего приложения.

...