精华内容
下载资源
问答
  • 安装ooize所需的ext2.2.zip,我自己安装时用的,没问题!
  • ooize简介

    2017-05-04 23:18:00
    在Hadoop中执行的任务有时候需要把多个Map/Reduce作业连接到一起,这样才能够达到目的。[1]在Hadoop生态圈中,有一种相对比较新的组件叫做Oozie[2],它让我们可以把多个Map/Reduce作业组合到一个逻辑工作单元中,...

    在Hadoop中执行的任务有时候需要把多个Map/Reduce作业连接到一起,这样才能够达到目的。[1]在Hadoop生态圈中,有一种相对比较新的组件叫做Oozie[2],它让我们可以把多个Map/Reduce作业组合到一个逻辑工作单元中,从而完成更大型的任务。本文中,我们会向你介绍Oozie以及使用它的一些方式。

    什么是Oozie?

    Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容:

    • 工作流定义
    • 当前运行的工作流实例,包括实例的状态和变量

    Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。我们会使用hPDL(一种XML流程定义语言)来描述这个图。

     

    hPDL是一种很简洁的语言,只会使用少数流程控制和动作节点。控制节点会定义执行的流程,并包含工作流的起点和终点(start、end和fail节点)以及控制工作流执行路径的机制(decision、fork和join节点)。动作节点是一些机制,通过它们工作流会触发执行计算或者处理任务。Oozie为以下类型的动作提供支持: Hadoop map-reduce、Hadoop文件系统、Pig、Java和Oozie的子工作流(SSH动作已经从Oozie schema 0.2之后的版本中移除了)。

    所有由动作节点触发的计算和处理任务都不在Oozie之中——它们是由Hadoop的Map/Reduce框架执行的。这种方法让Oozie可以支持现存的Hadoop用于负载平衡、灾难恢复的机制。这些任务主要是异步执行的(只有文件系统动作例外,它是同步处理的)。这意味着对于大多数工作流动作触发的计算或处理任务的类型来说,在工作流操作转换到工作流的下一个节点之前都需要等待,直到计算或处理任务结束了之后才能够继续。Oozie可以通过两种不同的方式来检测计算或处理任务是否完成,也就是回调和轮询。当Oozie启动了计算或处理任务的时候,它会为任务提供唯一的回调URL,然后任务会在完成的时候发送通知给特定的URL。在任务无法触发回调URL的情况下(可能是因为任何原因,比方说网络闪断),或者当任务的类型无法在完成时触发回调URL的时候,Oozie有一种机制,可以对计算或处理任务进行轮询,从而保证能够完成任务。

    Oozie工作流可以参数化(在工作流定义中使用像${inputDir}之类的变量)。在提交工作流操作的时候,我们必须提供参数值。如果经过合适地参数化(比方说,使用不同的输出目录),那么多个同样的工作流操作可以并发。

     

    一些工作流是根据需要触发的,但是大多数情况下,我们有必要基于一定的时间段和(或)数据可用性和(或)外部事件来运行它们。Oozie协调系统(Coordinator system)让用户可以基于这些参数来定义工作流执行计划。Oozie协调程序让我们可以以谓词的方式对工作流执行触发器进行建模,那可以指向数据、事件和(或)外部事件。工作流作业会在谓词得到满足的时候启动。

    经常我们还需要连接定时运行、但时间间隔不同的工作流操作。多个随后运行的工作流的输出会成为下一个工作流的输入。把这些工作流连接在一起,会让系统把它作为数据应用的管道来引用。Oozie协调程序支持创建这样的数据应用管道。

    安装Oozie

    我们可以把Oozie安装在现存的Hadoop系统中,安装方式包括tarball、RPM和Debian包等。我们的Hadoop部署是Cloudera的CDH3,其中已经包含了Oozie。因此,我们只是使用yum把它拉下来,然后在edge节点[1]上执行安装操作。在Oozie的发布包中有两个组件——Oozie-client和Oozie-server。根据簇集的规模,你可以让这两个组件安装在同一台edge服务器上,也可能安装在不同的计算机上。Oozie服务器中包含了用于触发和控制作业的组件,而客户端中包含了让用户可以触发Oozie操作并与Oozie服务器通信的组件。

    想要了解更多关于安装过程的信息,请使用Cloudera发布包,并访问Cloudera站点[2]

    注: 除了包括安装过程的内容之外,它还建议把下面的shell变量OOZIE_URL根据需要添加到.login、.kshrc或者shell的启动文件中:

    (export OOZIE_URL=http://localhost:11000/oozie)

    简单示例

    为了向你展示Oozie的使用方法,让我们创建一个简单的示例。我们拥有两个Map/Reduce作业[3]——一个会获取最初的数据,另一个会合并指定类型的数据。实际的获取操作需要执行最初的获取操作,然后把两种类型的数据——Lidar和Multicam——合并。为了让这个过程自动化,我们需要创建一个简单的Oozie工作流(代码1)。

    <!--
    Copyright (c) 2011 NAVTEQ! Inc. All rights reserved.
    NGMB IPS ingestor Oozie Script
    -->
    <workflow-app xmlns='uri:oozie:workflow:0.1' name='NGMB-IPS-ingestion'>
        <start to='ingestor'/>
        <action name='ingestor'>
            <java>
                <job-tracker>${jobTracker}</job-tracker>
                <name-node>${nameNode}</name-node>
                <configuration>
                    <property>
                        <name>mapred.job.queue.name</name>
                        <value>default</value>
                    </property>
                </configuration>
                <main-class>com.navteq.assetmgmt.MapReduce.ips.IPSLoader</main-class>
                <java-opts>-Xmx2048m</java-opts>
                <arg>${driveID}</arg>
            </java>
            <ok to="merging"/>
            <error to="fail"/>
        </action>
        <fork name="merging">
            <path start="mergeLidar"/>
            <path start="mergeSignage"/>
        </fork>
        <action name='mergeLidar'>
            <java>
                <job-tracker>${jobTracker}</job-tracker>
                <name-node>${nameNode}</name-node>
                <configuration>
                    <property>
                        <name>mapred.job.queue.name</name>
                        <value>default</value>
                    </property>
                </configuration>
                <main-class>com.navteq.assetmgmt.hdfs.merge.MergerLoader</main-class>
                <java-opts>-Xmx2048m</java-opts>
                <arg>-drive</arg>
                <arg>${driveID}</arg>
                <arg>-type</arg>
                <arg>Lidar</arg>
                <arg>-chunk</arg>
                <arg>${lidarChunk}</arg>
            </java>
        <ok to="completed"/>
        <error to="fail"/>
        </action>
        <action name='mergeSignage'>
            <java>
                <job-tracker>${jobTracker}</job-tracker>
                <name-node>${nameNode}</name-node>
                <configuration>
                    <property>
                        <name>mapred.job.queue.name</name>
                        <value>default</value>
                    </property>
                </configuration>
                <main-class>com.navteq.assetmgmt.hdfs.merge.MergerLoader</main-class>
                <java-opts>-Xmx2048m</java-opts>
                <arg>-drive</arg>
                <arg>${driveID}</arg>
                <arg>-type</arg>
                <arg>MultiCam</arg>
                <arg>-chunk</arg>
                <arg>${signageChunk}</arg>
            </java>
            <ok to="completed"/>
            <error to="fail"/>
        </action>
        <join name="completed" to="end"/>
        <kill name="fail">
            <message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
        </kill>
        <end name='end'/>
    </workflow-app> 
    

    代码1: 简单的Oozie工作流

    这个工作流定义了三个动作:ingestor、mergeLidar和mergeSignage。并把每个动作都实现为Map/Reduce[4]作业。这个工作流从start节点开始,然后把控制权交给Ingestor动作。一旦ingestor步骤完成,就会触发fork控制节点 [4],它会并行地开始执行mergeLidar和mergeSignage[5]。这两个动作完成之后,就会触发join控制节点[6]。join节点成功完成之后,控制权就会传递给end节点,它会结束这个过程。

    创建工作流之后,我们需要正确地对其进行部署。典型的Oozie部署是一个HDFS目录,其中包含workflow.xml(代码1)、config-default.xml和lib子目录,其中包含有工作流操作所要使用的类的jar文件。

    (点击可以查看大图)

    图1: Oozie部署

    config-default.xml文件是可选的,通常其中会包含对于所有工作流实例通用的工作流参数。代码2中显示的是config-default.xml的简单示例。

    <configuration>
        <property>
            <name>jobTracker</name>
            <value>sachicn003:2010</value>
        </property>
        <property>
            <name>nameNode</name>
            <value>hdfs://sachicn001:8020</value>
        </property>
        <property>
            <name>queueName</name>
            <value>default</value>
        </property>
    </configuration>

    代码2: Config-default.xml

    完成了工作流的部署之后,我们可以使用Oozie提供的命令行工具[5],它可以用于提交、启动和操作工作流。这个工具一般会运行在Hadoop簇集[7]的edge节点上,并需要一个作业属性文件(参见配置工作流属性),见代码3。

    oozie.wf.application.path=hdfs://sachicn001:8020/user/blublins/workflows/IPSIngestion
    jobTracker=sachicn003:2010
    nameNode=hdfs://sachicn001:8020

    代码3: 作业属性文件

    有了作业属性,我们就可以使用代码4中的命令来运行Oozie工作流。

    oozie job –oozie http://sachidn002.hq.navteq.com:11000/oozie/ -D driveID=729-pp00002-2011-02-08-09-59-34 -D lidarChunk=4 -D signageChunk=20 -config job.properties –run

    列表4: 运行工作流命令

    配置工作流属性

    在config-default.xml、作业属性文件和作业参数中有一些重叠,它们可以作为命令行调用的一部分传递给Oozie。尽管文档中没有清晰地指出何时使用哪个,但总体上的建议如下:

    • 使用config-default.xml定义对于指定工作流从未改变过的参数。
    • 对于给定的工作流部署通用的参数,建议使用作业属性。
    • 对于指定的工作流调用特定的参数使用命令行参数。

    Oozie处理这三种参数的方式如下:

    • 使用所有命令行调用的参数
    • 如果那里有任何无法解析的参数,那么就是用作业配置来解析
    • 一旦所有其它方式都无法处理,那么就试着使用config-default.xm。

    我们可以使用Oozie控制台(图2)来观察工作流执行的进程和结果。

    (点击可以查看大图)

    图2: Oozie控制台

    我们还可以使用Oozie控制台来获得操作执行的细节,比方说作业的日志[8](图3)。

    (点击可以查看大图)

    图3: Oozie控制台——作业日志

    编程方式的工作流调用

    尽管上面所述的命令行界面能够很好地用于手动调用Oozie,但有时使用编程的方式调用Oozie更具有优势。当Oozie工作流是特定的应用程序或者大型企业过程的一部分,这就会很有用。我们可以使用Oozie Web Services APIs [6]或者Oozie Java client APIs [7]来实现这种编程方式的调用。代码5中展现的就是很简单的Oozie Java客户端的例子,它会触发上面描述的过程。

    package com.navteq.assetmgmt.oozie;
    
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Properties;
    
    import org.apache.oozie.client.OozieClient;
    import org.apache.oozie.client.OozieClientException;
    import org.apache.oozie.client.WorkflowJob;
    import org.apache.oozie.client.WorkflowJob.Status;
    
    public class WorkflowClient {
    
        private static String OOZIE_URL = "http://sachidn002.hq.navteq.com:11000/oozie/";
        private static String JOB_PATH = "hdfs://sachicn001:8020/user/blublins/workflows/IPSIngestion";
        private static String JOB_Tracker = "sachicn003:2010";
        private static String NAMENode = "hdfs://sachicn001:8020";
    
        OozieClient wc = null;
    
        public WorkflowClient(String url){
            wc = new OozieClient(url);
        }
    
        public String startJob(String wfDefinition, List<WorkflowParameter> wfParameters)
            throws OozieClientException{
    
            // create a workflow job configuration and set the workflow application path
            Properties conf = wc.createConfiguration();
            conf.setProperty(OozieClient.APP_PATH, wfDefinition);
    
            // setting workflow parameters
            conf.setProperty("jobTracker", JOB_Tracker);
            conf.setProperty("nameNode", NAMENode);
            if((wfParameters != null) && (wfParameters.size() > 0)){
                for(WorkflowParameter parameter : wfParameters)
                    conf.setProperty(parameter.getName(), parameter.getValue());
            }
            // submit and start the workflow job
            return wc.run(conf);
        }
    
        public Status getJobStatus(String jobID) throws OozieClientException{
            WorkflowJob job = wc.getJobInfo(jobID);
            return job.getStatus();
        }
    
        public static void main(String[] args) throws OozieClientException, InterruptedException{
    
            // Create client
            WorkflowClient client = new WorkflowClient(OOZIE_URL);
            // Create parameters
            List<WorkflowParameter> wfParameters = new LinkedList<WorkflowParameter>();
            WorkflowParameter drive = new WorkflowParameter("driveID","729-pp00004-2010-09-01-09-46");
            WorkflowParameter lidar = new WorkflowParameter("lidarChunk","4");
            WorkflowParameter signage = new WorkflowParameter("signageChunk","4");
            wfParameters.add(drive);
            wfParameters.add(lidar);
            wfParameters.add(signage);
            // Start Oozing
            String jobId = client.startJob(JOB_PATH, wfParameters);
            Status status = client.getJobStatus(jobId);
            if(status == Status.RUNNING)
                 System.out.println("Workflow job running");
            else
                 System.out.println("Problem starting Workflow job");
        }
    }
    

    代码5: 简单的Oozie Java客户端

    在此,我们首先使用Oozie服务器URL对工作流客户端进行初始化。初始化过程完成之后,我们就可以使用客户端提交并启动作业(startJob方法),获得正在运行的作业的状态(getStatus方法),以及进行其他操作。

    构建java动作,向工作流传递参数

    在之前的示例中,我们已经展示了如何使用标签向Java节点传递参数。由于Java节点是向Oozie引入自定义计算的主要方法,因此能够从Java节点向Oozie传递数据也同样重要。

    根据Java节点的文档[3],我们可以使用“capture-output””元素把Java节点生成的值传递回给Oozie上下文。然后,工作流的其它步骤可以通过EL-functions访问这些值。返回值需要以Java属性格式文件写出来。我们可以通过“JavaMainMapper.OOZIE_JAVA_MAIN_CAPTURE_OUTPUT_FILE”常量从System属性中获得这些属性文件的名称。代码6是一个简单示例,演示了如何完成这项操作。

    package com.navteq.oozie;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.Properties;
    
    public class GenerateLookupDirs {
    
        /**
        * @param args
        */
        public static final long dayMillis = 1000 * 60 * 60 * 24;
        private static final String OOZIE_ACTION_OUTPUT_PROPERTIES = "oozie.action.output.properties";
    
        public static void main(String[] args) throws Exception {
            Calendar curDate = new GregorianCalendar();
            int year, month, date;
            String propKey, propVal;
    
            String oozieProp = System.getProperty(OOZIE_ACTION_OUTPUT_PROPERTIES);
            if (oozieProp != null) {
                File propFile = new File(oozieProp);
                Properties props = new Properties();
    
                for (int i = 0; I < 8; ++i) {
                    year = curDate.get(Calendar.YEAR);
                    month = curDate.get(Calendar.MONTH) + 1;
                    date = curDate.get(Calendar.DATE);
                    propKey = "dir"+i;
                    propVal = year + "-" +
                        (month < 10 ? "0" + month : month) + "-" +
                        (date < 10 ? "0" + date : date);
                    props.setProperty(propKey, propVal);
                    curDate.setTimeInMillis(curDate.getTimeInMillis() - dayMillis);
                }
                OutputStream os = new FileOutputStream(propFile);
                props.store(os, "");
                os.close();
            } else
                throw new RuntimeException(OOZIE_ACTION_OUTPUT_PROPERTIES
                 + " System property not defined");
            }
    }

    代码6: 向Oozie传递参数

    在这个示例中,我们假设在HDFS中有针对每个日期的目录。这样,这个类首先会获得当前日期,然后再获得离现在最近的7个日期(包括今天),然后把目录名称传递回给Oozie。

    结论

    在本文我们介绍了Oozie,它是针对Hadoop的工作流引擎,并且提供了使用它的简单示例。在下一篇文章中,我们会看到更复杂的例子,让我们可以更进一步讨论Oozie的特性。

    致谢

    非常感谢我们在Navteq的同事Gregory Titievsky,他为我们提供了一些例子。

    关于作者

    Boris Lublinsky是NAVTEQ公司的首席架构师,在这家公司中他的工作是为大型数据管理和处理、SOA以及实现各种NAVTEQ的项目定义架构的愿景。 他还是InfoQ的SOA编辑,以及OASIS的SOA RA工作组的参与者。Boris是一位作者,还经常发表演讲,他最新的一本书是《Applied SOA》。

    Michael Segel在过去二十多年间一直与客户写作,识别并解决他们的业务问题。 Michael已经作为多种角色、在多个行业中工作过。他是一位独立顾问,总是期望能够解决所有有挑战的问题。Michael拥有俄亥俄州立大学的软件工程学位。


    [1]edge节点是安装有Hadoop库的计算机,但不是真正簇集中的一部分。它是为能够连接到簇集中的应用程序所用的,并且会部署辅助服务以及能够直接访问簇集的最终用户应用程序。

    [2]请参看Oozie安装的链接。

    [3]这些作业的细节和本文无关,所以在其中没有描述。

    [4]Map/Reduce作业能够以两种不同的方式在Oozie中实现——第一种是作为真正的Map/Reduce动作[2],其中你会指定Mapper和Reducer类以及它们的配置信息;第二种是作为Java动作[3],其中你会使用Hadoop API来指定启动Map/Reduce作业的类。因为我们所有的Java主函数都是使用Hadoop API,并且还实现了一些额外的功能,所以我们选择了第二种方法。

    [5] Oozie确保两个动作会并行地提交给作业跟踪程序。在执行过程中实际的并行机制并不在Oozie的控制之内,并且依赖于作业的需求、簇集的能力以及Map/Reduce部署所使用的调度程序。

    [6]join动作的功能是要同步fork动作启动的多个并行执行的线程。如果fork启动的所有执行的线程都能够成功完成,那么join动作就会等待它们全部完成。如果有至少一个线程执行失败,kill节点会“杀掉”剩余运行的线程。

    [7] 这个节点不需要是安装了Oozie的计算机。

    [8] Oozie的作业日志会包含工作流执行的细节,想要查看动作执行的细节,我们需要切换到Hadoop的Map/Reduce管理页面。

    查看英文原文:Introduction to Oozie

     

    转自 http://www.infoq.com/cn/articles/introductionOozie/

     



    本文转自茄子_2008博客园博客,原文链接:http://www.cnblogs.com/xd502djj/p/4929369.html,如需转载请自行联系原作者。


    展开全文
  • apache oozie workflow scheduler for hadoop
  • 一、ooize使用sqoop将oracle导入到hdfs 二、ooize串行定时任务 三、ooize并行定时任务 四、遇到的问题   一、ooize使用sqoop将oracle表导入到hdfs 此处在ooize的lib文件夹下需要oracle的OJDBC驱动包, 不然...

    本文包含内容:

    一、ooize使用sqoop将oracle导入到hdfs

    二、ooize串行定时任务

    三、ooize并行定时任务

    四、遇到的问题

     

    一、ooize使用sqoop将oracle表导入到hdfs

    此处在ooize的lib文件夹下需要oracle的OJDBC驱动包, 不然会报错

    workflow.xml文件

    <workflow-app xmlns="uri:oozie:workflow:0.4" name="sqoop-wmz">
        <start to="sqoop-node"/>
        <action name="sqoop-node">
            <sqoop xmlns="uri:oozie:sqoop-action:0.3">
                <job-tracker>${jobTracker}</job-tracker>
                <name-node>${nameNode}</name-node>
            <configuration>
                    <property>
                      <name>mapred.job.queue.name</name>
                      <value>${queueName}</value>
                    </property>
                    <property>
                      <name>oozie.sqoop.log.level</name>
                      <value>WARN</value>
                    </property>
                </configuration>
            <command>sqoop import --connect jdbc:oracle:thin:@***.***.**.***:1521:orcl --username ** --password ** --table ** --delete-target-dir --target-dir /yss/guzhi/**/** --m 1</command>
        </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>
    

    job.properties文件

    nameNode=hdfs://bj-rack001-hadoop002:8020
    jobTracker=bj-rack001-hadoop003:8050
    queueName=default
    examplesRoot=wmz_test
    oozie.libpath=hdfs://bj-rack001-hadoop002:8020/user/oozie/share/lib/sqoop
    oozie.use.system.libpath=true
    oozie.wf.application.path=${nameNode}/tmp/oracle2hdfs
    
    

    二、ooize串行定时任务

    当需求需要导入导出多表或者多个操作时,可以添加多个action, 将多个命令放入一个command或者将多个command写入一个action都会报错

    workflow.xml文件 首先通过shell脚本获取当前日期, 再赋值给sqoop的命令, 以当天日期建立文件夹

    <?xml version="1.0" encoding="UTF-8"?>
    <workflow-app xmlns="uri:oozie:workflow:0.5" name="testshell-wmz">
    <start to="shell-node"/>
    	<action name="shell-node">
    		<shell xmlns="uri:oozie:shell-action:0.1">
    			<job-tracker>${jobTracker}</job-tracker>
    			<name-node>${nameNode}</name-node>
    			<configuration>
    				<property>
    					<name>mapred.job.queue.name</name>
    					<value>${queueName}</value>
    				</property>
    			</configuration>
    			<exec>${shell}</exec>
    			<file>${nameNode}/tmp/oracle2hdfs/${shell}#${shell}</file>
    			<capture-output/>
    		</shell>
    		<ok to="sqoop-node"/>
    		<error to="fail"/>
    	</action>
        <action name="sqoop-node">
            <sqoop xmlns="uri:oozie:sqoop-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>
                <command>import --connect jdbc:oracle:thin:@***.***.***.**:1521:orcl --username **--password **--table ***--target-dir /yss/guzhi/**/${wf:actionData('shell-node')['day']}/LSETLIST/ --delete-target-dir --m 1 </command>
            </sqoop>
            <ok to="sqoop-node2"/>
            <error to="fail"/>
        </action>
    
    <action name="sqoop-node2">
            <sqoop xmlns="uri:oozie:sqoop-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>
                <command>import --connect jdbc:oracle:thin:@***.***.***.**:1521:orcl --username **--password **--table ***--target-dir /yss/**/**/${wf:actionData('shell-node')['day']}/CSGDZH --delete-target-dir --m 1 </command>
            </sqoop>
            <ok to="sqoop-node3"/>
            <error to="fail"/>
        </action>
    
    <action name="sqoop-node3">
            <sqoop xmlns="uri:oozie:sqoop-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>
                <command>import --connect jdbc:oracle:thin:@***.***.***.**:1521:orcl --username **--password **--table ***--target-dir /yss/**/**/${wf:actionData('shell-node')['day']}/CSQSXW --delete-target-dir --m 1 </command>
            </sqoop>
            <ok to="end"/>
            <error to="fail"/>
        </action>
        <kill name="fail">
            <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
        </kill>
       <end name='end'/>
    </workflow-app>
    

    coordinator.xml文件  这里设置的是12小时跑一次

    <coordinator-app name="oracleToHdfsBySqoop-wmz" frequency="${coord:hours(12)}" start="${start}" end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.5">
    <action>
        <workflow>
            <app-path>${nameNode}/tmp/oracle2hdfs/workflow.xml</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>

    shell  获取当天日期

    #!/bin/sh
    day=`date '+%Y%m%d'`
    echo "day:$day"
    

    job.properties

    nameNode=hdfs://bj-rack001-hadoop002:8020
    jobTracker=bj-rack001-hadoop003:8050
    queueName=default
    examplesRoot=examples
    
    
    oozie.service.coord.check.maximum.frequency=false
    oozie.coord.application.path=${nameNode}/tmp/oozietest/
    start=2018-09-11T16:00Z
    end=2018-09-11T16:00Z
    workflowAppUri=${oozie.coord.application.path}
    

    因为设置的GML时间, 所以时间上要北京时间-8小时

    三、ooize并行任务

    当串行action过多时会导致效率过慢,此时可以设置并行执行

    这里并行执行用到了bundle组建

    workflow1.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <workflow-app xmlns="uri:oozie:workflow:0.5" name="bundle-wmz">
    <start to="shell-node"/>
            <action name="shell-node">
                    <shell xmlns="uri:oozie:shell-action:0.1">
                            <job-tracker>${jobTracker}</job-tracker>
                            <name-node>${nameNode}</name-node>
                            <configuration>
                                    <property>
                                            <name>mapred.job.queue.name</name>
                                            <value>${queueName}</value>
                                    </property>
                            </configuration>
                            <exec>${shell}</exec>
                            <file>${nameNode}/tmp/oracle2hdfs/${shell}#${shell}</file>
                            <capture-output/>
                    </shell>
                    <ok to="sqoop-node"/>
                    <error to="fail"/>
            </action>
             <action name="sqoop-node">
            <sqoop xmlns="uri:oozie:sqoop-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>
     <command>import --connect jdbc:oracle:thin:@***.***.***.**:1521:orcl --username ***--password ***--table LSETLIST --target-dir /yss/guzhi/***/${wf:actionData('shell-node')['day']}/LSETLIST/ --delete-target-dir --m 1 </command>
            </sqoop>
            <ok to="end"/>
            <error to="fail"/>
        </action>
         <kill name="fail">
            <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
        </kill>
       <end name='end'/>
    </workflow-app>
    
    

    workflow2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <workflow-app xmlns="uri:oozie:workflow:0.5" name="bundle2-wmz">
    <start to="shell-node"/>
            <action name="shell-node">
                    <shell xmlns="uri:oozie:shell-action:0.1">
                            <job-tracker>${jobTracker}</job-tracker>
                            <name-node>${nameNode}</name-node>
                            <configuration>
                                    <property>
                                            <name>mapred.job.queue.name</name>
                                            <value>${queueName}</value>
                                    </property>
                            </configuration>
                            <exec>${shell}</exec>
                            <file>${nameNode}/tmp/oracle2hdfs/${shell}#${shell}</file>
                            <capture-output/>
                    </shell>
                    <ok to="sqoop-node2"/>
                    <error to="fail"/>
            </action>
            <action name="sqoop-node2">
            <sqoop xmlns="uri:oozie:sqoop-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>
                <command>import --connect jdbc:oracle:thin:@***.***.***.**:1521:orcl --username ***--password ***--table CSGDZH --target-dir /yss/guzhi/***/${wf:actionData('shell-node')['day']}/CSGDZH --delete-target-dir --m 1 </command>
            </sqoop>
            <ok to="end"/>
            <error to="fail"/>
        </action>
    
         <kill name="fail">
            <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
        </kill>
       <end name='end'/>
    </workflow-app>
    
    

    workflow3.xml等以此类推

     

    coordinate1.xml

    <coordinator-app name="oracleToHdfsBySqoop-wmz" frequency="${coord:hours(12)}" start="${start}" end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.5">
    <action>
    <workflow>
    <app-path>${workflowAppUri1}</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>
    

    coordinate2.xml

    <coordinator-app name="oracleToHdfsBySqoop-wmz" frequency="${coord:hours(12)}" start="${start}" end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.5">
    <action>
    <workflow>
    <app-path>${workflowAppUri2}</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>
    

    corrdinate3.xml等以此类推

    bundle.xml

    <bundle-app name='bundle-app' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:bundle:0.1'>
    
              <coordinator name='cron-bundle1'>
                     <app-path>${coordinator1}</app-path>
              </coordinator>
    
              <coordinator name='cron-bundle2'>
                     <app-path>${coordinator2}</app-path>
              </coordinator>
    </bundle-app>
    

    job.properties

    nameNode=hdfs://bj-rack001-hadoop002:8020
    jobTracker=bj-rack001-hadoop003:8050
    queueName=default
    examplesRoot=wmz_test
    oozie.libpath=hdfs://bj-rack001-hadoop002:8020/user/oozie/share/lib/sqoop
    oozie.use.system.libpath=true
    #oozie.wf.application.path=${nameNode}/tmp/oracle2hdfs
    shell=getDate.sh
    
    oozie.bundle.application.path=${nameNode}/tmp/oracle2hdfs/bundle.xml
    
    oozie.service.coord.check.maximum.frequency=false
    #oozie.coord.application.path=${nameNode}/tmp/bundleTest
    start=2018-09-10T16:00Z
    end=2028-09-10T16:00Z
    
    workflowAppUri1=${nameNode}/tmp/oracle2hdfs/workflow1.xml
    workflowAppUri2=${nameNode}/tmp/oracle2hdfs/workflow2.xml
    
    coordinator1=${nameNode}/tmp/oracle2hdfs/coordinator1.xml
    coordinator2=${nameNode}/tmp/oracle2hdfs/coordinator2.xml
    

    oozie job -oozie http://***.***.***.***:11000/oozie -config /data/temp/wmz/shelltest/job.properties -run 执行任务

    四、遇到的问题

    1、脚本文件起始 若#!/bin/bash无法执行报错,可写为#!/bin/sh

    2、之前试过将sqoop操作写入shell, 使用ooize执行shell操作sqoop, 但是shell中的sqoop只能做到list-tables和list-databases,各种import命令都无法执行,至今不知道是什么原因, 单独执行脚本也可以执行, 单独用ooize执行shell和单独用ooize执行sqoop import操作都没问题, 但是结合起来就不行, 很诧异。

    展开全文
  • 基于CentOS 7.2的CDH6.3.2离线安装 https://blog.csdn.net/qq_40180229/article/details/108755530 基于CentOS 7.2的CDH 6.3.2... 添加Ooize Select Dependencies 4. 自定义角色分配 数据库设置 审核更改 命令详细信息

    基于CentOS 7.2的CDH6.3.2离线安装

    https://blog.csdn.net/qq_40180229/article/details/108755530

    基于CentOS 7.2的CDH 6.3.2完整集群添加

    https://blog.csdn.net/qq_40180229/article/details/108756561

    基于CentOS 7.2的CDH 6.3.2 Hadoop配置

    https://blog.csdn.net/qq_40180229/article/details/108770544

    OOIZE安装

    1. 添加服务

    在这里插入图片描述
    2. 添加Ooize

    在这里插入图片描述

    1. Select Dependencies

    在这里插入图片描述
    4. 自定义角色分配

    在这里插入图片描述

    1. 数据库设置

    在这里插入图片描述

    1. 审核更改

    在这里插入图片描述

    1. 命令详细信息

    在这里插入图片描述

    展开全文
  • OOIZE整理笔记

    2013-03-03 16:02:00
    1 环境搭建准备 hadoop0.20.2 jkd1.6.0.38 ext-2.2 Oozie3.02 apache-tomcat-6.0.36 ...Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容: ...

    1 环境搭建准备

    hadoop0.20.2

    jkd1.6.0.38

    ext-2.2

    Oozie3.02

    apache-tomcat-6.0.36

    2 Oozie 介绍

    Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容:

    • 工作流定义
    • 当前运行的工作流实例,包括实例的状态和变量

    Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。我们会使用hPDL(一种XML流程定义语言)来描述这个图。

    hPDL是一种很简洁的语言,只会使用少数流程控制和动作节点。控制节点会定义执行的流程,并包含工作流的起点和终点(start、end和fail节点)以及控制工作流执行路径的机制(decision、fork和join节点)。动作节点是一些机制,通过它们工作流会触发执行计算或者处理任务。Oozie为以下类型的动作提供支持: Hadoop map-reduce、Hadoop文件系统、Pig、Java和Oozie的子工作流(SSH动作已经从Oozie schema 0.2之后的版本中移除了)。

    所有由动作节点触发的计算和处理任务都不在Oozie之中——它们是由Hadoop的Map/Reduce框架执行的。这种方法让Oozie可以支持现存的Hadoop用于负载平衡、灾难恢复的机制。这些任务主要是异步执行的(只有文件系统动作例外,它是同步处理的)。这意味着对于大多数工作流动作触发的计算或处理任务的类型来说,在工作流操作转换到工作流的下一个节点之前都需要等待,直到计算或处理任务结束了之后才能够继续。Oozie可以通过两种不同的方式来检测计算或处理任务是否完成,也就是回调和轮询。当Oozie启动了计算或处理任务的时候,它会为任务提供唯一的回调URL,然后任务会在完成的时候发送通知给特定的URL。在任务无法触发回调URL的情况下(可能是因为任何原因,比方说网络闪断),或者当任务的类型无法在完成时触发回调URL的时候,Oozie有一种机制,可以对计算或处理任务进行轮询,从而保证能够完成任务。

    Oozie工作流可以参数化(在工作流定义中使用像${inputDir}之类的变量)。在提交工作流操作的时候,我们必须提供参数值。如果经过合适地参数化(比方说,使用不同的输出目录),那么多个同样的工作流操作可以并发。

    一些工作流是根据需要触发的,但是大多数情况下,我们有必要基于一定的时间段和(或)数据可用性和(或)外部事件来运行它们。Oozie协调系统(Coordinator system)让用户可以基于这些参数来定义工作流执行计划。Oozie协调程序让我们可以以谓词的方式对工作流执行触发器进行建模,那可以指向数据、事件和(或)外部事件。工作流作业会在谓词得到满足的时候启动。

    经常我们还需要连接定时运行、但时间间隔不同的工作流操作。多个随后运行的工作流的输出会成为下一个工作流的输入。把这些工作流连接在一起,会让系统把它作为数据应用的管道来引用。Oozie协调程序支持创建这样的数据应用管道。

    3 环境搭建

    1     下载上述准备的应用软件。

    2      将上述准备好的材料统统放入 /home/software/ 进行解压(ext-2.2除外)

    3 设置环境变量

    export OOZIE_HOME=/home/software/oozie-3.0.2

    export CATALINA_HOME=/home/software/apache-tomcat-6.0.36

    export JRE_HOME=/usr/jdk1.7.0_10/jre。

    4 安装OOZIE

    输入命令

    $OOZIE_HOME/bin/oozie-setup.sh -hadoop 0.20.2 /home/software/hadoop-0.20.2 -extjs /home/software/ext-2.2.zip

    运行这条命令Oozie会将hadoop相关jar和oozie等拷贝到Oozie中.同时得到以下结果则代表你安装成功:

        New Oozie WAR file with added 'Hadoop JARs, ExtJS library' at /home/software/ oozie-3.0.2/oozie-  server/webapps/oozie.war

    INFO: Oozie is ready to be started。

    6)启动OOZIE

    这里你要先确定你的Tomcat没有在运行.输入命令:

    $OOZIE_HOME/bin/oozie-run.sh

    之后会看到一大把的输出,同时Oozie会启动Tomcat.当你看到

    2013-01-30 21:15:21 org.apache.catalina.startup.Catalina start

        信息: Server startup in 17365 ms

       则表示Oozie启动成功.

    7)查看web控制台

       输入命令:

       $OOZIE_HOME/bin/oozie admin -oozie http://localhost:11000/oozie -status

    当看到结果:

       System mode: NORMAL

        则表示已经成功,通过浏览器输入 http://localhost:11000/oozie就能看到Oozie的管理界面.

     

    4 常见问题

    访问oozie页面遇到404错误

    解决方案:

    1,把conf/oozie-default.xml里面的oozie.services属性值全部复制到conf/oozie-site.xml里面。
    2,删去其中的org.apache.oozie.service.KerberosHadoopAccessorService值;
    3,增加一个值:org.apache.oozie.service.HadoopAccessorService。

    4, 重启oozie

    二 webApp IE9 页面空白

    解决方案:

    1、         由于 OOZIE 使用的是extjs2.2版本,因此不支持IE9,硬伤问题。

    2、         经测试,谷歌浏览器、与火狐浏览器正常运行。

    转载于:https://www.cnblogs.com/elwiny/articles/OOZIE.html

    展开全文
  • 简单的任务调度:直接使用crontab 大数据-工作流任务调度器:ooize、azkaban、airflow 一、工作流任务调度器简介 什么是工作流? 业务过程的部分或整体在计算机应用环境下的自动化 工作流具有特点: 整个流程可以被...
  • Ooize 在 Hadoop 中执行的任务有时候需要把 多个 Map/Reduce 作业连接到一起 ,这样才能够达到目的。 [1] 在 Hadoop 生态圈中,有一种相对比较新的组件叫做 Oozie[2] ,它让我们可以把 多个 Map/Reduce 作业组合到一...
  • ooize节点的属性控制

    2016-10-08 16:30:00
    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:[version]"> <credentials>...</credentials> <!-- 可选:定义凭证信息,一般用于权限验证相关的配置 -->...
  • 海豚计划程序官方网站 设计特点 DolphinScheduler是具有功能强大的DAG可视界面的分布式可扩展工作流调度程序平台,专用于解决数据管道中的复杂作业依赖性,并提供out of the box各种类型的作业。...
  • Oozie自气流 一种在工作流程和工作流程之间轻松转换的工具。 该程序的目标是Apache Airflow> = 1.10和Apache Oozie 1.0 XML模式。 如果您想为该项目做出贡献,请查看 目录 背景 Apache Airflow是由AirBnB在2014年...
  • oozie+spark2结合

    2018-03-01 18:04:45
    CDH环境中oozie+spark2集成的详细步骤,让spark2也支持工作流。
  • ooize】oozie启动失败

    千次阅读 2012-12-11 13:45:01
    今天遇到一个很蛋疼的问题,一个workflow僵死,通过oozie job -kill XXXX,无法将其杀死,郁闷之极,然后将oozie重新启动,重启之后发现该workflow仍然僵死,显示处于running状态,猜想应该是oozie所对应的数据库中...
  • OozieWeb的js组件,有需下载,有需要的拿去,网上找的好烦
  • 资源是flink的编译包, Flink 编译和运行要求 Java 版本至少是 Java 8,且最好选用 Java 8u51 及以上版本,我选用的是java version "1.8.0_181",源码是基于scala2.11,maven是3.2.5
  • azkaban: 由于azkaban是由领英公司开源, 并不属于apache环境, 所以HUE对其是不支持的, 如果需要使用azkaban, 需要单独维护一套azkaban调度环境 ooize: 是由apache开源, 属于apache怀抱下产品, 同时HUE也是apache...
  • 目的:使用Ooize调度MapReduce程序。 方式:将以前Java MapReduce程序中的Driver部分写到workflow.xml中的configuration里面。 示例:用Oozie安装包中自带的examples例子跑wordcount程序。 (1)在hdfs上创建...
  • 工作流oozie文档

    2017-12-12 10:02:15
    华为云,应用的开源工作流调度管理,介绍的还是比较详细的.
  • oozie mysql数据库表

    2018-11-07 13:03:12
    oozie mysql数据库表结构。文档里是oozie mysql的建表语句
  • hue中对spark任务的支持,是靠oozie支撑的。文档中提供了如何在hue中提交spark作业的操作步骤。
  • Oozie任务调度阻塞及内存优化方法

    千次阅读 2020-06-10 16:35:19
    Oozie在执行过程中如果有多个fork产生并行任务的时候,这时会占用很多内存,如果机器的内存不够则会产生调度阻塞。或者是同时提交了多个Oozie任务,也会产生调度阻塞。本文针对上述问题,首先分析研究了Oozie的工作...
  •  然后,启动ooize,见博客 Oozie的详细启动步骤(CDH版本的3节点集群)   http: // bigdatamaster:11000/oozie/         http: // bigdatamaster:8888/oozie/list_oozie_workflows/ ...
  • Hue集成Oozie

    2020-08-31 20:28:31
    Hue集成Oozie 5.1.修改hue配置文件hue.ini [liboozie] # The URL where the Oozie service runs on. This is required in order for # users to submit jobs.... # Requires FQDN in oozie_url.
  • Oozie和Azkaban的技术选型和对比

    万次阅读 2016-08-09 18:29:25
    源码角度分析Oozie和Azkaban的优劣
  • Oozie的简单使用

    千次阅读 2019-05-26 16:27:16
    1、Oozie的介绍     Oozie是一个工作流引擎服务器,用于运行Hadoop Map/Reduce和Hive等任务工作流....Oozie以action为基本任务单位,可以将多个action构成一个DAG图(有向无环图Direct Acyclic ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 709
精华内容 283
关键字:

ooize