首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自Oozie Java乔布斯的电子邮件

来自Oozie Java乔布斯的电子邮件
EN

Stack Overflow用户
提问于 2015-12-27 08:18:43
回答 2查看 851关注 0票数 1

我们使用Cloudera cdh 5.4.0,并且一直试图从Java触发一个oozie作业来发送电子邮件。有一个依赖于两个第三方jar文件- activation.jar和mail.jar的电子邮件要发送出去使用SMTP登录。当第三方文件放在文件系统上的同一个文件夹中时,JAVA程序可以从IDE / packages文件中发送电子邮件。

但是,当我们将文件移到HDFS并尝试配置oozie作业时,它将无法完成。

我们的oozie作业xml如下(email.xml)所示:

代码语言:javascript
复制
<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&#39;value&#39;: u&#39;&#39;}]</java-opts>
        </java>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <end name="End"/>
</workflow-app>

和职务属性如下:

代码语言:javascript
复制
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触发,如下所示:

代码语言:javascript
复制
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 hdpdn6.hadoop.local:8020 oozie.use.system.libpath真 oozie.wf.application.path hdfs://kwt-dev-hdpdn6.hadoop.local:8020/user/oozie/OozieWFConfigs/emailAppDef/email.xml oozie.wf.rerun.failnodes真 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默认值 user.name oozie

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-29 07:51:54

经过一周的试验,我们已经实现了从oozie工作岗位发出的电子邮件。正如许多论坛和朋友所发现的,问题在于不包含elapsedTime()函数的番石榴版本。

因此,如果我们有如下所示的工作流xml,它应该可以很好地工作。

代码语言:javascript
复制
<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 = true oozie.launcher.mapreduce.job.ubertask.enable = false

默认情况下,ubertask设置为true,它将尝试选择Cloudera / oozie的番石榴罐,它正在运行的版本较低,并且不包含elapsedTime()函数。如果我们将此属性设置为false,它将选择钻头的jars,其中包含正确的番石榴版本。

所有依赖的第三方jar和jar函数与我们的代码一起发送电子邮件,都作为文件包含在oozie工作流中。主类函数将在包含的jars中检查并拾取。

在一些论坛中,我们看到"lib“文件夹中的jar文件是自动读取的。但是,如果没有明确指定,我们就无法让它正常工作。也许我们还缺少一些秘密!

希望这对将来的人有帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-12-27 13:07:36

该问题与HDFS连接有关。您的Oozie URI、Namenode和jobtracker并不相等。我认为您应该用正确的IP地址替换本地主机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34478748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档