2015-05-27 3 views
3

Im использует storm для обработки потока, в котором один из болтов записывается в cassandra. Команда cassandra session.execute() может выдать исключение, и мне интересно, как поймать это, чтобы «провалить» кортеж, чтобы его повторили.шторм - обработка исключений в bolt.execute

Документы для IRichBolt не show это бросает что-нибудь, поэтому мне интересно, как обрабатываются случаи исключения.

Основной вопрос: должен ли я обернуть вызов cassandra в try/catch или будет ли управлять этим случаем для меня?

ответ

3

Multipart Ответ:

1) Определенно окружать код с примерки поймать блок.

2) Как обрабатывать отказ зависит от топологии Бури и вида неисправности:

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

Если кортеж, который вы выполняете, представляет собой кортеж, который был выпущен носиком, тогда ваш болт может сломать кортеж. Это заставит повторить попытку Storm (то есть вызывать метод fail() на носике, и вы можете запрограммировать повторную попытку)

Если в результате обработки этого эффекта уже есть хотя бы один побочный эффект кортеж, и вы не хотите повторять этот побочный эффект в результате повторной загрузки кортежа, тогда вам нужно сделать немного более творческим. Ваш болт Cassandra может испускать неудачный кортеж на поток с неудачной коркой, где он может где-то сохраняться (HBase, файловая система, Kafka), пока вы не будете готовы повторить попытку. Чтобы повторить попытку, вы можете добавить еще один Spout в свою топологию, которая читает из этого хранилища неудачных кортежей и испускает их в потоке обратно к болту Cassandra для повторной попытки. Это дает вам возможность непрерывно зацикливать ваши повторы с расширенным временем между попытками. Если наряду с неудачным кортежем вы также сохраняете/регистрируете исключение Cassandra, вы можете просматривать/отслеживать журнал, чтобы узнать, есть ли какие-либо проблемы, которые должен знать ваш администратор.

+0

Как насчет «подготовить» - как провалить вызов, чтобы повторить попытку? – ethrbunny

+1

@ethrbunny Метод prepare() вызывается только один раз, чтобы болт мог настроить и инициализировать себя. Для подготовки() нет кортежа. Что касается других ошибок, таких как ошибка соединения с Cassandra в команде prepare(), вы должны поймать исключение (так что да - объедините свою логику с помощью try-catch) и выбросите исключение RuntimeException. Storm снова попытается запустить задачу (с другим вызовом prepare()), и вы надеетесь, что попытка подключения будет работать второй или третий раз. –

Смежные вопросы