我们使用clouderacdh5.4.0,并一直试图从javaapi触发oozie作业来发送电子邮件。使用smtp登录发送的电子邮件依赖于两个第三方jar文件-activation.jar和mail.jar。当第三方文件放在文件系统的同一文件夹中时,java程序可以从ide/jar文件包发送电子邮件。
但是,当我们将文件移动到hdfs并尝试配置oozie作业时,它无法完成。
我们的oozie作业xml如下(email.xml):
<workflow-app name="Email" xmlns="uri:oozie:workflow:0.5">
<start to="java-95a1"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="java-95a1">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<main-class>org.Emails</main-class>
<java-opts>[{u'value': u''}]</java-opts>
</java>
<ok to="End"/>
<error to="Kill"/>
</action>
<end name="End"/>
</workflow-app>
作业属性为:
nameNode=hdfs://localhost:8020
jobTracker=localhost:8021
queueName=default
weatherRoot=weather_ooze
mapreduce.jobtracker.kerberos.principal=foo
dfs.namenode.kerberos.principal=foo
oozie.libpath=${nameNode}/user/oozie/share/lib
oozie.wf.application.path=${nameNode}/user/${user.name}/${weatherRoot}
outputDir=weather-ooze
这些文件放置在hdfs文件夹中,如下所示:
/user/oozie/ooziewfconfigs/emailappdef/emailjavaprogram.jar/user/oozie/ooziewfconfigs/emailappdef/email.xml/user/oozie/ooziewfconfigs/emailappdef/job.properties/user/oozie/ooziewfconfigs/emailappdef/lib/activation.jar/user/oozie/ooziewfconfigs/emailappdef/lib/mail.jar
在一个论坛里读到,放在lib文件夹中的jar文件将被自动拾取。
oozie作业使用java api触发,如下所示:
import java.util.Properties;
import org.apache.oozie.client.OozieClient;
import org.apache.oozie.client.WorkflowJob;
public class oozieclient {
public static void main(String[] args) {
OozieClient wc = new OozieClient("http://hdfs:hdfs@172.16.142.124:11000/oozie");
Properties conf = wc.createConfiguration();
conf.setProperty("nameNode", "hdfs://kwt-dev-hdpdn6.hadoop.local:8020");
conf.setProperty("jobTracker", "kwt-dev-hdpdn6.hadoop.local:8032");
conf.setProperty("queueName", "default");
conf.setProperty("oozie.libpath", "${nameNode}/user/oozie/OozieWFConfigs/emailAppDef/lib");
conf.setProperty("oozie.use.system.libpath", "true");
conf.setProperty("oozie.wf.rerun.failnodes", "true");
conf.setProperty("oozieProjectRoot",
"${nameNode}/user/oozie");
conf.setProperty("appPath",
"${oozieProjectRoot}/OozieWFConfigs/emailAppDef");
conf.setProperty(OozieClient.APP_PATH, "${appPath}/email.xml");
// conf.setProperty("inputDir", "${oozieProjectRoot}/data/*/*/*/*/*");
conf.setProperty("outputDir", "${appPath}/output");
try {
String jobId = wc.run(conf);
System.out.println("Workflow job, " + jobId + " submitted");
while (wc.getJobInfo(jobId).getStatus() == WorkflowJob.Status.RUNNING) {
System.out.println("Workflow job running ...");
Thread.sleep(10 * 1000);
}
System.out.println("Workflow job completed ...");
System.out.println(wc.getJobInfo(jobId));
} catch (Exception r) {
System.out.println("Errors " + r.getLocalizedMessage());
}
}
}
作业被触发时,会一直运行到33%-50%,然后挂起。既不终止也不继续。有人能帮我吗?我不能在oozie中使用默认的电子邮件进程,因为我需要在这封电子邮件工作后添加附件。我希望它能从使用activation.jar和email.jar的java程序中工作。
作业触发时,配置如下:
应用程序路径hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/ooziewfconfigs/emailappdef
jobtracker kwt-dev-hdpdn6.hadoop。local:8032
mapreduce.job.user.name oozie
名称节点hdfs://kwt-dev-hdpdn6.hadoop.local:8020
oozie.use.system.libpath true
oozie.wf.application.path路径hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/ooziewfconfigs/emailappdef/email.xml
oozie.wf.rerun.failnodes true
Oozie项目根hdfs://kwt-dev-hdpdn6.hadoop.local:8020/用户/jinith.joseph
输出目录hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/ooziewfconfigs/emailappdef/output
queuename默认值
用户名oozie
2条答案
按热度按时间gblwokeq1#
经过一周的试验,我们已经实现了电子邮件发送从oozie乔布斯。正如许多论坛和朋友所发现的,问题出在不包含elapsedtime()函数的guava版本上。
因此,如果我们有一个如下的工作流xml,它应该可以正常工作
正如您可能已经观察到的,有两个配置专门用于选择正确版本的guava。
oozie.launcher.mapreduce.job.classloader=true oozie.launcher.mapreduce.job.ubertask.enable=false
默认情况下,ubertask设置为true,这将尝试选择cloudera/oozie的guava jar,它正在使用较低版本,并且不包含elapsedtime()函数。如果我们将这个属性设置为false,它将选择drill的jar,其中包含正确的guava版本。
所有依赖的第三方jar和jar函数以及发送电子邮件的代码都作为文件包含在oozie工作流中。主类函数将在包含的jar中检查并获取。
在一些论坛中,我们看到“lib”文件夹中的jar文件是自动读取的。但是如果没有明确的说明,我们就不能让它工作。可能我们还缺少一些配置!
无论如何,希望这对将来的人有所帮助。
aemubtdh2#
问题与hdfs连接有关。您的oozie uri、namenode和jobtracker不相等。我认为你应该用正确的ip地址替换本地主机。