Cloudera Manager 中Oozie 配置HIVE workflow

参考博客地址:http://shiyanjun.cn/archives/664.html

前提是你的hive和你的oozie都已经配置好了。hive配置很简单,oozie配置中的问题可以看我的上一篇博客。

分为几步,
1 hive-site.xml 及对应版本的hive的jar包,都要上传到hdfs。你肯定在hdfs上已经建立了对应的目录。
      针对我装的cm5.7,相对应的目录是:
            hive-site.xml:/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/etc/hive/conf.dist/hive-site.xml
            相对应的hive jar包:/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hive/lib(注意mysql的驱动jar包也放在里面,如果你的hive元数据库为Mysql)
2 配置主要是三个文件,
job.properties      
workflow.xml       流程定义
script.q           存放你要执行的hql语句,参数可以通过workflow.xml中的param传过来。

job.properties 中需要加上
hiveSitePath=hdfs://node1:8020/user/root/hive/hive-site.xml    root是我的oozie用户,可以改成你的hdfs目录
oozie.libpath=hdfs://node1:8020/user/root/share/lib/hive

此外,需要注意的就是 job.properties 中,jobTracker=node1:8032根据你的hadoop的实际配置来填写,如果没有在配置中找不到这样的设置,就像这样去填写yarn的端口就可以了。

最后   oozie.use.system.libpath=true
例如我的job.properties如下配置:
nameNode=hdfs://cloud171:8020
jobTracker=cloud171:8032(这个是基于yarn的,hadoop的是8021)
queueName=default(job.properties里面的参数会在workflow.xml中引用${queueName})
hiveSitePath=hdfs://cloud171:8020/user/hive/hive-site.xml
oozie.libpath=hdfs://cloud171:8020/user/hive/share/lib(就是上面的hive依赖的jar包put到hdfs上这个)

在Oozie workflow的hive action中,也可以支持hive脚本的参数变量,使用${VARIABLES}来表示。

以下是官网中对hive action的语法例子:

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    ...
    <action name="[NODE-NAME]">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <prepare>
               <delete path="[PATH]"/>
               ...
               <mkdir path="[PATH]"/>
               ...
            </prepare>
            <job-xml>[HIVE SETTINGS FILE]</job-xml>
            <configuration>
                <property>
                    <name>[PROPERTY-NAME]</name>
                    <value>[PROPERTY-VALUE]</value>
                </property>
                ...
            </configuration>
            <script>[HIVE-SCRIPT]</script>
            <param>[PARAM-VALUE]</param>
                ...
            <param>[PARAM-VALUE]</param>
            <file>[FILE-PATH]</file>
            ...
            <archive>[FILE-PATH]</archive>
            ...
        </hive>
        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>

介绍一下这个语法中有几个参数:

  1. prepare 如果需要在hive作业之前创建或删除HDFS目录,则可以增加prepare参数,指定需要创建或删除的HDFS路径。
  2. job-xml 指定hive-site.xml所在HDFS上的路径;如果是CDH搭建的集群,则可以在任何一台hive gateway机器上的/etc/hive/conf目录下找到该配置文件。如果不指定该文件路径,hive action就不work。
  3. configuration 包含传递给hive作业的参数,可以没有这个配置项,这样就全部使用默认配置
  4. script 指定hql脚本所在HDFS上的路径;这个参数是hive action必须的。这个hql脚本中,可以使用${VARIABLES}来表示参数,获取在hive action中定义的param参数配置
  5. param 定义在hql脚本中所需要的变量值
如下是我在生产环境中使用hive action的一个样例:


<?xml version="1.0" encoding="UTF-8"?>

<workflow-app xmlns="uri:oozie:workflow:0.2" name="hive-wf">
    <start to="hive-node"/>

    <action name="hive-node">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <job-xml>${nameNode}/user/hive/hive-site.xml</job-xml>
          <!--  <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare> -->
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <script>${nameNode}/user/hive/hive.hql</script>
 <!--       <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
            <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive</param>
 -->
        </hive>
        <ok to="end"/>
        <error to="fail"/>
    </action>

    <kill name="fail">
        <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>


重点:oozie作业流程解析

1)job.properties文件可以不上传到hdfs中,是在执行oozie job ...... -config时,批定的linux本地路径
2)workflow.xml文件,一定要上传到job.properties的oozie.wf.application.path对应的hdfs目录下
3)job.properties中的oozie.use.system.libpath=true指定oozie使用系统的共享目录
4)job.properties中的oozie.libpath=${nameNode}/user/${user.name}/apps/mymr,可以用来执行mr时,作业导出的jar包存放位置,否则可能报找不到类的错误
5)oozie调度作业时,本质也是启动一个mapreduce作业来调度,workflow.xml中设置的队列名称为调度作业mr的队列名称。所以如果想让作业运行在指定的队列时,需要在mr或hive中指定好



7、检测workflow.xml文件的正确性
      oozie validate workflow.xml
     

