Ожидание преобразований в работе

Я работаю с Pentaho Data Integration (он же Kettle), и у меня есть несколько преобразований, назовем их A, B, C, D, E. B зависит от A, D зависит от C, а E зависит от B и D. Я хочу запустить A, B и C, D параллельно:

           -> A -> B _
    Start<            \
           -> C -> D----> E

где A и C идут параллельно. Есть ли способ выполнить E только в том случае, если B И D были успешными? Прямо сейчас, глядя на показатели задания, E выполняется, как только завершаются B ИЛИ D.


person Dominik Sandjaja    schedule 20.04.2010    source источник
comment
Есть ли какая-то конкретная причина, по которой они вам нужны для параллельной работы? В противном случае вы можете просто запустить A ›B› C ›D› E ... таким образом вы гарантируете, что все задания будут завершены до E.   -  person Cristian Curti    schedule 06.02.2019
comment
Спасибо за ваш комментарий, но у меня была эта проблема почти девять лет назад, и я больше не работаю над этим проектом.   -  person Dominik Sandjaja    schedule 06.02.2019


Ответы (4)


Я только что нашел http://forums.pentaho.org/showthread.php?t=75425, и мне кажется, что добиться того, чего я хочу, непросто.

person Dominik Sandjaja    schedule 27.04.2010

Вы можете сделать что-то вроде этого:

        /--=--[job]----[set var J1=1]---\ 
[start]----=--[Job]----[set var J2=1]----+--[jscriptstep]--(ok)-->[next steps]
        \--=--[Job]----[set var J3=1]---/        \
                                                 (x)
                                                   \
                                                  [Write to log]

Шаг JS с:

J1= parent_job.getVariable("J1");
J2= parent_job.getVariable("J2");
J3= parent_job.getVariable("J3");
(J1*J2*J3)==1;

Шаг записи в журнал является необязательным, и я раньше не регистрировал в журнале ошибку, выделенную красным цветом, используя сообщение журнала:

"Ожидание: $ {J1} - $ {J2} - $ {J3} - $ {J4} - $ {J5}"

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

person ricardo zonta santos    schedule 06.02.2019

Я верю, что это можно сделать, но у меня нет достаточно большой работы, чтобы действительно хорошо это проверить, и это неудобно. Как правило, вам понадобятся 4 отдельных задания в дополнение к заданиям A, B, C, D и E. Назовем их Control Job, Job A_B, Job C_D и Parallel Jobs.

Вы настраиваете их так:

Control Job: start -> Parallel Jobs -> E
Parallel Jobs:       -> Job A_B
               start<           (Set Start step to run next jobs in parallel)
                     -> Job C_D
Job A_B: start -> A -> B
Job C_D: start -> C -> D

Ключ в том, что A -> B и C -> D должны находиться на своем собственном этапе задания, чтобы сохранить зависимость. Затем Parallel Jobs проверяет, завершены ли оба параллельных пути, прежде чем позволить управлению перейти к E.

person Brian.D.Myers    schedule 22.05.2013

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

Я обошел это, вместо этого подсчитав количество раз, когда был достигнут шаг javascript:

cnt= parent_job.getVariable("tables_complete");
cnt++;
parent_job.setVariable("tables_complete",cnt);
3 == cnt;

table_complete не нужно определять заранее.

person tkravchuk    schedule 20.11.2019