oozie 完整流程实例

Oozie概述

  Oozie是一个基于Hadoop工作流引擎,也可以称为调度器,它以xml的形式写调度流程,可以调度mr,pig,hive,shell,jar,spark等等。在实际工作中,遇到对数据进行一连串的操作的时候很实用,不需要自己写一些处理代码了,只需要定义好各个action,然后把他们串在一个工作流里面就可以自动执行了。对于大数据的分析工作非常有用.

 Oozie有几个主要概念:

  workflow :工作流 ,顺序执行流程节点,支持fork(分支多个节点),join(合并多个节点为一个)。

  coordinator :多个workflow可以组成一个coordinator,可以把前几个workflow的输出作为后一个workflow的输入,也可以定义workflow的触发条件,来做定时触发。

  bundle: 是对一堆coordinator的抽象, 可绑定多个coordinator。

  job.properties:定义环境变量。

oozie安装: 略

oozie格式:

1.workflow:

 


  ...
    
   
          ....
     
 
   [MESSAGE-TO-LOG]  
   
...

 

2.coordinator.xml

                    start="[DATETIME]" end="[DATETIME]" timezone="[TIMEZONE]"
                    xmlns="uri:oozie:coordinator:0.1">   
#frequency:执行频率,小于五分钟要修改配置 start,end:开始与结束时间,若想跟北京时间一样也要修改配置文件,并修改时间格式

      
        [TIME_PERIOD]
        [CONCURRENCY]
        [EXECUTION_STRATEGY]
      
.
          
        [SHARED_DATASETS]
        ...
.
         #---数据生成目录
        
                 initial-instance="[DATETIME]" timezone="[TIMEZONE]">
          [URI_TEMPLATE]
        
        ...
.
      
.
          #----定义了数据触发条件
        
          [INSTANCE]
          ...
        
        ...
        
          [INSTANCE]
          [INSTANCE]
        
        ...
      
      
         
           [INSTANCE]
         
         ...
      
      
        
          [WF-APPLICATION-PATH]    #---workflow.xml所在hdfs目录
          
                #----定义传给workflow的参数
              [PROPERTY-NAME]
              [PROPERTY-VALUE]
            
            ...
         
       
      
   

官网给出的例子:


                    start="2009-01-02T08:00Z" end="2009-01-02T08:00Z"
                    timezone="America/Los_Angeles"
                    xmlns="uri:oozie:coordinator:0.1">
      
        
                 initial-instance="2009-01-02T08:00Z" timezone="America/Los_Angeles">
          hdfs://bar:8020/app/logs/${YEAR}${MONTH}/${DAY}/data
        
        
                 initial-instance="2009-01-02T08:00Z" timezone="America/Los_Angeles">
          hdfs://bar:8020/app/stats/${YEAR}/${MONTH}/${DAY}/data
        
      
          
        
          2009-01-02T08:00Z
        
      
      
         
           2009-01-02T08:00Z
         
      
      
        
          hdfs://bar:8020/usr/joe/logsprocessor-wf    
          
               
              wfInput
              ${coord:dataIn('input')}
            
            
              wfOutput
              ${coord:dataOut('output')}
            
         
       
      
   

 

3.bundle.xml

 

语法:

 
  
       [DATETIME]    #运行时间
  
   
       [COORD-APPLICATION-PATH] # coordinator.xml所在目录
                           #传给coordinator应用的参数
            
              [PROPERTY-NAME]   
              [PROPERTY-VALUE]
            
            ...
         
   
   ...
  

官网给出的例子(绑定两个coordinator):

 
  
       ${kickOffTime}
  
   
       ${appPath}
       
         
              startTime1
              ${START_TIME}
          
         
              endTime1
              ${END_TIME}
          
      
   
   
       ${appPath2}
       
         
              startTime2
              ${START_TIME2}
          
         
              endTime2
              ${END_TIME2}
          
      
   

4,.job.properties:

nameNode               hdfs://xxx:8020    hdfs地址
jobTracker             xxx5:8034          jobTracker 地址
queueName              default            oozie队列
examplesRoot            examples           全局目录
oozie.usr.system.libpath    true           是否加载用户lib库
oozie.libpath            share/lib/user    用户lib库
oozie.wf.appication.path   ${nameNode}/user/${user.name}/... oozie流程所在hdfs地址

workflow:oozie.wf.application.path

coordinator:oozie.coord.application.path

bundle:oozie.bundle.application.path

Oozie使用:

写一个oozie,有两个是必要的:job.properties 和 workflow.xml(coordinator.xml,bundle.xml)

如果想让任务可以定时自动运行,那么需要写coordinator.xml。

如果想绑定多个coordinator.xml,那么需要写bundle.xml。

Oozie实例:

我们工作时的(简略版)实例:(本次以spark action为例,其他博客中有写java,shell action实例)

bundle.xml:

 
xmlns='uri:oozie:bundle:0.2'> 
    
       ${appPath}   
   
   
       ${appPath2}
   
 

