2015-12-27 4 views
0

Мы работаем с Cloudera cdh 5.4.0 и пытаемся вызвать работу oozie из Java API для отправки электронной почты. Существует зависимость от двух сторонних файлов jar - activation.jar и mail.jar для отправки электронной почты с использованием SMTP Login. Программа JAVA работает, чтобы отправлять почту работает отлично из файлов IDE/пакетов Jar, когда сторонние файлы помещаются в одну и ту же папку в файловой системе.Электронная почта от Oozie Java Jobs

Но когда мы перемещаем файлы в 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&#39;value&#39;: u&#39;&#39;}]</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

Читать в форуме, что файлы jar, помещенные в папку lib, будут автоматически загружены.

Работа 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:[email protected]: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, поскольку мне нужно, чтобы вложения добавились в это письмо после его работы. Я хочу, чтобы он работал из java-программы, используя activ.jar и email.jar.

Когда задание запускается, конфигурация, как:

AppPath HDFS: //kwt-dev-hdpdn6.hadoop.local: 8020/пользователь/oozie/OozieWFConfigs/emailAppDef

JobTracker квт-DEV-hdpdn6.hadoop.local: 8032

mapreduce.job.user.name oozie

NameNode HDFS: //kwt-dev-hdpdn6.hadoop.local: 8020

oozie.use.system.libpath истинные

oozie.wf.application.path HDFS: //kwt-dev-hdpdn6.hadoop.local: 8020/пользователь/oozie/OozieWFConfigs/emailAppDef/email.xml

oozie.wf.rerun.failnodes истинные

oozieProjectRoot HDFS: //kwt-dev-hdpdn6.hadoop.local: 8020/пользователь/jinith.joseph

OutputDir HDFS: // квт-DEV-hdpdn6 .hadoop.местный: 8020/пользователь/oozie/OozieWFConfigs/emailAppDef/выход

ИмяОчереди по умолчанию

user.name oozie

ответ

0

После нескольких недель испытаний мы добились того, что электронные письма были отправлены из рабочих мест oozie. Как выяснили многие форумы и друзья, проблема была в версии Guava, которая не содержала функцию elapsedTime().

Так что, если у нас есть рабочий процесс 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 = ложь

По умолчанию ubertask устанавливается истина, которая будет пытаться выбрать Гуава-банка Cloudera/oozie, работающая на более низкой версии и , не содержит fucntion elapsedTime(). Если мы установим это свойство в false, он будет выбирать банки Drill's, которые содержат правую версию guava .

Все зависимые сторонние банки и функция jar с нашим кодом для отправки электронной почты включены в файлы в рабочий процесс oozie. Основная функция класса будет проверена в включенных баночках и поднята.

На некоторых форумах мы прочитали, что файлы jar в папке «lib» читаются автоматически. Но мы не работаем, не указав явно. Вероятно, мы все еще не встречаем некоторые конфиги!

Anyways Надеюсь, это поможет кому-то в будущем.

+0

IMHO ваша проблема похожа на «не-вопрос» OOZIE-2066 (https://issues.apache.org/jira/browse/OOZIE-2066) >>> просто попробуйте установить 'mapreduce.job.user.classpath .first' свойство 'true' (с Hadoop 2.x; альтернативы, показанные на SO post, упомянутые в ссылке, показанной внизу обсуждения OOZIE-2066) –

+0

Обратите внимание, что в контексте задания запуска Oozie« путь класса пользователя »означает ваши JAR ** и ** Oozie ShareLib, если таковые имеются ** и ** JAR Oozie, используемые для начальной загрузки пусковой установки. В случае, если Oozie отправляет более старую версию, результат будет ... случайным (например, HDP 2.3.2 отправляет старый «httpcore» с Hadoop, еще более старым с Oozie и более новым с Hive ShareLib - всегда #FAIL без «пользователя» classpath first "и 0.5 вероятность #FAIL с ним). –

1

Проблема связана с соединением HDFS. Ваш URI Uoz, Namenode и jobtracker не равны. Я думаю, вы должны заменить localhost правильным IP-адресом.

+0

Привет, Mobin, вы имели в виду работу job.properties? – Jinith

+0

@Jinith Yeah. проверьте ваше соединение, а также проверьте, что журналы могут быть полезными. –

+0

Пробовал, что. Динт прекрасно работает. Обновлен вопрос с настройкой конфигурации при запуске задания. – Jinith