来自 Oozie Java 个职位的电子邮件
Email from Oozie Java Jobs
我们使用 Cloudera cdh 5.4.0,并一直在尝试从 Java API 触发 oozie 作业以发送电子邮件。使用 SMTP 登录发送电子邮件依赖于两个第 3 方 jar 文件 - activation.jar 和 mail.jar。当第 3 方文件放置在文件系统上的同一文件夹中时,JAVA 程序可以从 IDE/packages 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 程序中工作
当作业被触发时,配置如下:
appPath hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/OozieWFConfigs/emailAppDef
jobTracker kwt-dev-hdpdn6.hadoop.local:8032
mapreduce.job.user.name oozie
nameNode 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
oozieProjectRoot hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/jinith.joseph
outputDir hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/OozieWFConfigs/emailAppDef/output
queueName default
user.name oozie
问题与 HDFS 连接有关。您的 Oozie URI、Namenode 和 jobtracker 不相等。我认为您应该用正确的 IP 地址替换 localhost。
经过几周的试用,我们已经实现了从 oozie 作业发送电子邮件。正如许多论坛和朋友所发现的那样,问题出在不包含 elapsedTime() 函数的 Guava 版本上。
因此,如果我们有如下工作流程 xml,它应该可以正常工作
<workflow-app name="Drill_HDFS_Email" xmlns="uri:oozie:workflow:0.5">
<start to="java-6abb"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="java-6abb">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.queue.name</name>
<value>default</value>
</property>
<property>
<name>oozie.launcher.mapreduce.job.classloader</name>
<value>true</value>
</property>
<property>
<name>oozie.launcher.mapreduce.job.ubertask.enable</name>
<value>false</value>
</property>
</configuration>
<main-class>com.drill.Emails</main-class>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/DrillJDBC.jar#DrillJDBC.jar</file>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/activation.jar#activation.jar</file>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/mail.jar#mail.jar</file>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/drill-jdbc-all-1.0.0.jar#drill-jdbc-all-1.0.0.jar</file>
</java>
<ok to="End"/>
<error to="Kill"/>
</action>
<end name="End"/>
</workflow-app>
您可能已经观察到,有两个配置专门用于选择正确版本的番石榴。
oozie.launcher.mapreduce.job.classloader = 真
oozie.launcher.mapreduce.job.ubertask.enable = 假
By default the ubertask is set to true, which will try to pick the
guava jar of Cloudera / oozie which is working on a lower version and
do not contain the elapsedTime() fucntion. If we set this property to
false it will pick the Drill's jars, which contain the right guava
version.
所有依赖的第 3 方 jar 和带有我们发送电子邮件的代码的 jar 函数都作为文件包含在 oozie 工作流程中。主要 class 功能将在包含的 jars 中检查并提取。
在一些论坛上,我们看到 "lib" 文件夹中的 jar 文件是自动读取的。但是如果没有明确指定,我们还没有让它工作。可能我们仍然缺少一些配置!
无论如何希望这对以后的人有所帮助。
我们使用 Cloudera cdh 5.4.0,并一直在尝试从 Java API 触发 oozie 作业以发送电子邮件。使用 SMTP 登录发送电子邮件依赖于两个第 3 方 jar 文件 - activation.jar 和 mail.jar。当第 3 方文件放置在文件系统上的同一文件夹中时,JAVA 程序可以从 IDE/packages 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 程序中工作当作业被触发时,配置如下:
appPath hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/OozieWFConfigs/emailAppDef
jobTracker kwt-dev-hdpdn6.hadoop.local:8032
mapreduce.job.user.name oozie
nameNode 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
oozieProjectRoot hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/jinith.joseph
outputDir hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/OozieWFConfigs/emailAppDef/output
queueName default
user.name oozie
问题与 HDFS 连接有关。您的 Oozie URI、Namenode 和 jobtracker 不相等。我认为您应该用正确的 IP 地址替换 localhost。
经过几周的试用,我们已经实现了从 oozie 作业发送电子邮件。正如许多论坛和朋友所发现的那样,问题出在不包含 elapsedTime() 函数的 Guava 版本上。
因此,如果我们有如下工作流程 xml,它应该可以正常工作
<workflow-app name="Drill_HDFS_Email" xmlns="uri:oozie:workflow:0.5">
<start to="java-6abb"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="java-6abb">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.queue.name</name>
<value>default</value>
</property>
<property>
<name>oozie.launcher.mapreduce.job.classloader</name>
<value>true</value>
</property>
<property>
<name>oozie.launcher.mapreduce.job.ubertask.enable</name>
<value>false</value>
</property>
</configuration>
<main-class>com.drill.Emails</main-class>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/DrillJDBC.jar#DrillJDBC.jar</file>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/activation.jar#activation.jar</file>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/mail.jar#mail.jar</file>
<file>/user/oozie/OozieWFConfigs/drillEmailAppDef/lib/drill-jdbc-all-1.0.0.jar#drill-jdbc-all-1.0.0.jar</file>
</java>
<ok to="End"/>
<error to="Kill"/>
</action>
<end name="End"/>
</workflow-app>
您可能已经观察到,有两个配置专门用于选择正确版本的番石榴。
oozie.launcher.mapreduce.job.classloader = 真 oozie.launcher.mapreduce.job.ubertask.enable = 假
By default the ubertask is set to true, which will try to pick the guava jar of Cloudera / oozie which is working on a lower version and do not contain the elapsedTime() fucntion. If we set this property to false it will pick the Drill's jars, which contain the right guava version.
所有依赖的第 3 方 jar 和带有我们发送电子邮件的代码的 jar 函数都作为文件包含在 oozie 工作流程中。主要 class 功能将在包含的 jars 中检查并提取。
在一些论坛上,我们看到 "lib" 文件夹中的 jar 文件是自动读取的。但是如果没有明确指定,我们还没有让它工作。可能我们仍然缺少一些配置!
无论如何希望这对以后的人有所帮助。