Advertisement

Oozie的安装与使用

阅读量:

文章目录

  • 1、Oozie的介绍

  • 2、oozie的架构

  • 3、oozie的安装

    • 第一步:修改core-site.xml
    • 第二步:上传oozie的安装包并解压
    • 第三步:解压hadooplibs到与oozie平行的目录
    • 第四步:创建libext目录
    • 第五步:拷贝依赖包到libext
    • 第六步:添加ext-2.2.zip压缩包
    • 第七步:修改oozie-site.xml
    • 第八步:创建mysql数据库
    • 第九步:上传oozie依赖的jar包到hdfs上面去
    • 第十步:创建oozie的数据库表
    • 第十一步:打包项目,生成war包
    • 第十二步:配置oozie的环境变量
    • 第十三步:启动与关闭oozie服务
    • 第十四步:浏览器页面访问oozie
  • 4、oozie的使用

    • 4.1、运行oozie调度Shell脚本
      • 首先按照标准流程对oozie的调度案例进行解压缩,并将其展开为可执行的工作流文件。
      • 创建一个新的工作目录用于存放所有与该作业相关的中间文件和日志。
      • 将任务模板复制至当前的工作目录中。
      • 选择一个空白的Shell脚本文件作为作业的主要执行入口。
      • 编辑配置参数设置为指定值完成必要的初始设置。
      • 将作业提交至HDFS存储位置并启动oozie的调度服务。
  • 4.2、采用Oozie进行Hive集群调度

    • 第一步是复制Hive的案例模板文件
    • 第二步是对Hive配置文件进行编辑
    • 第三步是将工作文件上传至HDFS服务器
    • 第四步则是运行Oozie来进行任务调度
    • 最后一步是检查调度的结果状态
  • 4.3、通过oozie实现MR任务调度

      • 第一步:获取MR运行所需资源
      • 第二步:验证系统的稳定性
      • 第三步:准备好调度所需的资源,并将相关的jar包复制到相应的存储位置
      • 第四步:优化配置参数设置
      • 第五步:部署调度作业至HDFS指定位置
      • 第六步:通过启动调度作业来执行
  • 4.4 Oozie的任务串行部署

  • 第一阶段:初步准备工作阶段

    • 第一步:创建Oozie集群环境
      • 配置Oozie集群所需的硬件和网络环境条件。
      • 确保HDFS和Yarn分布式文件系统已正确配置。
    • 第二步:安装和配置Oozie组件
      • 按照官方文档指导完成Oozie核心组件的安装。
      • 配置Oozie与Hadoop生态系统之间的通信机制。
    • 第三步:构建调度框架
      • 设计并实现高效的作业调度逻辑框架。
      • 确保调度算法能够支持复杂的作业依赖关系。
    • 第四步:部署资源管理模块
      • 将应用所需的资源管理功能模块集成到系统中。
      • 配置资源分配策略以优化系统性能。
    • 第五步:启动并运行相应的调度程序
      • 执行所有配置和部署步骤后,
      • 启动并运行相应的Oozie集群管理服务程序,
  • 运行监控工具以验证集群状态及功能是否正常运转。
  • 4.5节详细阐述了Oozie系统的任务调度机制及其定时任务执行流程。
  • 该系统详细说明了如何在Oozie中配置定时任务的相关参数。
  • 通过Oozie管理平台可以实现对现有任务状态的有效监控,并指导用户如何终止异常运行的任务。

1、Oozie的介绍

Oozie是一种基于hadoop平台的工作流调度引擎。它能够用于调度和管理多种Hadoop任务类型,包括MapReduce和Pig等。

在这里插入图片描述

oozie组件介绍

在这里插入图片描述

2、oozie的架构

在这里插入图片描述

3、oozie的安装

第一步:修改core-site.xml

修改core-site.xml添加我们hadoop集群的代理用户

复制代码
    cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
    vim  core-site.xml
复制代码
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>

