我正在使用oozie运行MapReduce作业。从工作流程来看,我只是调用MapReduce驱动程序类而已。但是对于这个oozie工作流程需要大量的内存。它需要至少2GB的容器大小才能调用驱动程序类。以下是 workflow.xml
<?xml version="1.0" encoding="utf-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.4" name="My Job">
<start to="start-job" />
<action name='start-job'>
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${jobQueue}</value>
</property>
</configuration>
<exec>${jobScript}</exec>
<argument>${arguments}</argument>
<argument>${queueName}</argument>
<argument>${wf:id()}</argument>
<file>myPath/MyDriver.sh#MyDriver.sh</file>
</shell>
<ok to="end" />
<error to="kill" />
</action>
<kill name="kill">
<message>Job failed
failed:[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end" />
我的shell脚本如下所示( MyDriver.sh ),
hadoop jar myJar.jar MyDriverClass $1 $2 $3
为什么oozie需要这么多记忆。如何减少oozie的内存消耗?
答案 0 :(得分:1)
Shell操作将启动至少2个映射器来运行您的java类。
您可以使用java操作来避免这种情况。将jar放入 $ {workflow-path} / lib / 目录并更改工作流程:
<action name='start-job'>
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${jobQueue}</value>
</property>
</configuration>
<main-class>MyDriverClass</main-class>
<arg>${arguments}</arg>
<arg>${queueName}</arg>
<arg>${wf:id()}</arg>
</java>
<ok to="end" />
<error to="kill" />
</action>