coordinator.xml:

 
end="${end}" timezone="Asia/Shanghai" xmlns="uri:oozie:coordinator:0.2">
    
        
            ${workflowAppUri}
            
                
                    jobTracker
                    ${jobTracker}
                
                
                    nameNode
                    ${nameNode}
                
                
                    queueName
                    ${queueName}
                
                
                    mainClass
                    com.ocn.itv.rinse.ErrorCollectRinse
                
                
                    mainClass2
                    com.ocn.itv.rinse.UserCollectRinse
                
                
                    jarName
                    ocn-itv-spark-3.0.3-rc1.jar
                
            
        
    

workflow.xml:

  
     
    
        
        
        
    
          
            ${jobTracker}  
            ${nameNode}
              
                  
                    mapred.job.queue.name  
                    ${queueName}  
                                  
                        
            yarn-cluster
            cluster
            Spark Example
            <class>${mainClass}class>            
            ${jarName} 
            ${sparkopts} 
            ${input}            
           
        
            
     
    
           
            ${jobTracker}  
            ${nameNode}
              
                  
                    mapred.job.queue.name  
                    ${queueName}  
                                  
                        
            yarn-cluster
            cluster
            Spark Example2
            <class>${mainClass2}class>            
            ${jarName} 
            ${sparkopts} 
            ${input}            
          
        
            
       
    
        
       Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]  
      
     
 

job.properties

nameNode=hdfs://hgdp-001:8020     #hsfs端口地址
jobTracker=hgdp-001:8032        #resourceManager的端口
queueName=default            #oozie队列
input=2017-05-09             #输入参数
hdfspath=user/root           #自定义目录
examplesRoot=ocn-itv-oozie      #自定义全局目录
oozie.use.system.libpath=True    #是否启动系统lib库
sparkopts=--executor-memory 1G    #参数设置
start=2017-09-04T00:05+0800    #coordinator任务开始时间
end=2017-09-04T00:36+0800      #coordinator任务结束时间
start2=2017-09-01T00:06+0800
end2=2017-09-04T00:36+0800
oozie.libpath=${nameNode}/${hdfspath}/${examplesRoot}/lib/          #用户自定义lib库(存放jar包)
workflowAppUri=${nameNode}/${hdfspath}/${examplesRoot}/wf/spark/fork/
workflowAppUri2=${nameNode}/${hdfspath}/${examplesRoot}/wf/spark/single/  #coordinator定时调度对应的workflow.xml所在目录
appPath=${nameNode}/${hdfspath}/${examplesRoot}/cd/single/
appPath2=${nameNode}/${hdfspath}/${examplesRoot}/cd/single1/        #bundle调用对应的coordinator.xml所在目录
oozie.bundle.application.path=${nameNode}/${hdfspath}/${examplesRoot}/bd/bd1/    #bundle.xml所在目录
#一个bundle调用多个coordinator

 

 

最后运行:

 

  启动任务:oozie job -config job.properties -run -oozie http://xxxx(地址):11000/oozie

 

 

 需要注意的地方:

一.  coordinator中timezone的时区配置

Cloudera oozie默认时区是UTC,在开发oozie任务时必须在期望执行的时间上减去8小时,不方便。可以修改时区的配置操作。

1.在oozie的配置文件中添加如下属性:

 oozie.processing.timezone

 GMT+0800

2.如果使用了hue,进入Oozie web ui,选择Settings,然后在Timezone里选择CST(Asia/Shanghai)

3.coordinator中的timeone设置为:timezone="Asia/Shanghai"

4.修改时间格式,例如:2017-09-05T15:16+0800

二.oozie.xx.application.path

oozie.xx.application.path在job.properties里只能有一个。

workflow:oozie.wf.application.path

coordinator:oozie.coord.application.path

bundle:oozie.bundle.application.path

三.命名及存放位置问题

其中workflow.xml,coordinator.xml,bundle.xml名字都不可以修改,要放到hdfs目录中,而job.properties名字可以修改,放在本地即可。

四.关于workflow.xml 中action的问题:

可以写多个action依次执行,如下示例所示:

 

  
      
    
     ....
        
            
     
    
       .... 
        
            
       
        
       Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]  
      
     
 

 

也可以设置多个任务并发执行,需要添加fork和join节点,fork节点把任务切分成多个并行任务,join则合并多个并行任务。fork和join节点必须是成对出现的。join节点合并的任务,必须是通一个fork出来的子任务才行。示例如下:

  
     
    
        
        
        
    
            .....
        
            
     
    
            ....
        
            
       
    
        
       Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]  
      
     
 

五. 中 Oozie Schema Version 的问题

如果设置workflow:0.2,那么就不会显示wofkflow的Graph视图,设置为0.5便可显示。如下图所示:

oozie 完整流程实例_第1张图片

 

转载于:https://www.cnblogs.com/jjSmileEveryDay/p/7472393.html

你可能感兴趣的:(oozie 完整流程实例)