8、编写workflow.xml文件
        控制节点:
      1)start节点
            <start to="[nodename]" />

      2)end节点
             <end name="[nodename]" />

      3)kill节点
            <kill>
                <message>"logmsg"</message>
            </kill>

      4)decision决策节点
            <decision name="[nodename]">
                <switch>
                    <case to="[nodename]">[PREDICATE]</case>
                    ......
                    <default to="[nodename]" />
                </switch>
            </decision>

      5)fork分支节点
            <fork name="[fork-node-name]">
                <path start="[nodename]"/>
                ......
                <path start="[nodename]"/>
            </fork>

      6)join会签节点
            <join name="[join-node-name]" to="[nodename]" />
动作节点:
       1)map-reduce配置:
     <workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">
    <start to="mr-node"/>
    <action name="mr-node">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>mapred.mapper.class</name>
                    <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                    <name>mapred.reducer.class</name>
                    <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
                <property>
                    <name>mapred.input.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}</value>
                </property>
            </configuration>
        </map-reduce>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

     2)hive动作节点配置
    <workflow-app xmlns="uri:oozie:workflow:0.2" name="hive-wf">
    <start to="hive-node"/>
    <action name="hive-node">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <script>script.q(存放hive脚本的文件)</script>
            <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
            <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive</param>
        </hive>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>


 3)sqoop动作节点
    <workflow-app xmlns="uri:oozie:workflow:0.2" name="sqoop-wf">
    <start to="sqoop-node"/>
    <action name="sqoop-node">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/sqoop"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <command>import --connect jdbc:hsqldb:file:db.hsqldb --table TT --target-dir /user/${wf:user()}/${examplesRoot}/output-data/sqoop -m 1</command>
            <file>db.hsqldb.properties#db.hsqldb.properties</file>
            <file>db.hsqldb.script#db.hsqldb.script</file>
        </sqoop>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Sqoop failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>


最后执行hive workflow命令如下:

在命令行下执行:oozie job -oozie https://cloud174:11000/oozie -config  /opt/job.properties -run

因为我的job.properties是放在/opt下,所以是下面的地址,根据你自己的地址去下


下面是一些客户端的oozie命令可参考下:

1.提交作业,作业进入PREP状态 
oozie job -oozie 
http://localhost:11000/oozie -config job.properties -submit 
job: 14-20090525161321-oozie-joe


2.执行已提交的作业

oozie job -oozie

http://localhost:11000/oozie -start 14-20090525161321-oozie-joe 

 

3.直接运行作业 
oozie job -oozie 
http://localhost:11000/oozie -config job.properties -run 

 

4.挂起作业,挂起前状态(RUNNING , RUNNIINGWITHERROR or PREP状态) 
workflow job will be in SUSPENDED status. 

 

5.杀死作业 
oozie job -oozie 
http://localhost:11000/oozie -kill 14-20090525161321-oozie-joe 

 

6.改变作业参数,不能修改killed状态的作业 
oozie job -oozie 
http://localhost:11000/oozie -change 14-20090525161321-oozie-joe -value endtime=2011-12-01T05:00Z;concurrency=100;2011-10-01T05:00Z 

7.重新运行作业 
oozie job -oozie 
http://localhost:11000/oozie -config job.properties -rerun 14-20090525161321-oozie-joe 
000000-130817230824019-oozie-ceny-W 
Rerunning a Coordinator Action or Multiple Actions 
$oozie job -rerun <coord_Job_id> [-nocleanup] [-refresh] 
[-action 1, 3-4, 7-40] (-action or -date is required to rerun.) 
[-date 2009-01-01T01:00Z::2009-05-31T23:59Z, 2009-11-10T01:00Z, 2009-12-31T22:00Z] 
Rerunning a Bundle Job 
oozie job -rerun <bundle_Job_id> [-nocleanup] [-refresh] 
[-coordinator c1, c3, c4] (-coordinator or -date is required to rerun.) 
[-date 2009-01-01T01:00Z::2009-05-31T23:59Z, 2009-11-10T01:00Z, 2009-12-31T22:00Z] 
(if neither -coordinator nor -date is given, the exception will be thrown.)

 

8.检查作业状态 
oozie job -oozie 
http://localhost:11000/oozie -info 14-20090525161321-oozie-joe

oozie job -oozie http://localhost:11000/oozie -info 0000001-111219170928042-oozie-para-W@mr-node -verbose 

 

9.查看日志 
oozie job -oozie 
http://localhost:11000/oozie -log 14-20090525161321-oozie-joe 
oozie job -log <coord_job_id> [-action 1, 3-4, 7-40] (-action is optional.)

 

10.检查xml文件是否合规 
oozie validate myApp/workflow.xml

 

11.提交pig作业 
oozie pig -oozie 
http://localhost:11000/oozie -file pigScriptFile -config job.properties -X -param_file params

 

12.提交MR作业 
oozie mapreduce -oozie 
http://localhost:11000/oozie -config job.properties

 

如还有其他,可到oozie官网去查

http://oozie.apache.org/docs-----根据自己的oozie version去查看

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值