У нас возникла очень трудная для наблюдения проблема с нашей работой Flink.
Работа достаточно проста, она:
- Читает сообщения от Kinesis с помощью коннектора Flink Kinesis
- Сохраняет сообщения и передает их примерно 30 различным операторам CEP, а также нескольким настраиваемым функциям Window.
- Сообщения, отправленные из CEP / Windows, пересылаются SinkFunction, которая записывает сообщения в SQS.
Мы запускаем Flink 1.10.1 Fargate, используя 2 контейнера с 4vCPU / 8GB, мы используем бэкэнд состояния RocksDB со следующей конфигурацией:
state.backend: rocksdb
state.backend.async: true
state.backend.incremental: false
state.backend.rocksdb.localdir: /opt/flink/rocksdb
state.backend.rocksdb.ttl.compaction.filter.enabled: true
state.backend.rocksdb.files.open: 130048
Задание выполняется с параллелизмом 8.
Когда задание начинается с "холодного" состояния, оно использует очень мало ЦП, а контрольные точки выполняются за 2 секунды. Со временем размеры контрольно-пропускных пунктов увеличиваются, но время все еще очень разумное - пара секунд:
В течение этого времени мы можем наблюдать, как загрузка ЦП нашими диспетчерами задач по какой-то причине плавно растет:
В конце концов, время контрольной точки начнет увеличиваться до нескольких минут, а затем просто начнет многократно истекать время (10 минут). На данный момент:
- Размер контрольной точки (когда она будет завершена) составляет около 60 МБ.
- Загрузка ЦП высокая, но не 100% (обычно около 60-80%)
- Глядя на текущие контрольные точки, обычно 95% + операторов завершают контрольную точку за 30 секунд, но горстка просто застревает и никогда не завершит. Приемник SQS всегда будет включен в это, но
SinkFunction
не является богатым и не имеет состояния. - Использование монитора противодавления на этих операторах сообщает о ВЫСОКОМ противодавлении.
В конце концов, эта ситуация разрешается одним из двух способов:
- Достаточное количество контрольных точек не приводит к сбою задания из-за превышения порогового значения пропорции контрольной точки
- Контрольные точки в конечном итоге начинают работать успешно, но никогда не возвращаются к 5-10 секундам, которые они занимают изначально (когда размер состояния больше похож на 30 МБ против 60 МБ)
Мы действительно не понимаем, как это отладить. Наше государство кажется очень маленьким по сравнению с тем, что вы видите здесь в некоторых вопросах. Наши объемы также довольно низкие, мы очень часто оказываемся ниже 100 записей в секунду.
Мы были бы очень признательны за любой вклад в области, в которых мы могли бы изучить, чтобы отладить это.
Спасибо,