Узы форзи вызывают одно и то же действие несколько раз - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь запустить несколько экземпляров одного и того же действия параллельно с помощью fork. При попытке сделать это, я получил сообщение об ошибке

"E0744" Вилке не разрешено иметь несколько переходов на один и тот же узел

Я также посмотрел на кодовую базу oozie ( LiteWorkflowAppParser ) и обнаружил, что oozie действительно не позволяет запускать вызовы одного и того же действия несколько раз в fork, поскольку это проверяется для этого. Теперь я отключил проверку с помощью oozie.wf.validate.ForkJoin=false и снова запустил рабочий процесс. На этот раз рабочий процесс работает нормально, но работает только один экземпляр действия. Мне кажется, что, хотя я отключил валидацию, oozie под ним позволяет запускать только уникальные действия, а дублирующие действия пропускаются. Теперь мой вопрос: как я могу добиться одновременного выполнения нескольких действий oozie?

Мой рабочий процесс выглядит так:

<workflow-app xmlns="uri:oozie:workflow:0.4" name="my-workflow">
   <start to="parallelize"/>
   <fork name="parallelize">
      <path start="performAction" />
      <path start="performAction" />
      <path start="performAction" />
   </fork>
<action name="performAction">
.......
  <ok to="joinForks"/>
  <error to="fail"/>
</action>
<join name="joinForks" to="end" />
<kill name="fail">
    <message>Responder Application, error
        message[${wf:errorMessage(wf:lastErrorNode())}]
    </message>
</kill>
<end name="end"/>
</workflow-app>

Дополнительные сведения: В приведенной выше конфигурации я вижу, что рабочий процесс застревает после завершения performAction при переходе к этапу joinForks. Похоже, что joinForks ожидает оставшиеся действия, чтобы сообщить о нем, чтобы он мог закончиться. Но проблема в том, что остальные действия никогда не запускались, в результате чего рабочий процесс ожидал бесконечно.

После этого я просто скопировал performAction в три различных действия performAction1, performAction2, performAction3 и использовал их в вилках. Теперь рабочий процесс завершается, когда joinForks вызывается из всех вилок. Но, тем не менее, я действительно хотел бы, чтобы мне не приходилось делать этот обходной путь дублирования одного и того же действия снова и снова под другим именем. Любая помощь приветствуется.

Спасибо

1 Ответ

0 голосов
/ 09 июля 2018

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

<fork name="parallelize">
  <path start="performAction" />
  <path start="performAction" />
  <path start="performAction" />
</fork>

<action name="performAction">
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>

Я подозреваю, что вилки должны иметь уникальное имя, например:

<fork name="parallelize">
  <path start="performAction1" />
  <path start="performAction2" />
  <path start="performAction3" />
</fork>
<action name="performAction1"> 
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>
<action name="performAction2">
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>
<action name="performAction3"> 
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>

Кажется, что наличие 3 вилок с одинаковым именем отбрасывает однозначно названное требование для переходов.

Можете ли вы попробовать использовать уникальные вилки с уникальным именем?

...