注意:旧服务已上线,请通过浏览器访问19888端口以便查看相关信息。修改完成后,请必须重新启动hadoop的hdfs与yarn集群并确保其运行正常;同时需确保所有作业历史都能正确记录下来。

重启hdfs与yarn集群

复制代码
    cd /export/servers/hadoop-2.6.0-cdh5.14.0
    sbin/stop-dfs.sh
    sbin/start-dfs.sh
    sbin/stop-yarn.sh
    sbin/start-yarn.sh

第二步:上传oozie的安装包并解压

将oozie的安装包上传到/export/softwares

复制代码
    cd /export/softwares/
    tar -zxvf oozie-4.1.0-cdh5.14.0.tar.gz -C ../servers/

第三步:解压hadooplibs到与oozie平行的目录

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    tar -zxvf oozie-hadooplibs-4.1.0-cdh5.14.0.tar.gz -C ../
在这里插入图片描述

第四步:创建libext目录

在oozie的安装路径下创建libext目录

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    mkdir -p libext

第五步:拷贝依赖包到libext

拷贝一些依赖包到libext目录下面去
拷贝所有的依赖包

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    cp -ra hadooplibs/hadooplib-2.6.0-cdh5.14.0.oozie-4.1.0-cdh5.14.0/* libext/

拷贝mysql的驱动包

复制代码
    cp /export/servers/hive-1.1.0-cdh5.14.0/lib/mysql-connector-java-5.1.38.jar /export/servers/oozie-4.1.0-cdh5.14.0/libext/

第六步:添加ext-2.2.zip压缩包

请将该文件包...复制到libext目录中。请将已准备好的软件...放置于libext目录中。

第七步:修改oozie-site.xml

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/conf
    vim oozie-site.xml

如果缺少这些属性的话,请直接将其添加到配置中即可;系统默认采用UTC时间,在我们的配置文件oozie-site.xml中应确保将时间设置为GMT+08:00格式

复制代码
    <property>
        <name>oozie.service.JPAService.jdbc.driver</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    	
    	<property>
        <name>oozie.service.JPAService.jdbc.url</name>
        <value>jdbc:mysql://node03.hadoop.com:3306/oozie</value>
    </property>
    	
    	
    	<property>
    		<name>oozie.service.JPAService.jdbc.username</name>
    		<value>root</value>
    	</property>
    
    <property>
        <name>oozie.service.JPAService.jdbc.password</name>
        <value>123456</value>
    </property>
    
    	<property>
    			<name>oozie.processing.timezone</name>
    			<value>GMT+0800</value>
    	</property>
    
    
    	<property>
    		<name>oozie.service.ProxyUserService.proxyuser.hue.hosts</name>
        <value>*</value>
    </property>
    	
    	
    <property>   <name>oozie.service.ProxyUserService.proxyuser.hue.groups</name>
        <value>*</value>
    </property>
    	
    	<property>
        <name>oozie.service.coord.check.maximum.frequency</name>
    		<value>false</value>
    </property>     
    
    
    	<property>
    	<name>oozie.service.HadoopAccessorService.hadoop.configurations</name>
        <value>*=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop</value>
    </property>

第八步:创建mysql数据库

复制代码
    mysql -uroot -p
    create database oozie;

第九步:上传oozie依赖的jar包到hdfs上面去

上传oozie的解压后目录的yarn.tar.gz到hdfs目录去

复制代码
    bin/oozie-setup.sh  sharelib create -fs hdfs://node01:8020 -locallib oozie-sharelib-4.1.0-cdh5.14.0-yarn.tar.gz

实际上就是将这些jar包解压到了hdfs上面的路径下面去了

第十步:创建oozie的数据库表

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie-setup.sh  db create -run -sqlfile oozie.sql

第十一步:打包项目,生成war包

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie-setup.sh  prepare-war

第十二步:配置oozie的环境变量

复制代码
    vim /etc/profile
    
    export OOZIE_HOME=/export/servers/oozie-4.1.0-cdh5.14.0
    export OOZIE_URL=http://node03.hadoop.com:11000/oozie
    export PATH=:$OOZIE_HOME/bin:$PATH
    
    source /etc/profile
在这里插入图片描述

第十三步:启动与关闭oozie服务

启动命令

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozied.sh start

关闭命令

复制代码
    bin/oozied.sh stop
在这里插入图片描述

第十四步:浏览器页面访问oozie

http://node03:11000/oozie/

修复oozie页面的时间区问题:在我们的页面访问过程中发现oozie仍使用GMT时间,在当前系统的时区存在固定时间差。因此我们需要修改一个JavaScript脚本以获取当前系统的时间

修改js当中的时区问题

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie-server/webapps/oozie
    vim oozie-console.js
复制代码
    function getTimeZone() {
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    return Ext.state.Manager.get("TimezoneId","GMT+0800");
    }

重启oozie即可

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0

关闭oozie服务

复制代码
    bin/oozied.sh stop

启动oozie服务

复制代码
    bin/oozied.sh start

4、oozie的使用

KEY 含义
nameNode HDFS地址
jobTracker jobTracker(ResourceManager)地址
queueName Oozie队列(默认填写default)
examplesRoot 全局目录(默认填写examples)
oozie.usr.system.libpath 是否加载用户lib目录(true/false)
oozie.libpath 用户lib库所在的位置
oozie.wf.application.path Oozie流程所在hdfs地址(workflow.xml所在的地址)
user.name 当前用户
oozie.coord.application.path Coordinator.xml地址(没有可以不写)
oozie.bundle.application.path Bundle.xml地址(没有可以不写)

4.1、使用oozie调度shell脚本

安装完成后,则需对oozie的功能进行全面测试以确保其完善性。官方提供了多种标准测试用例我们可以依据这些标准用例来实现oozie的调度

第一步:解压官方提供的调度案例

Oozie集成提供了丰富且实用的示例库。我们可以通过访问官方发布的资源库下载并解压这些示例文件。

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    tar -zxf oozie-examples.tar.gz
在这里插入图片描述

第二步:创建工作目录

根据需要建立一个Oozie的工作目录后,在之后的时间内将所有调度任务的配置文件放置于该工作目录中;特别地,在Oozie安装目录下创建工作 directory。

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    mkdir oozie_works

第三步:拷贝任务模板到工作目录当中去

任务模板文件以及工作目录都准备好后

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    cp -r examples/apps/shell/ oozie_works/

第四步:随意准备一个shell脚本

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    vim oozie_works/shell/hello.sh

注意: 这个脚本一定要是在我们oozie工作路径下的shell路径下的位置

复制代码
    #!/bin/bash
    echo "hello world" >> /export/servers/hello_oozie.txt

第五步:修改模板下的配置文件

修改job.properties

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/shell
    vim job.properties
复制代码
    nameNode=hdfs://node01:8020
    jobTracker=node01:8032
    queueName=default
    examplesRoot=oozie_works
    oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell
    EXEC=hello.sh

修改workflow.xml

复制代码
    vim workflow.xml
复制代码
    <workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
    <start to="shell-node"/>
    <action name="shell-node">
    <shell xmlns="uri:oozie:shell-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>${queueName}</value>
            </property>
        </configuration>
        <exec>${EXEC}</exec>
        <!-- <argument>my_output=Hello Oozie</argument> -->
        <file>/user/root/oozie_works/shell/${EXEC}#${EXEC}</file>
    
        <capture-output/>
    </shell>
    <ok to="end"/>
    <error to="fail"/>
    </action>
    <decision name="check-output">
    <switch>
        <case to="end">
            ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
        </case>
        <default to="fail-output"/>
    </switch>
    </decision>
    <kill name="fail">
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
    <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
    </workflow-app>

第六步:上传调度任务到hdfs上面去

特别说明:在HDFS中上传文件时使用的目录路径为user/root。由于我们在Hadoop启动过程中默认会使用root账户进行操作(即通过root账户执行命令),因此建议将文件上传至该特定目录路径。需要注意的是,在某些情况下(即当Hadoop启动时采用了非root账户),则应将文件配置为/user/其他用户路径

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    hdfs dfs -put oozie_works/ /user/root

第七步:执行调度任务

通过oozie的命令来执行调度任务

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/shell/job.properties  -run

从监控界面可以看到任务执行成功了

在这里插入图片描述

查看Hadoop服务端口19888时会发现,Oozie被配置为执行相应的shell脚本.

在这里插入图片描述
在这里插入图片描述

4.2、使用oozie调度hive

第一步:拷贝hive的案例模板

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    cp -ra examples/apps/hive2/ oozie_works/

第二步:编辑hive模板

在本操作中采用的工具是Hiveserver2,并需注意必须确保Hiveserver2服务已正确启动

复制代码
    hive --service hiveserver2 &
    hive --service metastore  &

修改job.properties

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/hive2
    vim job.properties
复制代码
    nameNode=hdfs://node01:8020
    jobTracker=node01:8032
    queueName=default
    jdbcURL=jdbc:hive2://node03:10000/default
    examplesRoot=oozie_works
    
    oozie.use.system.libpath=true
    # 配置我们文件上传到hdfs的保存路径 实际上就是在hdfs 的/user/root/oozie_works/hive2这个路径下
    oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/hive2

修改workflow.xml

复制代码
    vim workflow.xml
复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <workflow-app xmlns="uri:oozie:workflow:0.5" name="hive2-wf">
    <start to="hive2-node"/>
    
    <action name="hive2-node">
        <hive2 xmlns="uri:oozie:hive2-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive2"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <jdbc-url>${jdbcURL}</jdbc-url>
            <script>script.q</script>
            <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
            <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive2</param>
        </hive2>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    
    <kill name="fail">
        <message>Hive2 (Beeline) action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
    </workflow-app>

编辑hivesql文件

复制代码
    vim script.q
复制代码
    DROP TABLE IF EXISTS test;
    CREATE EXTERNAL TABLE default.test (a INT) STORED AS TEXTFILE LOCATION '${INPUT}';
    insert into test values(10);
    insert into test values(20);
    insert into test values(30);

第三步:上传工作文件到hdfs

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    hdfs dfs -put hive2/ /user/root/oozie_works/

第四步:执行oozie的调度

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/hive2/job.properties  -run

第五步:查看调度结果

在这里插入图片描述
在这里插入图片描述

4.3、使用oozie调度MR任务

第一步:准备MR执行的数据

在此处通过Oozie实现了一个MR程序的工作流程,在这种情况下该MR程序既可以由个人自行编写也可采用Hadoop官方提供的标准MR程序本案例中我们选择了Hadoop官方提供的标准MR程序并将其用于wordcount示例以验证其工作性能与此同时我们需要将相关数据准备好并上传至HDFS中的/oozie/input目录以便后续操作

复制代码
    hdfs dfs -mkdir -p /oozie/input
    vim wordcount.txt
复制代码
    hello   world   hadoop
    spark   hive    hadoop

将数据上传到hdfs对应目录

复制代码
    hdfs dfs -put wordcount.txt /oozie/input

第二步:执行官方测试案例

复制代码
    hadoop jar /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar   wordcount  /oozie/input/  /oozie/output

第三步:准备调度的资源

请将所有需要调度的资源全部准备好并放置于一个专门的文件夹中,请确保包含jar包、job.properties以及workflow.xml。

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    cp -ra examples/apps/map-reduce/   oozie_works/

删掉MR任务模板lib目录下自带的jar包

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib
    rm -rf oozie-examples-4.1.0-cdh5.14.0.jar

第三步:拷贝的jar包到对应目录

从上一步的操作中可以看出, 需要调度的jar包应当存放在以下位置:$/export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib

复制代码
    cp /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib/

第四步:修改配置文件

修改job.properties

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce
    vim job.properties
复制代码
    nameNode=hdfs://node01:8020
    jobTracker=node01:8032
    queueName=default
    examplesRoot=oozie_works
    
    oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/map-reduce/workflow.xml
    outputDir=/oozie/output
    inputdir=/oozie/input

修改workflow.xml

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce
    vim workflow.xml
复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
      Licensed to the Apache Software Foundation (ASF) under one
      or more contributor license agreements.  See the NOTICE file
      distributed with this work for additional information
      regarding copyright ownership.  The ASF licenses this file
      to you under the Apache License, Version 2.0 (the
      "License"); you may not use this file except in compliance
      with the License.  You may obtain a copy of the License at
      
       http://www.apache.org/licenses/LICENSE-2.0
      
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    -->
    <workflow-app xmlns="uri:oozie:workflow:0.5" 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}/${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>
    				-->
    				
    				   <!-- 开启使用新的API来进行配置 -->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
    
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>
    
                <!-- 指定MR的输出key的类型 -->
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
    
                <!-- 指定MR的输出的value的类型-->
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>
    
                <!-- 指定输入路径 -->
                <property>
                    <name>mapred.input.dir</name>
                    <value>${nameNode}/${inputdir}</value>
                </property>
    
                <!-- 指定输出路径 -->
                <property>
                    <name>mapred.output.dir</name>
                    <value>${nameNode}/${outputDir}</value>
                </property>
    
                <!-- 指定执行的map类 -->
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>
    
                <!-- 指定执行的reduce类 -->
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>
    				<!--  配置map task的个数 -->
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</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>

第五步:上传调度任务到hdfs对应目录

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    hdfs dfs -put map-reduce/ /user/root/oozie_works/

第六步:执行调度任务

执行调度任务,然后通过oozie的11000端口进行查看任务结果

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/map-reduce/job.properties -run

4.4、oozie的任务串联

在实际工作中,必然存在若干个任务,其前一环节的工作成果作为后一环节的数据基础的情况,因此,在workflow.xml配置文件中,我们需要设置相应的关联关系以建立相互关联关系。

需求:首先依次先运行一个Shell脚本;完成后紧接着运行一个MapReduce程序;最后再运行一个Hive程序

第一步:准备工作目录

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    mkdir -p sereval-actions

第二步:准备调度文件

整合我们过去的Hive、Shell以及MapReduce(MR)执行流程,并将其整合到一个工作流中,并准备必要的资源文件

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    cp hive2/script.q    sereval-actions/
    cp shell/hello.sh    sereval-actions/
    cp -ra map-reduce/lib    sereval-actions/

第三步:开发调度的配置文件

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/sereval-actions

创建配置文件workflow.xml并编辑

复制代码
    vim workflow.xml
复制代码
    <workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
    <start to="shell-node"/>
    <action name="shell-node">
    <shell xmlns="uri:oozie:shell-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>${queueName}</value>
            </property>
        </configuration>
        <exec>${EXEC}</exec>
        <!-- <argument>my_output=Hello Oozie</argument> -->
        <file>/user/root/oozie_works/sereval-actions/${EXEC}#${EXEC}</file>
    
        <capture-output/>
    </shell>
    <ok to="mr-node"/>
    <error to="mr-node"/>
    </action>
    
    
    
    
    <action name="mr-node">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/${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>
    				-->
    				
    				   <!-- 开启使用新的API来进行配置 -->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
    
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>
    
                <!-- 指定MR的输出key的类型 -->
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
    
                <!-- 指定MR的输出的value的类型-->
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>
    
                <!-- 指定输入路径 -->
                <property>
                    <name>mapred.input.dir</name>
                    <value>${nameNode}/${inputdir}</value>
                </property>
    
                <!-- 指定输出路径 -->
                <property>
                    <name>mapred.output.dir</name>
                    <value>${nameNode}/${outputDir}</value>
                </property>
    
                <!-- 指定执行的map类 -->
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>
    
                <!-- 指定执行的reduce类 -->
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>
    				<!--  配置map task的个数 -->
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
    
            </configuration>
        </map-reduce>
        <ok to="hive2-node"/>
        <error to="fail"/>
    </action>
    
    
    
    
    
    
     <action name="hive2-node">
        <hive2 xmlns="uri:oozie:hive2-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive2"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <jdbc-url>${jdbcURL}</jdbc-url>
            <script>script.q</script>
            <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
            <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive2</param>
        </hive2>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <decision name="check-output">
    <switch>
        <case to="end">
            ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
        </case>
        <default to="fail-output"/>
    </switch>
    </decision>
    <kill name="fail">
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
    <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
    </workflow-app>

开发job.properties配置文件

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/sereval-actions
    vim  job.properties
复制代码
    nameNode=hdfs://node01:8020
    jobTracker=node01:8032
    queueName=default
    examplesRoot=oozie_works
    EXEC=hello.sh
    outputDir=/oozie/output
    inputdir=/oozie/input
    jdbcURL=jdbc:hive2://node03:10000/default
    oozie.use.system.libpath=true
    # 配置我们文件上传到hdfs的保存路径 实际上就是在hdfs 的/user/root/oozie_works/sereval-actions这个路径下
    oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/sereval-actions/workflow.xml

第四步:上传资源文件夹到hdfs对应路径

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/
    hdfs dfs -put sereval-actions/ /user/root/oozie_works/

第五步:执行调度任务

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/serveral-actions/job.properties -run

4.5、oozie的任务调度,定时任务执行

在Oozie系统中,默认情况下主要通过Coordinator组件来完成任务的定时调度工作。与工作流功能相似地,在该模块中同样可以通过XML文件进行详细参数设置以达到预期效果。下面我们将深入探讨如何配置Coordinator组件以实现实时任务调度的功能。该组件的主要调度方式主要有两种不同的实现方案。

第一种:基于定时的任务调度机制,
Oozie在实现基于时间的任务调度时, 主要依赖三个关键参数: 起始执行的时间点, 结束执行的时间点, 以及定期重复执行的时间间隔.

第二种:依赖数据的任务排程,在存在输入时才开始执行任务**
该类调度系统主要依赖于数据输入,在接收完所有必要的信息后才开始启动任务流程。

oozie当中定时任务的设置

第一步:拷贝定时任务的调度模板

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    cp -r examples/apps/cron oozie_works/cron-job

第二步:拷贝hello.sh脚本

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    cp shell/hello.sh  cron-job/

第三步:修改配置文件
修改job.properties

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/cron-job
    vim job.properties
复制代码
    nameNode=hdfs://node01:8020
    jobTracker=node01:8032
    queueName=default
    examplesRoot=oozie_works
    
    oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron-job/coordinator.xml
    start=2018-08-22T19:20+0800
    end=2019-08-22T19:20+0800
    EXEC=hello.sh
    workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron-job/workflow.xml

修改coordinator.xml

复制代码
    vim coordinator.xml
复制代码
    <!--
    	oozie的frequency 可以支持很多表达式,其中可以通过定时每分,或者每小时,或者每天,或者每月进行执行,也支持可以通过与linux的crontab表达式类似的写法来进行定时任务的执行
    	例如frequency 也可以写成以下方式
    	frequency="10 9 * * *"  每天上午的09:10:00开始执行任务
    	frequency="0 1 * * *"  每天凌晨的01:00开始执行任务
     -->
    <coordinator-app name="cron-job" frequency="${coord:minutes(1)}" start="${start}" end="${end}" timezone="GMT+0800"
                 xmlns="uri:oozie:coordinator:0.4">
        <action>
        <workflow>
            <app-path>${workflowAppUri}</app-path>
            <configuration>
                <property>
                    <name>jobTracker</name>
                    <value>${jobTracker}</value>
                </property>
                <property>
                    <name>nameNode</name>
                    <value>${nameNode}</value>
                </property>
                <property>
                    <name>queueName</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
        </workflow>
    </action>
    </coordinator-app>

修改workflow.xml

复制代码
    vim workflow.xml
复制代码
    <workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">
    <start to="action1"/>
    <action name="action1">
    <shell xmlns="uri:oozie:shell-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>${queueName}</value>
            </property>
        </configuration>
        <exec>${EXEC}</exec>
        <!-- <argument>my_output=Hello Oozie</argument> -->
        <file>/user/root/oozie_works/cron-job/${EXEC}#${EXEC}</file>
    
        <capture-output/>
    </shell>
    <ok to="end"/>
    <error to="end"/>
    </action>
    <end name="end"/>
    </workflow-app>

第四步:上传到hdfs对应路径

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    hdfs dfs -put cron-job/ /user/root/oozie_works/

第五步:运行定时任务

复制代码
    cd /export/servers/oozie-4.1.0-cdh5.14.0
复制代码
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/cron-job/job.properties -run

oozie当中任务的查看以及杀死

查看所有普通任务

复制代码
    oozie jobs -oozie http://bd001:11000/oozie

查看定时任务

复制代码
    oozie jobs -oozie http://bd001:11000/oozie   -jobtype coordinator
在这里插入图片描述
复制代码
    oozie job -oozie http://bd001:11000/oozie -info 0000033-200526143050941-oozie-root-W

杀死某个任务
oozie可以通过jobid来杀死某个定时任务

复制代码
    oozie job -kill [id]

例如我们可以使用命令

复制代码
    oozie job -oozie http://bd001:11000/oozie -kill 0000033-200526143050941-oozie-root-W

来杀死我们定时任务

在这里插入图片描述

常用命令
校验配置文件

复制代码
    oozie validate -oozie http://bd001:11000/oozie /export/servers/oozie/test/coordinator.xml

运行job

复制代码
    oozie job -oozie http://bd001:11000/oozie -config /export/servers/oozie/test/coordinator.properties -run

查看信息

复制代码
    oozie job -oozie http://bd001:11000/oozie -info 0000029-191027171933033-oozie-root-C

查看日志

复制代码
    oozie job -oozie http://bd001:11000/oozie -log 0000064-190923225831711-oozie-root-C

Kill任务

复制代码
    oozie job -oozie http://bd001:11000/oozie -kill 0000064-190923225831711-oozie-root-C

查看所有普通任务

复制代码
    oozie  jobs

查看定时任务

复制代码
    oozie jobs -jobtype coordinator -oozie http://bd001:11000/oozie

对比分析Oozie与Azkaban的表现:从功能层面来看两者具有相似性。具体而言,Oozie底层通过 org.apache.hadoop 提供的封装接口来处理Hadoop Spark作业提交,而Azkaban则可以直接操作shell语句进行作业提交。就安全性而言,Ooozie展现出一定的优势。

工作流定义: Oozie基于XML格式进行工作流配置,而Azkaban则使用Properties文件进行参数管理与工作流定义.
部署过程: 在部署过程中,Oozie的配置较为复杂,并且依赖于Yarn集群获取必要的任务日志信息.
任务检测: 当Azkillian中的某个作业出现失败时,在进程依然有效的情况下,默认认为该作业完成并返回成功状态.然而这种处理方式存在缺陷(BUG),而Ooozie则能够准确地判断作业的成功与失败情况.
操作工作流: 在操作工作流方面,Azkarabian主要依赖Web界面进行交互.相比之下,Ooozie提供了更为灵活的支持,不仅包含Web界面,还支持Restful API以及Java API调用.
权限控制: 就权限管理而言,Ooozie目前并未引入复杂的机制,Azkabin则具备较为完善的控制体系,允许用户对 workflow 的读写和执行权限进行精细配置.
运行环境: 从运行环境来看,Ooozie的所有动作都在Hadoop集群上运行,而Azerabian的动作则由其专用服务器负责处理.

全部评论 (0)

还没有任何评论哟~