【问题标题】:Writing to file from jar run from Oozie shell从 Oozie shell 运行的 jar 写入文件
【发布时间】:2014-07-09 07:17:37
【问题描述】:

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

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

这是工作流程:

<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 执行作业时仍然无法正常工作。独立运行作业。

【问题讨论】:

  • 你能分享你正在读取然后将文件写入 hdfs 的代码吗?
  • 我的代码如上,不打算将文件写入HDFS。我正在尝试将文件保存在本地。

标签: java hadoop cloudera oozie hue


【解决方案1】:

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

【讨论】:

  • 是的,它应该写入本地文件系统。但是,我无法在我正在运行的所有三个节点中找到文件。
【解决方案2】:

我不明白你为什么要在 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>

【讨论】:

  • 我不能以 MR 方式进行,因为预处理不能并行完成(mapper-reducer)。无论如何,我的目标是尽可能将其保存到本地文件系统中,这样我就不必重写代码来将文件写入 HDFS。正如@Romain 所说,该文件应保存在/tmp,但我似乎无法找到这些文件。我在 3 个节点上运行进行测试,检查了所有节点但一无所获。
猜你喜欢
  • 1970-01-01
  • 2017-07-17
  • 2013-08-06
  • 2023-03-08
  • 2011-06-04
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多