Как внешние клиенты уведомляют рабочий процесс Oozie с обратным вызовом HTTP

Допустим, у нас есть случай, когда рабочий процесс Oozie запускается с 3 узлами действий Java. Каждое действие Java будет выполнять асинхронный HTTP-вызов к внешним веб-службам (например, некоторым веб-службам, предоставляемым google.com, yahoo.com и т. д.) за пределами кластера Oozie/Hadoop. Я предполагаю, что это выполнимо, поскольку Oozie поддерживает узел настраиваемых действий.

Теперь я не хочу, чтобы Oozie время от времени опрашивал внешние веб-службы, чтобы проверить, выполняется ли работа во внешней веб-службе. Я хочу, чтобы внешняя веб-служба (предположим, что мы можем изменить это свободно) перезвонила Oozie nofiy Oozie, чтобы работа внешней веб-службы была выполнена, а затем передала некоторую информацию обратно в Oozie и позволила Oozie решить, какие последующие действия брать.

Существуют вики, такие как http://www.infoq.com/articles/ExtendingOozie, говоря об обратном вызове из действия для асинхронных узлов, однако я так и не нашел реального примера того, как работает обратный вызов для узлов асинхронного действия. Кто-нибудь знает, как работает этот обратный вызов для узлов асинхронного действия?

Спасибо заранее!


person user908645    schedule 19.12.2013    source источник


Ответы (2)


Взгляните на Реализация действия Oozie SSH. Это всего лишь один класс, относительно простой (но немного запутанный), и он показывает, как создать URL-адрес обратного вызова:

String callbackPost = ignoreOutput ? "_" : 
getOozieConf().get(HTTP_COMMAND_OPTIONS).replace(" ", "%%%");

String callBackUrl = Services.get().get(CallbackService.class)
                .createCallBackUrl(action.getId(), EXT_STATUS_VAR);

Затем URL-адрес передается сценарию оболочки в качестве аргумента. Позже скрипт просто вызывает curl для этого URL-адреса. Внешний идентификатор состояния — это, например, PID выполняемого процесса, который возвращается обратно в Oozie через обратный вызов. Он не должен быть пустым/нулевым.

Подсказки, если вы решите углубиться в код: хотя выглядит так, что код выполняется синхронно, на самом деле он выполняется асинхронно посредством запуска сценария оболочки в фоновом режиме.

Обратный вызов обрабатывается Сервлет обратного вызова:

dagEngine.processCallback(actionId, callbackService.getExternalStatus(queryString), props);
person Jakub Kotowski    schedule 19.12.2013
comment
Большое спасибо jkbkot! Но, согласно вики здесь, ibm.com/developerworks/opensource /library/bd-ooziehadoop/, действие SSH устарело или находится на пути устаревания. Так ли это? - person user908645; 19.12.2013
comment
Без проблем. Я считаю, что это устарело по ошибке, см.: issues.apache.org/jira/browse/OOZIE -836 В любом случае, он показывает вам, как использовать обратные вызовы самостоятельно в вашем собственном коде. - person Jakub Kotowski; 19.12.2013
comment
Спасибо jkbkot за обновление. Приятно знать, что действие SSH не устарело. - person user908645; 20.12.2013

Согласно статье IBM DW

Когда Oozie запускает задачу, он предоставляет уникальный URL-адрес обратного вызова HTTP для задачи и уведомляет этот URL-адрес о завершении. Если задаче не удается вызвать URL-адрес обратного вызова, Oozie может запросить завершение задачи.

CallbackService.java имеет методы для создания URL-адреса обратного вызова для его отправки в действие и анализа, когда действие выполняет обратный вызов.

person Praveen Sripati    schedule 19.12.2013
comment
Большое спасибо, Правин! Знаете ли вы код Oozie, который обрабатывает обратный вызов задачи после ее выполнения. Предположим, что задача является действием Java. Может ли задача действия Java обращаться к внешней веб-службе, размещенной за пределами кластера Oozie/Hadoop? - person user908645; 19.12.2013
comment
Ссылка на CallbackService.java больше не работает, не знаете ли вы замену? - person Taryn; 27.03.2014