Parameters在Oozie的hive action中的使用

目标:从hive action中获取结果,传入下一个hive action

现状:很不幸运,目前hive action不支持capture output

实现:使用ssh action运行hive script获得output, 并将其传入hive action

Detail:

  • ssh脚本去echo对应参数(key=value)
echo "minDate=${minDate}"
  • Hive action可以给Hive Script 使用下面方法传参
<param>DATE_TODAY=${wf:actionData('name_of_the_shell_action_goes_here')['minDate']</param>
  • Hive Script使用下面方法去接受参数
SELECT * FROM foo where date = ${minDate};

Demo

  • testShell.sh
minDate=`hive -e "select current_date;"`
echo "minDate='${minDate}'"
  • testParaShellToHive.hql
select current_date>${MYDATE};
  • workflow.xml
<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.5" name="testHive" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="uri:oozie:workflow:0.5">
    <start to="ssh-demo"/>
    <action name="ssh-demo">
        <ssh xmlns="uri:oozie:ssh-action:0.1">
            <host>${sshUser}@${hostName}</host>
            <command>sh ${SCRIPTS}/testShell.sh</command>
            <capture-output/>
        </ssh>
        <ok to="hive-demo"/>
        <error to="kill"/>
    </action>
    <action name="hive-demo">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <script>${dbScripts}/testParaShellToHive.hql
            </script>
            <param>MYDATE=${wf:actionData('ssh-demo')['minDate']}</param>
        </hive>
        <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>
  • hive.properties
oozie.wf.application.path=hdfs:..._ftr_dtls/oozie
appPath=hdfs...ing_ftr_dtls/oozie
nameNode=hdfs://cvldhdpds1
jobTracker=ip-1...:8050
user.name=yyang
metaStoreURI=thrift://ip-10-1...ernal:9083
sshUser=bisusr
hostName=10.177.228.19
dbScripts=hdfs://cvldhdpd...ftr_dtls/oozie/hql
SCRIPTS=hdfs://cvldhdpd...ftr_dtls/oozie/shell

Oozieの运行命令

oozie job -oozie http://10.177.2...0/oozie -config hive.properties -run

Oozieの查看log命令

oozie job -oozie http://10...000/oozie -log 0000074-160427121156888-oozie-oozi-W > output

vi output
ps: 0000074-160427121156888-oozie-oozi-W 是你的Job ID

注意事项:

  • testParaShellToHive.hql 和 workflow.xml必须要拷贝到hdfs
  • testShell.ksh 和 hive.properties应该保存在local上

Appendix

  • Hadoop 删除hdfs文件
    hadoop fs -rm hdfs://.../workflow.xml
  • Hadoop 从local拷贝文件到HDFS
    hadoop fs -put workflow.xml hdfs://.../workflow.xml
  • Hadoop 创建hdfs目录
    hadoop fs -mkdir hdfs://.../test

Reference

[1](http://blog.csdn.net/xiao_jun_0820/article/details/40370783 “oozie 知识整合”)
[2](https://www.mail-archive.com/user@oozie.apache.org/msg01136.html “Oozie - capture output and pass it to hive script as input”)

Oozie是一种用于管理Hadoop作业的工作流调度系统,它允许用户设计包含多个Hadoop任务的复杂工作流。在Oozie工作流传递日期字符串给Hive Action,通常需要使用Shell脚本或Java Action来获取当前日期,然后通过参数传递给Hive Action。 以下是一种在Oozie工作流实现该功能的示例方法: 1. 使用Shell Action获取当前日期,并将其设置为变量。 2. 将获取到的日期作为参数传递给Hive Action。 这里是一个简化的步骤: a. 在Oozie工作流的定义,添加一个Shell Action来计算日期。 b. 使用`date`命令获取当前日期并格式化为所需的格式。 c. 将Shell Action的输出设置为变量,并在Hive Action引用该变量。 具体的XML代码可能如下所示: ```xml <workflow-app xmlns="uri:oozie:workflow:0.4" name="date-hive-example"> <start to="shell-action"/> <action name="shell-action"> <shell xmlns="uri:oozie:shell-action:0.1"> <exec>date '+%Y-%m-%d'</exec> <redirect-stdout>date今天的日期.txt</redirect-stdout> </shell> <ok to="hive-action"/> <error to="error-action"/> </action> <action name="hive-action"> <hive xmlns="uri:oozie:hive-action:0.2"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <script>hive_query.hql</script> <param>hive_date=${昨天日期}</param> </hive> <ok to="end"/> <error to="error-action"/> </action> <kill name="error-action"> <message>Workflow failed, error message: ${wf:errorMessage(wf:lastErrorNode())}</message> </kill> <end name="end"/> </workflow-app> ``` 在这个例子,Shell Action会执行`date '+%Y-%m-%d'`命令来获取格式化的日期,并将其保存到文件`date今天的日期.txt`。然后,在Hive Action,你可以使用`<param>`标签引用这个日期,例如`hive_date=${昨天日期}`(其`${昨天日期}`是从Shell Action传递过来的变量)。 请注意,这个示例假设你已经有了一个名为`hive_query.hql`的Hive查询脚本,其使用了`hive_date`参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值