Продолжим о построении workflow с помощью пакетов. Из первой части понятно, как организовать загрузку в таблицу(ы) последовательно, возможно, с дополнительными действиями, организованными в виде процедур ODI, теперь же попробуем сделать загрузку данных в параллельном режиме.
Для этого необходимо в пакет добавлять не вызовы интерфейсов, а запуск сценариев, созданных из этих интерфейсов или других пакетов.
Допустим, у нас есть несколько таблиц справочников, которые необходимо загрузить в ХД. Эти таблицы справочники не зависят друг от друга, и могут быть загружены каждая своим интерфейсом. Сгенерируем для этих интерфейсов сценарии, чтобы затем использовать эти сценарии в пакете.
Создадим пакет LOAD_DICT, который будет загружать все 5 справочников. Для этого добавим в диаграмму пакета сценарии наших интерфейсов.
Добавить вызов сценария в пакет можно тремя способами.
- Добавить с панели инструментов команду OdiStartScen.
Добавляемая команда запуска сценария не устанавливает значение параметра синхронности запуска сценария. По-умолчанию, если параметр не указан, ODI делает этот запуск в синхронном режиме.
Таким образом, для одновременной загрузки всех 5 таблиц справочников нам необходимо сделать 5 запусков соответствующих сценариев и установить им асинхронный режим работы.
Рассмотрим параметры команды запуска сценария.
Следующие параметры являются опциональными.
Сессия это процесс выполнения пакета, интерфейса, процедуры и т.п., в результате которого формируется лог этого выполнения, видимый в Операторе.
Для первого сценария я задам значения для: наименования шага пакета, синхронности/асинхронности, наименования сессии, списка ключевых слов.
Далее я буду дуплицировать шаги пакета, для того, чтобы сделать вызовы всех сценариев:
Затем через вкладку Command изменю параметры команды OdiStartScen для каждого сдуплицированного шага, это немного быстрее чем через вкладку General шага пакета. Например, для задания асинхронного режима необходимо добавить, или изменить значение параметра на такое: "-SYNC_MODE=2", а для изменения наименования сценария - подредактировать параметр "-SCEN_NAME=DICT_1".
Завершив редактирование шагов пакета, можем его запустить:
Хочу обратить внимание на такие моменты выполнения этой сессии:
При наличии дочерних сессий следить за выполнением этих сессий удобнее через закладку Hierarchical Sessions Оператора. Так как в режиме списка сессий (Session List) все запуски отображаются в виде простого одноуровневого списка.
Изменим наш пакет так, чтобы все дочерние сценарии запускались синхронно, и посмотрим на результат:
В случае синхронного выполнения дочернего сценария, шаг, который запускает сценарий, заканчивает выполнение только после того, как заканчивает выполнение дочерняя сессия. Если, при этом, дочерняя сессия заканчивается успешно, шаг пакета тоже заканчивается успешно, если же дочерняя сессия падает - шаг пакета падает, и падает сам пакет.
Чтобы выполнять сценарии асинхронно, и, тем не менее, иметь возможность в пакете определять, как закончились эти дочерние сессии, необходимо использовать в пакете команду OdiWaitForChildSession.
Рассмотрим параметры команды OdiWaitForChildSession:
Вернем асинхронный запуск дочерних сценариев загрузки в пакет, и добавим последним шагом команду OdiWaitForChildSession. Посмотрим, что изменится при запуске пакета:
Теперь пакет отработал более ожидаемо, так как при падении дочерней сессии, в нашем примере, правда, их было 4, сам пакет также завершился с ошибкой. Команда ожидания дочерних сессий падает (завершает работу с ошибкой), если выполняется условие, заданное через параметры команды. Т.е. если достаточное количество дочерних сессий с заданными именами и ключевыми словами завершились с ошибкой. В противном случае, если дочерние сессии продолжают работать или завершились успешно, команда OdiWaitForChildSession ожидает завершения работы всех дочерних сессий, подпадающих под условия и лишь затем завершится успешно в пакете. Надеюсь, после чтения этого поста станет понятен принцип, по которому можно решить следующую задачу (цитирую вопрос, вдохновивший меня на написание этих постов):
< Предыдущая | Следующая > |
---|