从Oozie shell运行jar文件写入文件

时间:2014-07-09 07:17:37

标签: java hadoop cloudera oozie hue

我在运行map reduce进程之前需要运行jar文件。这将处理稍后将输入到地图缩减过程的数据。 jar文件在没有oozie的情况下正常工作,但我喜欢自动化工作流程。

jar if运行时应接受两个输入:<input_file><output_dir> 并且应该在指定的<output_file_1>下输出两个文件<output_file_2><output_dir>

这是工作流程:

<workflow-app name="RI" xmlns="uri:oozie:workflow:0.4">
    <start to="RI"/>
    <action name="RI">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <exec>java </exec>
              <argument>-jar</argument>
              <argument>RI-Sequencer.jar </argument>
              <argument>log.csv</argument>
              <argument>/tmp</argument>
            <file>/user/root/algo/RI-Sequencer.jar#RI-Sequencer.jar</file>
            <file>/user/root/algo/log.csv#log.csv</file>
              <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="kill"/>
    </action>
    <kill name="kill">
        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

我使用Hue运行任务,目前我无法将进程的输出写入文件。它运行正常,但假定的文件无处可寻。

我还将输出目录更改为HDFS,但结果相同,不会生成任何文件。

如果有帮助,这是我的jar文件中的代码示例:

File fileErr = new File(targetPath + "\\input_RI_err.txt");
fileErr.createNewFile();
textFileErr = new BufferedWriter(new FileWriter(fileErr));
// 
// fill in the buffer with the result
//
textFileErr.close();

更新 如果有帮助,我可以上传jar文件进行测试。

更新2: 我已经改为让它写入HDFS。使用Oozie执行作业时仍然无法正常工作。独立运行工作。

2 个答案:

答案 0 :(得分:2)

您似乎正在创建常规输出文件(在本地文件系统上,而不是HDFS)。当作业将在集群的一个节点上运行时,输出将位于所选机器的本地/ tmp上。

答案 1 :(得分:0)

我不明白你为什么要在mapreduce之前预处理数据。认为它不太有效。但正如Roamin所说,您将输出文件保存到本地文件系统中(文件应该在您的用户主文件夹中〜/)。如果您想直接从java将数据保存到hdfs(不使用mapreduce库),请查看此处 - How to write a file in HDFS using hadoopWrite a file in hdfs with java

最终,您可以将文件生成到本地目录,然后使用以下命令将其加载到HDFS中:

hdfs dfs -put <localsrc> ... <dst>