Hi Zoraida, Oozie workflows are supposed to be Directed Acyclic Graphs<http://en.wikipedia.org/wiki/Directed_acyclic_graph>(DAGs), so you can't have any loops and it must be a graph. The error says that your action named "calculateGlobalMoviesUse" has multiple "ok to" transitions. Looking at your workflow, I see that "checkGlobalMoviesUse" and "checkGlobalCustomersUse" both transition to "calculateGlobalMoviesUse", hence the problem.
I don't know what your use case is, but based on the names, I think you may have meant to have "checkGlobalCustomersUse" transition to "calculateGlobalCustomersUse" and not "calculateGlobalMoviesUse" (plus, no other actions have a transition to "calculateGlobalCustomersUse"). - Robert On Thu, May 30, 2013 at 10:10 AM, ZORAIDA HIDALGO SANCHEZ <[email protected]>wrote: > Dear all, > > > We are building a workflow with forks and joins and we get this exception: > > > Caused by: org.apache.oozie.workflow.WorkflowException: E0743: Multiple > "ok to" transitions to the same node, [calculateGlobalMoviesUse], are not > allowed > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:206) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:227) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:234) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:265) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:227) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:234) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:219) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:214) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateForkJoin(LiteWorkflowAppParser.java:174) > > at > org.apache.oozie.workflow.lite.LiteWorkflowAppParser.validateAndParse(LiteWorkflowAppParser.java:141) > > at > org.apache.oozie.workflow.lite.LiteWorkflowLib.parseDef(LiteWorkflowLib.java:54) > > at > org.apache.oozie.service.LiteWorkflowAppService.parseDef(LiteWorkflowAppService.java:47) > > at > org.apache.oozie.service.LiteWorkflowAppService.parseDef(LiteWorkflowAppService.java:42) > > at org.apache.oozie.command.wf.SubmitXCommand.execute > > > My workflow.xml is os big, sorry for the inconvenience(thanks in advance): > > > <workflow-app xmlns='uri:oozie:workflow:0.2' name='koios-$service-export'> > > <start to='eventTimeConsumer' /> > > <!-- INCREMENTAL LOAD FIRST STEP --> > > <action name='eventTimeConsumer'> > > <java> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <main-class>com.pdi.koios.orchestrator.ConsumerMain</main-class> > > <arg>${mysql_url}</arg> > > <arg>${mysql_user}</arg> > > <arg>${mysql_pass}</arg> > > <arg>${workflowId}</arg> > > <capture-output /> > > </java> > > <ok to="setupFork" /> > > <error to="fail" /> > > </action> > > > > <fork name="setupFork"> > > <path start="checkDailyLoad"/> > > <path start="checkWeeklyLoad"/> > > <path start="checkMonthlyLoad"/> > > </fork> > > > > <join name="setupJoin" to="calculateGlobalFork"/> > > > > <!-- MONTHLY LOAD --> > > <decision name="checkMonthlyLoad"> > > <switch> > > <case to="setupMonthlyFork"> > > ${wf:actionData('eventTimeConsumer')['continue_monthly']} > > </case> > > <default to="setupJoin" /> > > </switch> > > </decision> > > > > <fork name="setupMonthlyFork"> > > <path start="setupMonthlyTmpHistogramCustomers"/> > > <path start="setupMonthlyTmpHistogramMovies"/> > > </fork> > > > <join name="setupMonthlyJoin" to="calculateMonthlyFork"/> > > > > <action name='setupMonthlyTmpHistogramCustomers'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/monthlyCustomerHistTemporal.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_month=${wf:actionData('eventTimeConsumer')['initial.timestamp.monthly']}</param> > > > <param>end_month=${wf:actionData('eventTimeConsumer')['end.timestamp.monthly']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupMonthlyJoin"/> > > <error to="fail"/> > > </action> > > > > <action name='setupMonthlyTmpHistogramMovies'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/monthlyMovieHistTemporal.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_month=${wf:actionData('eventTimeConsumer')['initial.timestamp.monthly']}</param> > > > <param>end_month=${wf:actionData('eventTimeConsumer')['end.timestamp.monthly']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupMonthlyJoin"/> > > <error to="fail"/> > > </action> > > > > <fork name="calculateMonthlyFork"> > > <path start="calculateMonthlyTops"/> > > <path start="calculateMonthlyHistograms"/> > > </fork> > > > <join name="calculateMonthlyJoin" to="setupJoin"/> > > > > <action name='calculateMonthlyTops'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/monthlyTops.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_month=${wf:actionData('eventTimeConsumer')['initial.timestamp.monthly']}</param> > > > <param>end_month=${wf:actionData('eventTimeConsumer')['end.timestamp.monthly']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="loadMonthlyTops"/> > > <error to="fail"/> > > </action> > > > > <action name='loadMonthlyTops'> > > <sqoop xmlns="uri:oozie:sqoop-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <arg>export</arg> > > <arg>--username</arg> > > <arg>${mysql_user}</arg> > > <arg>--password</arg> > > <arg>${mysql_pass}</arg> > > <arg>--connect</arg> > > <arg>${mysql_url}</arg> > > <arg>--table</arg> > > <arg>TOPS</arg> > > <arg>--export-dir</arg> > > <arg>/user/hive/warehouse/${service}.db/tops</arg> > > <arg>--input-fields-terminated-by</arg> > > <arg>\001</arg> > > </sqoop> > > <ok to="calculateMonthlyJoin"/> > > <error to="fail"/> > > </action> > > > > <action name='calculateMonthlyHistograms'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/monthlyHistograms.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_month=${wf:actionData('eventTimeConsumer')['initial.timestamp.monthly']}</param> > > > <param>end_month=${wf:actionData('eventTimeConsumer')['end.timestamp.monthly']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="loadMonthlyHistograms"/> > > <error to="fail"/> > > </action> > > > > <action name='loadMonthlyHistograms'> > > <sqoop xmlns="uri:oozie:sqoop-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <arg>export</arg> > > <arg>--username</arg> > > <arg>${mysql_user}</arg> > > <arg>--password</arg> > > <arg>${mysql_pass}</arg> > > <arg>--connect</arg> > > <arg>${mysql_url}</arg> > > <arg>--table</arg> > > <arg>HISTOGRAMS</arg> > > <arg>--export-dir</arg> > > <arg>/user/hive/warehouse/${service}.db/histograms</arg> > > <arg>--input-fields-terminated-by</arg> > > <arg>\001</arg> > > </sqoop> > > <ok to="calculateMonthlyJoin"/> > > <error to="fail"/> > > </action> > > > > <!-- WEEKLY LOAD --> > > <decision name="checkWeeklyLoad"> > > <switch> > > <!-- empty or doesn't exist --> > > <case to="setupWeeklyFork"> > > ${wf:actionData('eventTimeConsumer')['continue_weekly']} > > </case> > > <default to="setupJoin" /> > > </switch> > > </decision> > > > > <fork name="setupWeeklyFork"> > > <path start="setupWeeklyTmpHistogramCustomers"/> > > <path start="setupWeeklyTmpHistogramMovies"/> > > </fork> > > > <join name="setupWeeklyJoin" to="setupJoin"/> > > > > <action name='setupWeeklyTmpHistogramCustomers'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/weeklyCustomerHistTemporal.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_week=${wf:actionData('eventTimeConsumer')['initial.timestamp.weekly']}</param> > > > <param>end_week=${wf:actionData('eventTimeConsumer')['end.timestamp.weekly']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupWeeklyJoin"/> > > <error to="fail"/> > > </action> > > > > <action name='setupWeeklyTmpHistogramMovies'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/weeklyMovieHistTemporal.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_week=${wf:actionData('eventTimeConsumer')['initial.timestamp.weekly']}</param> > > > <param>end_week=${wf:actionData('eventTimeConsumer')['end.timestamp.weekly']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupWeeklyJoin"/> > > <error to="fail"/> > > </action> > > > > <action name='calculateWeeklyResults'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/weeklyActivityIndexes.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupJoin"/> > > <error to="fail"/> > > </action> > > > > > > <!-- DAILY LOAD --> > > <decision name="checkDailyLoad"> > > <switch> > > <case to="setupDailyFork"> > > ${wf:actionData('eventTimeConsumer')['continue_daily']} > > </case> > > <default to="setupJoin" /> > > </switch> > > </decision> > > <!-- ALL TIME LOAD --> > > <fork name="setupDailyFork"> > > <path start="setupSummarizeAllFields"/> > > <path start="setupSummarizeNoGenres"/> > > <path start="setupSummarizeOnlyGenres"/> > > </fork> > > > <join name="setupDailyJoin" to="calculateDailyResults"/> > > > > <action name='setupSummarizeAllFields'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/dailySummarizeAllFields.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_day=${wf:actionData('eventTimeConsumer')['initial.timestamp.daily']}</param> > > > <param>end_day=${wf:actionData('eventTimeConsumer')['end.timestamp.daily']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupDailyJoin"/> > > <error to="fail"/> > > </action> > > <action name='setupSummarizeNoGenres'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/dailySummarizeNoGenres.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_day=${wf:actionData('eventTimeConsumer')['initial.timestamp.daily']}</param> > > > <param>end_day=${wf:actionData('eventTimeConsumer')['end.timestamp.daily']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupDailyJoin"/> > > <error to="fail"/> > > </action> > > <action name='setupSummarizeOnlyGenres'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/dailySummarizeOnlyGenres.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > > <param>init_day=${wf:actionData('eventTimeConsumer')['initial.timestamp.daily']}</param> > > > <param>end_day=${wf:actionData('eventTimeConsumer')['end.timestamp.daily']}</param> > > <param>service=${service}</param> > > </hive> > > <ok to="setupDailyJoin"/> > > <error to="fail"/> > > </action> > > > > <action name='calculateDailyResults'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/dailySummarizes.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > <param>service=${service}</param> > > </hive> > > <ok to="loadDailySummarizes"/> > > <error to="fail"/> > > </action> > > > > <action name='loadDailySummarizes'> > > <sqoop xmlns="uri:oozie:sqoop-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <arg>export</arg> > > <arg>--username</arg> > > <arg>${mysql_user}</arg> > > <arg>--password</arg> > > <arg>${mysql_pass}</arg> > > <arg>--connect</arg> > > <arg>${mysql_url}</arg> > > <arg>--table</arg> > > <arg>CONSUMPTION_SUMMARIZE</arg> > > <arg>--export-dir</arg> > > <arg>/user/hive/warehouse/${service}.db/consumption_summarize</arg> > > <arg>--input-fields-terminated-by</arg> > > <arg>\001</arg> > > </sqoop> > > <ok to="setupJoin"/> > > <error to="fail"/> > > </action> > > > > > > <!-- Common aggregates for different periods --> > > <fork name="calculateGlobalFork"> > > <path start="checkGlobalActivityIndexes"/> > > <path start="checkGlobalMoviesUse"/> > > <path start="checkGlobalCustomersUse"/> > > </fork> > > > <join name="calculateGlobalJoin" to="checkFinalizer"/> > > > > <decision name="checkGlobalActivityIndexes"> > > <switch> > > <case to="calculateGlobalActivityIndexes"> > > ${wf:actionData('eventTimeConsumer')['continue_monthly'] || > > wf:actionData('eventTimeConsumer')['continue_weekly']} > > </case> > > <default to="calculateGlobalJoin" /> > > </switch> > > </decision> > > > > <action name='calculateGlobalActivityIndexes'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/globalActivityIndexes.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > <param>service=${service}</param> > > </hive> > > <ok to="loadGlobalActivityIndexes"/> > > <error to="fail"/> > > </action> > > > > > > > > <action name='loadGlobalActivityIndexes'> > > <sqoop xmlns="uri:oozie:sqoop-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <arg>export</arg> > > <arg>--username</arg> > > <arg>${mysql_user}</arg> > > <arg>--password</arg> > > <arg>${mysql_pass}</arg> > > <arg>--connect</arg> > > <arg>${mysql_url}</arg> > > <arg>--table</arg> > > <arg>ACTIVITY_INDEXES</arg> > > <arg>--export-dir</arg> > > <arg>/user/hive/warehouse/${service}.db/activity_indexes</arg> > > <arg>--input-fields-terminated-by</arg> > > <arg>\001</arg> > > </sqoop> > > <ok to="calculateGlobalJoin"/> > > <error to="fail"/> > > </action> > > > > <decision name="checkGlobalMoviesUse"> > > <switch> > > <case to="calculateGlobalMoviesUse"> > > ${wf:actionData('eventTimeConsumer')['continue_monthly'] || > > wf:actionData('eventTimeConsumer')['continue_weekly']} > > </case> > > <default to="calculateGlobalJoin" /> > > </switch> > > </decision> > > > > <action name='calculateGlobalMoviesUse'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/globalMoviesUse.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > <param>service=${service}</param> > > </hive> > > <ok to="loadGlobalMoviesUse"/> > > <error to="fail"/> > > </action> > > > > <action name='loadGlobalMoviesUse'> > > <sqoop xmlns="uri:oozie:sqoop-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <arg>export</arg> > > <arg>--username</arg> > > <arg>${mysql_user}</arg> > > <arg>--password</arg> > > <arg>${mysql_pass}</arg> > > <arg>--connect</arg> > > <arg>${mysql_url}</arg> > > <arg>--table</arg> > > <arg>MOVIES_USE</arg> > > <arg>--export-dir</arg> > > <arg>/user/hive/warehouse/${service}.db/movies_use</arg> > > <arg>--input-fields-terminated-by</arg> > > <arg>\001</arg> > > </sqoop> > > <ok to="calculateGlobalJoin"/> > > <error to="fail"/> > > </action> > > > > <decision name="checkGlobalCustomersUse"> > > <switch> > > <case to="calculateGlobalMoviesUse"> > > ${wf:actionData('eventTimeConsumer')['continue_monthly'] || > > wf:actionData('eventTimeConsumer')['continue_weekly']} > > </case> > > <default to="calculateGlobalJoin" /> > > </switch> > > </decision> > > > > <action name='calculateGlobalCustomersUse'> > > <hive xmlns="uri:oozie:hive-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <job-xml>resources/hive-site.xml</job-xml> > > <script>resources/globalCustomersUse.hql</script> > > <param>udfs_jar=${workflow_path}/lib/etl-0.0.1-SNAPSHOT.jar</param> > > <param>service=${service}</param> > > </hive> > > <ok to="loadGlobalCustomersUse"/> > > <error to="fail"/> > > </action> > > > > > > > > <action name='loadGlobalCustomersUse'> > > <sqoop xmlns="uri:oozie:sqoop-action:0.2"> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <arg>export</arg> > > <arg>--username</arg> > > <arg>${mysql_user}</arg> > > <arg>--password</arg> > > <arg>${mysql_pass}</arg> > > <arg>--connect</arg> > > <arg>${mysql_url}</arg> > > <arg>--table</arg> > > <arg>CUSTOMERS_USE</arg> > > <arg>--export-dir</arg> > > <arg>/user/hive/warehouse/${service}.db/customers_use</arg> > > <arg>--input-fields-terminated-by</arg> > > <arg>\001</arg> > > </sqoop> > > <ok to="calculateGlobalJoin"/> > > <error to="fail"/> > > </action> > > > > <decision name="checkFinalizer"> > > <switch> > > <case to="eventTimeFinalizer"> > > ${wf:actionData('eventTimeConsumer')['continue_daily']} > > </case> > > <default to="end" /> > > </switch> > > </decision> > > > > <!-- LAST ACTION OF THE INCREMENTAL LOAD --> > > <action name='eventTimeFinalizer'> > > <java> > > <job-tracker>${jobTracker}</job-tracker> > > <name-node>${nameNode}</name-node> > > <main-class>com.pdi.koios.orchestrator.FinalizerMain</main-class> > > <arg>${mysql_url}</arg> > > <arg>${mysql_user}</arg> > > <arg>${mysql_pass}</arg> > > <arg>${workflowId}</arg> > > <arg>${wf:actionData('eventTimeConsumer')['end.date']}</arg> > > <capture-output /> > > </java> > > <ok to="end" /> > > <error to="fail" /> > > </action> > > <kill name="fail"> > > <message>Map/Reduce failed, error > > message[${wf:errorMessage(wf:lastErrorNode())}] > > </message> > > </kill> > > <end name='end' /> > > </workflow-app> > > > ________________________________ > > Este mensaje se dirige exclusivamente a su destinatario. Puede consultar > nuestra pol?tica de env?o y recepci?n de correo electr?nico en el enlace > situado m?s abajo. > This message is intended exclusively for its addressee. We only send and > receive email on the basis of the terms set out at: > http://www.tid.es/ES/PAGINAS/disclaimer.aspx >
