【问题标题】:Creating directory in hdfs using oozie使用 oozie 在 hdfs 中创建目录
【发布时间】:2017-04-24 17:02:58
【问题描述】:

在 oozie 工作流程中,我们如何在 HDFS 中创建目录并将文件从 Linux 复制到 HDFS

我想在工作流程中执行以下操作

hdfs dfs -mkdir -p /user/$USER/logging/`date "+%Y-%m-%d"`/logs


hdfs dfs -put /home/$USER/logs/"${table}" /user/$USER/logging/`date "+%Y-%m-%d"`/logs/

我怎样才能做到这一点?

我尝试了以下但没有成功

<action name="Copy_to_HDFS">
    <fs>
        <mkdir path='/user/$USER/logging/`date "+%Y-%m-%d"`/logs'/>
        <move source='/home/$USER/logs${table}' target='/user/$USER/logging/`date "+%Y-%m-%d"`/logs/'/>
    </fs>
    <ok to="end"/>
    <error to="end"/>
</action>

我们如何创建一个带有特定日期名称的文件夹?

完整的工作流程:

    <workflow-app name="Shell_hive" xmlns="uri:oozie:workflow:0.5">
    <start to="shell-b8e7"/>
    <kill name="Kill">
        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <action name="shell-b8e7">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <exec>shell.sh</exec>
              <argument>${table}</argument>
           <env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
           <env-var>HADOOP_CONF_DIR=/etc/hadoop/conf</env-var>
           <file>/user/$USER/oozie/scripts/lib/shell.sh#shell.sh</file>   
        </shell>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <action name="Copy_to_HDFS">
        <fs>
            <mkdir path="/user/$USER/logging/2017-04-24/logs"/>
            <move source="/tmp/logging/${table}" target="/user/$USER/logging/$(date +%Y-%m-%d)/logs/"/>
        </fs>
        <ok to="end"/>
        <error to="end"/>
    </action>
        <end name="End"/>
    </workflow-app>

【问题讨论】:

  • 这样做会发生什么?
  • @franklinsijo 我们可以在工作流中使用timestamp 创建目录吗?看起来问题出在date "+%Y-%m-%d"

标签: hadoop hdfs oozie oozie-coordinator


【解决方案1】:

问题在于引号,单引号(')会阻止变量扩展。

<action name="Copy_to_HDFS">
    <fs>
        <mkdir path="/user/$USER/logging/$(date +%Y-%m-%d)/logs"/>
        <move source="/home/$USER/logs${table}" target="/user/$USER/logging/$(date +%Y-%m-%d)/logs/"/>
    </fs>
    <ok to="end"/>
    <error to="end"/>
</action>

更新: 永远不会调用 Copy_to_HDFS 操作。成功时的操作shell-b8e7 发送到End 操作。相应地修改工作流以调用Copy_to_HDFS 操作。例如,

</shell>
<ok to="Copy_to_HDFS"/>

【讨论】:

  • 用字符串替换日期可以创建目录吗?
  • 任何 oozie 异常?
  • @franklinsijo 对我来说,它是在 hdfs 中创建一个像 $(date +%Y-%m-%d) 这样的文件夹
  • 您是否尝试用反引号 date +%Y-%m-%d 而不是 $(..) 包围它?
【解决方案2】:

准备标签可能会有所帮助:

<prepare>
                <delete path="[PATH]"/>
                ...
                <mkdir path="[PATH]"/>
                ...
</prepare>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2017-12-05
    • 2018-12-11
    相关资源
    最近更新 更多