У меня есть приложение Java Spring, которое отправляет топологии в шторм (1.1.2) nimbus на основе DTO, который создает структуру топологии.
Это прекрасно работает, за исключением очень больших окон. Я испытываю это с несколькими различными скользящими и падающими окнами. Никто не дает мне никаких проблем, кроме 24-часового скользящего окна, которое продвигается каждые 15 минут. Топология будет получать ~ 250 сообщений / с от Kafka и просто обрабатывать их с помощью простого экстрактора меток времени с задержкой в 3 секунды (как и во всех других топологиях, которые я тестирую).
Я много играл с рабочими и ресурсами памяти, чтобы попытаться выяснить это, но моя конфигурация по умолчанию - 1 рабочий с размером кучи 2048 МБ. Я также попытался уменьшить задержку, которая имела минимальные эффекты.
Я думаю, что возможно, размер окна становится слишком большим, и работнику не хватает памяти, что задерживает сердцебиение или регистрацию соединения зоопарка, что, в свою очередь, приводит к тому, что Nimbus убивает работника.
Время от времени (~ 11 продвижений окна) в журналах Nimbus сообщается, что Исполнитель для этой топологии "не активен", а рабочие журналы для этой топологии показывают либо KeeperException
, когда топология не может связаться с Zookeeper или java.lang.ExceptionInInitializerError:null
с гнездом PrivelegedActionException
.
Когда топологии назначается новый работник, агрегация, которую я выполнял, теряется. Я предполагаю, что это происходит, потому что окно содержит по крайней мере 250 * 60 * 15 * 11 (messagesPerSecond * secondsPerMinute * 15mins * windowAdvancesBeforeCrash) сообщений, каждый из которых составляет около 84 байтов. Для завершения всего окна это будет 250 * 60 * 15 * 97 сообщений (messagesPerSecond * secondsPerMinute * 15mins * 15minIncrementsIn24HoursPlusAnExpiredWindow). Это ~ 1.8gbs, если моя математика верна, поэтому я чувствую, что рабочая память должна покрывать окно или, по крайней мере, стоит больше, чем 11 достижений окна.
Я мог бы немного увеличить память, но не намного. Я также мог бы уменьшить количество памяти / работника и увеличить количество работников / топологии, но мне было интересно, есть ли что-то, что я пропускаю? Могу ли я просто увеличить количество пульса для работника, чтобы у исполнителя было больше времени, чтобы зарегистрироваться перед тем, как его убили, или это по какой-то причине будет плохо? Если бы я изменил биение, если бы был в карте конфигурации для топологии. Спасибо!