
# Oozie应用开发步骤
1. 业务分析。 
   1. 可以使用客户端样例目录中MapReduce程序对日志目录的数据进行分析、处理。
   
   2. 将MapReduce程序的分析结果移动到数据分析结果目录，并将数据文件的权限设置成**660**。
   
   3. 为了满足每天分析一次的需求，需要每天重复执行一次[1.a]～[1.b]。
   
   
   
   
2. 业务实现。 
   1. 登录Oozie客户端所在节点，新建"dataLoad"目录，作为程序运行目录，后面编写的文件均保存在该目录下。例如"/opt/client/Oozie/oozie-client-\*/examples/apps/dataLoad/"。
      ![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
      可以直接复制样例目录中"map-reduce"文件夹内的内容到"dataLoad"文件夹，然后进行编辑。
      目录中 "oozie-client-\*"涉及的版本号以实际版本号为准。
      
   
   2. 编写流程任务属性文件（job.properties）。 请参见[配置Oozie作业运行参数](https://support.huaweicloud.com/devg3-mrs/mrs_07_160015.html)。
      
   
   3. 编写Workflow任务文件"workflow.xml"。
      表1流程Action 
      | 编号 | 步骤                | 描述                                                                                     |
      |:---|:---|:---|
      | 1  | 定义startaction     | 请参见[配置Oozie作业执行入口](https://support.huaweicloud.com/devg3-mrs/mrs_07_160017.html)       |
      | 2  | 定义MapReduceaction | 请参见[配置Oozie MapReduce作业](https://support.huaweicloud.com/devg3-mrs/mrs_07_160021.html) |
      | 3  | 定义FS action       | 请参见[配置Oozie作业操作HDFS文件](https://support.huaweicloud.com/devg3-mrs/mrs_07_160020.html)   |
      | 4  | 定义end action      | 请参见[配置Oozie作业执行终点](https://support.huaweicloud.com/devg3-mrs/mrs_07_160018.html)       |
      | 5  | 定义kill action     | 请参见[配置Oozie作业异常结束打印信息](https://support.huaweicloud.com/devg3-mrs/mrs_07_160019.html)   |
         
      ![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
      依赖或新开发的jar包需要放在"dataLoad/lib"目录下。
      流程文件样例：
      ```
      <workflow-app xmlns="uri:oozie:workflow:1.0" name="data_load"> 
         <start to="mr-dataLoad"/> 
         <action name="mr-dataLoad"> 
             <map-reduce> 
                  <resource-manager>${resourceManager}</resource-manager> 
                  <name-node>${nameNode}</name-node> 
                  <prepare> 
                      <delete path="${nameNode}/user/${wf:user()}/${dataLoadRoot}/output-data/map-reduce"/> 
                  </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/oozie/${dataLoadRoot}/input-data/text</value> 
                      </property> 
                      <property> 
                          <name>mapred.output.dir</name> 
                          <value>/user/${wf:user()}/${dataLoadRoot}/output-data/map-reduce</value> 
                      </property> 
                  </configuration> 
              </map-reduce> 
              <ok to="copyData"/> 
              <error to="fail"/> 
          </action> 
       
          <action name="copyData"> 
               <fs> 
                   <delete path='${nameNode}/user/oozie/${dataLoadRoot}/result'/> 
                   <move source='${nameNode}/user/${wf:user()}/${dataLoadRoot}/output-data/map-reduce'  
                         target='${nameNode}/user/oozie/${dataLoadRoot}/result'/> 
                   <chmod path='${nameNode}/user/oozie/${dataLoadRoot}/result' permissions='-rwxrw-rw-' dir-files='true'></chmod> 
              </fs> 
              <ok to="end"/> 
              <error to="fail"/> 
          </action> 
       
          <kill name="fail"> 
              <message>This workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
          </kill> 
          <end name="end"/> 
      </workflow-app>
      ```
      
   
   4. 编写Coordinator任务文件"coordinator.xml"。 完成每天一次的定时数据分析工作，请参见[配置Coordinator定时调度作业](https://support.huaweicloud.com/devg3-mrs/mrs_07_160022.html)。
      
   
   
   
   
3. 上传流程文件。 
   1. 使用或切换到拥有HDFS上传权限的用户，准备用户可参见[准备本地应用开发环境](https://support.huaweicloud.com/devg3-mrs/mrs_07_160006.html)。
   
   2. 使用该用户进行Kerberos认证。
   
   3. 使用HDFS上传命令，将"dataLoad"目录上传到HDFS某个指定目录（**developuser** 用户需要对该目录有读写权限）。
      ![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
      该指定目录需要与之前"job.properties"中定义的"oozie.coord.application.path"属性和"workflowAppUri"属性的值保持一致。
      
   
   
   
   
4. 执行流程文件。 
   1. 登录客户端节点，使用**developuser** 用户进行Kerberos认证。
      **cd /opt/client**
      **source bigdata_env**
      **kinit** **developuser**
      
   
   2. 启动流程。 命令：
      **oozie job -oozie** *https://oozie server hostname:port/oozie* **-config** *job.properties* *文件所在路径* **-run**
      参数列表：
      表2参数列表 
      | 参数      | 含义                     |
      |:---|:---|
      | job     | 表示执行的是job任务            |
      | -oozie  | Oozie服务器地址（任意节点）       |
      | -config | "job.properties"文件所在路径 |
      | -run    | 表示启动流程                 |
         
      例如：
      **oozie job -oozie https://10-** **1-** **130-10:21003/oozie -config job.properties** **-run**
      
   
   
   
   
 
