@pklemenkov вы нашли чем скедулить стриминг джобы и перезапускать их
Мы сделали такую стратегию.
У нас есть watcher, который следит за streaming query (смотрит его стейт периодически). Внутри все это оформлено в такую стейт машину:
-> INITIAL
INITIAL -> (RUNNING|FATAL_ERROR)
RUNNING -> (RUNNING|RECOVERABLE_ERROR|FATAL_ERROR)
RECOVERABLE_ERROR -> (RUNNING|RECOVERABLE_ERROR|FATAL_ERROR)
FATAL_ERROR -> EXIT
Если случилась RECOVERABLE_ERROR то попытаемся поднять streaming query.
Если FATAL_ERROR, то завершаем все queries в текущем апе и выходим.
RECOVERABLE_ERROR - это практически любая ошибка, которая вызвала штатную остановку streaming query извне (самим спарком).
FATAL_ERROR - это либо n раз провалились при попытке подняться из RECOVERABLE_ERROR, либо был какой-то unhandled exception.
Почему так?
1. Стейт у streaming query мало информативен на самом деле. Если джоба упала по случайности (партиция кафки например поменяла лидера), то эта одна история, а если в пайплайне ошибка или беда с wal, то совсем другая. Разбираться человеку легко, автоматически - сложно.
2. У нас как правило в каждом апе минимум 3 queries, потому что 3 разных кластера кафки (в разных dc). Поэтому ситуация когда какой-то query припал, возможно (например учения в dc).
3. Таймаут между рестартами полезен, за это время можно что-нибудт починить :-)
4. Чтобы не мучаться с перезапуском всего, проще в случае FATAL_ERROR аккуратно выйти, а потом cron/ваш любый планировщик увидит что джобы нет и запустит ее.