oozienote

2017-06-17  本文已影响350人  时待吾

1/oozie 支持  hadoop mr spark  hive  pig  java  sh  DAG有向无环图2/ 是一组动作节点的组合  所有动作节点触发的计算任务不在Oozie之中,是由Map-reduce框架执行的。好处:oozie 支持hadoop的负载均衡 灾难恢复  异步执行  文件系统是同步执行3/ oozie通过两种不同的方式 检测计算或处理任务是否完成  回调或轮询当oozie启动计算处理任务时,会为具体的任务提供唯一的回调URL,当任务会在完成的时候发送通知给当初传递的URL。在任务无法触发回调URL的情况下,(可能是任何原因,比如说网络闪断),当任务的类型无法实现在完成时触发回调URL的时候,OOzie有一种机制,可以对处理或计算任务进行轮询,从而保证能够完成任务。oozie工作流可以并发一些工作流是根据需要触发的,但是大多数情况下,我们有必要基于一定的时间段和(或)数据可用性和(或)外部事件来运行它们。Oozie协调系统(Coordinator system)让用户可以基于这些参数来定义工作流执行计划。Oozie协调程序让我们可以以谓词的方式对工作流执行触发器进行建模,那可以指向数据、事件和(或)外部事件。工作流作业会在谓词得到满足的时候启动。  经常我们还需要连接定时运行、但时间间隔不同的工作流操作。多个随后运行的工作流的输出会成为下一个工作流的输入。把这些工作流连接在一起,会让系统把它作为数据应用的管道来引用。Oozie协调程序支持创建这样的数据应用管道。 oozie的编译非常困难,oozie的版本,hadoop的版本都非常敏感经验总结:    目前看来,编译Hadoop2.2.0版本的oozie,使用oozie4.4.0编译分布式程序集,命令如下      mvn clean package assembly:single -DskipTests=true -Dhadoop.version=2.2.0 oozie概述:oozie是基于hadoop的调度器,以xml的形式写调度流程,可以调度mr/pig/hive/shell/jarWorkflow:顺序执行流程节点,支持fork 分支多个节点 join合并多个节点为一个Coordinator:定时触发workflowBundler Job:绑定多个 coordinatoroozie格式:一个oozie,有两个是必须的 job.properties 和 workflow.xml  (coordinator.xml    bundle.xml)nameNode=hdfs://nameservice1 或者 hdfs://ip:port (安装HDFS namenode节点的ip:8020 默认端口号为8020 在CDH中为Nameode端口 -- fs.default.name fs.defaultFS) hdfs地址 其中nameService1为HDFS安装的NameNode Nameservice 可以通过hdfs的配置查看 也可以在集群的客户端配置中的hdfs-site.xml dfs.nameservices对应的值jobTracker= yarnRM/ hadoop6:8032 目的为跟踪监控MR 任务 因此是安装了Yarn 的Resource Manager的服务器对应的ip和端口 8032为ResourceManager地址(yarn.resourcemanager.address) 也可以通过客户端配置中的yarn-site.xml查看 yarnRM是 RM—HA 集群ID yarn.resourcemanager.cluster-id(可通过CDH  yarn 配置查看 或者 通过客户端配置中的yarn-site.xml查看)queueName=default // 集群资源是根据队列进行限制的  因此具体任务的运行需要集群资源 因此集群资源得首先需要加入队列中  假设指定为production  则oozie程序的启动需要进入production队列 是MAPREDUEC 应用程序类型  oozie的异步计算处理任务也是通过productionoozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/map-reduce备注:关于资源队列,因为oozie多数计算任务是异步执行的,会在bundle/coordinator/workflow 需要进行配置计算任务所需的队列。但实际上真正执行任务的是workflow中的动作节点,所以个人理解,只需要在workflow配置一个全局的mapred.job.queue.name 为 ${queueName} 即可执行通常会在coordinator和bundle 中定义 queueName 为 ${queueName}假设在三个文件中都指定队列为为${queueName} = production  则应用类型多数为map reduce 队列为production(oozie:laucher:T=Sqoop:W=WorkFlowName:A=actionName:ID=oozieID 以及(oozie:laucher:T=hive2:W=WorkFlowName:A=actionName:ID=oozieID) 以及 对应的hive语句) 均为指定的队列自己做了一个测试例子:不是直接编辑*.xml文件,而是通过hue直接操作oozie定义一个workflow和coordiantor任务。首先在定义workflow时将 创建编辑 sparkmaster yarn 模式 client  appname  JarFile(尽量放置在绝对的HDFS路径上 最好时oozie工作空间的lib目录下  jar包所需要的jar包也提交进该lib  或许用HDFS: 绝对路径指定jar包也是可以的,否则会包system.exitcode(1) 或者 mainclass not found exception )在进行spark具体配置填写时 填写Option list 是一些在 spark-submit的一些指定参数  如 --executor-memory --executor-core  --conf spark.executor.extraClassPath=Hdfs://nameNodeNameService/path1:Hdfs://nameNodeNameService/path1等等参数 最好添加一个 --conf spark.yarn.jar=path/spark-assembly_2.10-1.6.0-cdh5.7.1.jar( 对应版本)所需要的jar包在Option list中指定 一定要用hdfs的绝对路径(用file的服务器上的绝对路径试了  不行 报所需要的jar包中某一个类不存在异常)并在设置界面指定mapred.job.queue.name 为 ${queueName}  并没有在option list中指定 --queue queuename配置完成后,提交oozie结果发现,oozie的任务是mapreduce类型 队列是production  spark应用程序的是spark应用类型  队列是default  也就是说执行spark程序时 显示指定mapred.job.queue.name 为 ${queueName} 对于spark程序无意义。而同时这个action的全局变量mapred.job.queue.name 为 ${queueName},也使得oozie加载程序运行在该队列中。。。  当在OPtion list修改添加  --queue queuename  spark应用程序也使用production队列 其他没变当使用定时器时 仅仅指定开始结束时间 以及频率时,(不添加option list) 问题遇上相同。其中workflow有一个oozie workspace(包含workflow.xml job.properties),coordinator有一个workspace(包含coordinator.xml job.properties), 其中coordinator-workspace中的job.properties 比 oozie workspace的job.properties 多一个开始时间 结束时间以及workflowPath  没有指定queueName。如果自己编写bundle.xml  coordinator.xml workflow.xml 的话,建议在job.properties中指定queueName(oozie的运行队列)  后续在配置文件中指定队列即可。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.pathcoordinator:oozie.coord.application.pathbundle:oozie.bundle.application.path注意:coordinator设置的UTC,比北京时间晚8个小时,所以你要是把期望执行时间减8小时启动任务:oozie job -oozie http://oozieServer:11000/oozie -config job.properties -run  (job.properties 应该注意一下两点:user.name的指定 queue的指定是oozie程序指定  以及 oozie.wf.application.path的指定 ) 并确保workflow.xml与所要运行的jar在同一个目录里 jar可以在其目录的lib下停止任务:oozie job -oozie http://oozieServer:11000/oozie -kill 14-20090525161321-oozie-joe注意:在停止任务的时候,有的时候会出现全线问题,需要修改oozie-site.xml文件hadoop.proxyuser.oozie.groups *hadoop.proxyuser.oozie.hosts *oozie.server.ProxyUserServer.proxyuser.hadoop.hosts *oozie.server.ProxyUserServer.proxyuser.hadoop.groups *Oozie工作流属性配置的三种方式Oozie有三种方法可以给工作流提供属性属性配置:    App部署文件夹根目录下的:config-default.xml    作业属性文件:job.properties    在命令行中指定属性:-Dkey=valueOozie工作流属性配置的策略(最佳实践)坦率地讲,三种配置相互重叠,全部使用会使属性的配置过于分散,使得查找和定位属性变得繁琐。就我个人的经验,我倾向于这样做:    对于静态的,不会因每次启动而发生成改变的配置项,全部配置在config-default.xml,因为这个文件是Oozie部署自包含(self-contained application)应用程序规范的一部分,也就是说这个文件会被自动加载并读取,就如同J2EE的中web.xml一样,所以把静态的配置项写在这里是最理想的。    对于动态的,会因为每次启动而变化的配置项(典型的例子是coordinator的start time), 通过命令行的方式指定是最合适的。    通常,大多数的构建工具(比如maven)都能够在构建时根据build的目标环境替换配置文件中的一些变量,我们应该利用这个特性,对config-default.xml和命令行(假如你有一个命令行脚本的话)中的与环境相关的属性在构建时进行替换。典型的例子是nameNode和jobTracker。    避免使用job.properties,因为job.properties是一个本地文件,它显然没有config-default.xml方便,因为config-default.xml是自包含的。综上所属,一个简洁地启动工作流的命令行应该是这个样子的:首先,指定oozie.wf.application.path或oozie.coord.application.path或oozie.bundle.application.path是必不可少的,因为至少你要告诉oozie,你的应用程序放在哪里,然后我们需要从命令行中再指定一些动态参数。因此,通过命令行启动一个工作流往往会是这样的:oozie job -run \-Doozie.wf.application.path=hdfs://your-namenode:8020/your/app/path \-DPARAM1=${PARAM1} \-DPARAM1=${PARAM2}至于工作流其他的属性配置,都已存放于hdfs://your-namenode:8020/your/app/path/config-default.xml中。Oozie工作流属性的命名规范最后,作为一个补充,我们来谈谈oozie对其属性命名的要求:- Properties that are a valid Java identifier, [A-Za-z_][0-9A-Za-z_]* , are available as '${NAME}' variables within the workflow definition.- **Properties that are not valid Java Identifier, for example 'job.tracker'**, are available via the String wf:conf(String name) function.是的,看上去也是有点奇葩的规定了,对于Oozie的属性名,只允许 使用数字、字母和下滑线,类似于job.tracker这样的属性名是非法的!Oozie提出了Coordinator的概念,他们能够将每个工作流Job作为一个动作(Action)来运行,相当于工作流定义中的一个执行节点(我们可以理解为工作流的工作流),这样就能够将多个工作流Job组织起来,称为Coordinator Job,并指定触发时间和频率,还可以配置数据集、并发数等。Coordinator应用是指当满足一定条件时,会触发Oozie工作流Job(在Coordinator中将工作流Job定义为一个动作(Action))。其中,触发条件可以是一个时间频率、一个dataset实例是否可用,或者可能是外部的其他事件。Coordinator Job是一个Coordinator应用的运行实例,这个Coordinator Job是在Oozie提供的Coordinator引擎上运行的,并且这个实例从指定的时间开始,直到运行结束。    PREP 、RUNNING、RUNNINGWITHERROR、PREPSUSPENDED、SUSPENDED、SUSPENDEDWITHERROR、PREPPAUSED、PAUSED、PAUSEDWITHERROR、SUCCEEDED、DONEWITHERROR、KILLED、FAILEDCoordinator Job的基本执行单元可能是一个基本Oozie Job,而且外加了一些调度信息,必然要增加额外的状态来描述。一个Coordinator Job会创建并执行Coordinator 动作(Coordinator Action)。通常一个Coordinator 动作是一个工作流Job,这个工作流Job会生成一个dataset实例并处理这个数据集。当一个一个Coordinator 动作被创建以后,它会一直等待满足执行条件的所有输入事件的完成然后执行,或者发生超时。每个Coordinator Job都有一个驱动事件,来决定它所包含的Coordinator动作的初始化(创建)。对于同步Coordinator Job(synchronous coordinator job)来说,触发执行频率(frequency)就是一个驱动事件。同样,组成Coordinator Job的基本单元是Coordinator 动作(Coordinator Action),它不像Oozie工作流Job只有OK和Error两个执行结果,一个Coordinator 动作的状态集合,如下所示:    WAITING    READY    SUBMITTED    TIMEDOUT    RUNNING    KILLED    SUCCEEDED    FAILEDcontrol元素定义了一个Coordinator Job的控制信息,主要包括如下三个配置元素:timeout 超时时间,单位为分钟。当一个Coordinator Job启动的时候,会初始化多个Coordinator动作,timeout用来限制这个初始化过程。默认值为-1,表示永远不超时,如果为0 则总是超时。单位为分钟concurrency 并发数,指多个Coordinator Job并发执行,默认值为1。execution 配置多个Coordinator Job并发执行的策略:默认是FIFO。另外还有两种:LIFO(最新的先执行)、LAST_ONLY(只执行最新的Coordinator Job,其它的全部丢弃)。throttle  一个Coordinator Job初始化时,允许Coordinator动作处于WAITING状态的最大数量。    Dataset元素 Coordinator Job中有一个Dataset的概念,它可以为实际计算提供计算的数据,主要是指HDFS上的数据目录或文件,能够配置数据集生成的频率(Frequency)、URI模板、时间等信息    input-events和output-events元素一个Coordinator应用的输入事件指定了要执行一个Coordinator动作必须满足的输入条件,在Oozie当前版本,只支持使用dataset实例。一个Coordinator动作可能会生成一个或多个dataset实例,输出事件只支持输出dataset实例。dataset主要是为后面的input-events和output-events服务的;在dataSet中定义了数据模板,通过这个模板,可以将其配置为目录,也可以将其配置为文件路径,有用户自己选择。但是,dataSet配置的模板路径,dataSet是不会自动生成的,使用的前提是,配置的模板路径已经存在,否则,后面的程序不会运行。Oozie工作流程定义是一个DAG图,它由控制流节点或动作节点组成,各个节点又是通过转移的剑线相互连通。对于工作流一般对应存在流程定义语言,大多数都是基于XML定义的,oozie就是基于xml定义的,称为hPDL(hadoop process definition lanaguage).工作流生命周期:PREP 一个工作流Job第一次创建将处于PREP状态,表示工作流Job已经定义,但是没有运行。RUNNING 当一个已经被创建的工作流Job开始执行的时候,就处于RUNNING状态。它不会达到结束状态,只能因为出错而结束,或者被挂起。SUSPENDED 一个RUNNING状态的工作流Job会变成SUSPENDED状态,而且它会一直处于该状态,除非这个工作流Job被重新开始执行或者被杀死。SUCCEEDED 当一个RUNNING状态的工作流Job到达了end节点,它就变成了SUCCEEDED最终完成状态。KILLED 当一个工作流Job处于被创建后的状态,或者处于RUNNING、SUSPENDED状态时,被杀死,则工作流Job的状态变为KILLED状态。FAILED 当一个工作流Job不可预期的错误失败而终止,就会变成FAILED状态。转移前状态 -> 转移后状态集合未启动  -> PREP ; PREP  -> RUNNING、KILLED ; RUNNING  -> SUSPENDED、SUCCEEDED、KILLED、FAILED ; SUSPENDED  -> RUNNING、KILLED控制流节点工作流程定义中,控制工作流的开始和结束,以及工作流job的执行路径的几点,它定义了流程的开始(start节点)和结束(end节点和kill节点),同时提供了一种控制流程执行路径的机制(decision决策节点、fork分支节点、join会签节点)。start节点 start元素的to属性,指向第一个要执行的工作流节点。......end节点 达到该节点,工作流job会变成success状态,表示成功完成。需要注意的是,一个工作流定义必须只能有一个end节点。......kill节点 Kill元素的name属性,是要杀死的工作流节点的名称,message元素指定了工作流节点被杀死的备注信息。达到该节点,工作流job会变成状态KILLED。...[MESSAGE-TO-LOG]...decision节点 Decision节点通过预定义一组条件,当工作流job执行到该节点时,会根据其中的条件进行判断选择,满足条件的路径将被执行。Decision节点通过switch…case语法来进行路径选择,只要有满足条件的判断,就会执行对应的路径,如果没有可以配置default元素指向的节点。...[PREDICATE]...[PREDICATE]...fork节点和join节点 Fork元素下面会有多个path元素,指定了可以并发执行的多个执行路径。Fork中多个并发执行路径会在join节点的位置会和,只有所有的路径都到达后,才会继续执行join节点。............动作节点(Action Nodes)工作流程定义中,能够触发一个计算任务或者处理任务执行的节点。所有的动作(Action)都有一些基本的特性,如下:*远程执行:对于Oozie来说动作节点的执行都是远程的,因为Oozie可能部署在一个单独的服务器上,而工作流job实在hadoop集群的节点上执行的。即使Oozie在hadoop集群的某个节点上,它也处于与hadoop进行独立无关的JVM实例中(Oozie部署在Servlet容器当中)*异步性:动作节点的执行,对于Oozie来说是异步的。Oozie启动一个工作流Job,这个工作流Job便开始执行。Oozie可以通过两种方式来探测工作流Job的执行情况:一种是基于回调机制,对每个任务的执行(可以看成是动作节点的执行)都对应一个唯一的URL,如果任务执行结束或者执行失败,会通过回调这个URL通知Oozie已经完成;另一种就是轮询,Oozie不停地去查询任务执行的完成状态,如果由于网络故障回调机制失败,也会使用轮询的方式来处理。*执行结果要么成功,要么失败:如果动作节点执行成功,则会转向ok节点;如果失败则会转向error节点。*可恢复性:如果一个动作节点执行失败,Oozie提供了一些恢复执行的策略,这个要根据失败的特点来进行:如果是状态转移过程中失败,Oozie会根据指定的重试时间间隔去重新执行;如果不是转移性质的失败,则只能通过手工干预来进行恢复;如果重试恢复执行都没有解决问题,则最终会跳转到error节点。FS动作主要是基于HDFS的一些基本操作,如删除路径、创建路径、移动文件、设置文件权限等等Sub-workflow动作是一个子流程的动作,主流程执行过程中,遇到子流程节点执行时,会一直等待子流程节点执行完成后,才能继续跳转到下一个要执行的节点。Shell动作可以执行Shell命令,并通过配置命令所需要的参数。以及 mr pig  hive  sqoop等等在使用spark的时候,如果我们使用了hive进行sql操作,则需要相关的hive-site.xml的配置。如果没有的话,则会报Caused by: org.datanucleus.store.rdbms.datasource.DatastoreDriverNotFoundException: The specified datastore driver ("org.apache.derby.jdbc.EmbeddedDriver") was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver. at org.datanucleus.store.rdbms.datasource.AbstractDataSourceFactory.loadDriver(AbstractDataSourceFactory.java:57) at org.datanucleus.store.rdbms.datasource.DBCPDataSourceFactory.makePooledDataSource(DBCPDataSourceFactory.java:54) at org.datanucleus.store.rdbms.ConnectionFactoryImpl.initialiseDataSources(ConnectionFactoryImpl.java:182) ... 107 more只要在程序的resources的目录下添加hive客户端的配置相关配置文件即可(可通过CDH的主页面 - 查看客户端配置URL 下载),则会运行成功。使用java客户端运行oozie application:(根据指定的job_path 在指定的oozie_url 上启动oozie application 然后配置JOB_Tracker & NAMENODE)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 {class WorkflowParameter{String name;String value;// get set  construtor}    private static String OOZIE_URL = "http://bakmaster:11000/oozie/"; // bakmaster 上有Oozie Server进程;      private static String JOB_PATH = "hdfs://mycluster/user/hue/oozie/workspaces/hue-oozie-oozieId";    private static String JOB_Tracker = "yarnRM/ hadoop6:8032;    private static String NAMENode = "hdfs://your-namenode:8020";// nameservice    OozieClient wc = null;    public WorkflowClient(String url){        wc = new OozieClient(url);    }    public String startJob(String wfDefinition, ListwfParameters)        throws OozieClientException{        // create a workflow job configuration and set the workflow application path        Properties conf = wc.createConfiguration();        conf.setProperty(OozieClient.APP_PATH, wfDefinition);// default properties// if not failing oozie laucher ,main class hadoop.SparkMain exception invoking main() // java.lang.ClassNotFoundException Class org.apache.oozie.action.hadoop.SparkMain not foundconf.setProperty("oozie.use.system.libpath","True");conf.setProperty("security_enabled","false");conf.setProperty("mapreduce.job.user.name","admin");conf.setProperty("user.admin","admin");        // 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        ListwfParameters = new LinkedList();        // 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");    }}验证配置文件的正确性:oozie validate ./workflow.xml(coordinator.xml) oozie validate workflow.xml  命令 只能对xml格式的配置文件进行检测。job.properties中的错误是无法进行验证的。如果想验证三个配置文件的正确性,可以使用下面的命令。oozie job -config./job.properties –dryrun 查看 job的日志:oozie job -log [jobID]oozie job –log 0000145-140909170015500-oozie-hado-W 查看job的workflow.xml定义:oozie job -definition [jobID]oozie job -definition0000244-140909170015500-oozie-hado-W 根据job的类型查看job: oozie jobs -jobtype wf(coordinator)oozie jobs -jobtype wf 利用过滤器查看job:oozie jobs -filteruser=;name=;group=;status=;oozie jobs -filter user=hadoop;name=LiMingji-2b;status=SUCCEEDED shell Action:shell action 运行一些shell命令。workflow作业将会在shell命令完成后继续执行下一个action动作。为运行shell作业,必须使用 job-tracker/name-node 和 Shell exec 元素等参数和配置信息来配置shell action 。一个shell action可以用来创建或者删除hdfs目录,当然workflow.xml中action内部在配置configuration中property时可以通过进行目录的删除创建。  指定路径时必须以hdfs://HOST:PORT 形式开始。shell也可以通过使用job-xml元素指定一个文件加载配置,如果在workflow.xml内部可以通过configuration元素。注意:Hadoop的 mapred.job.tracker --jobracker 配置与 fs.default.name -- namenode配置不能出现在workflow.xml的内部配置(即configuration元素内)。在shell作业结束后,shell作业的标准输出,可以被workflow工作流使用。可以在决策节点desicion node使用这些信息。如果希望shell作业的输出可用,则output的格式必须符合配置文件;输出的大小不能超过2KB。If the capture-output element is present, it indicates Oozie to capture output of the STDOUT of the shell command execution. The Shell command output must be in Java Properties file format and it must not exceed 2KB. From within the workflow definition, the output of an Shell action node is accessible via the String action:output(String node, String key) function Shell Action LimitationsAlthough Shell action can execute any shell command, there are some limitations.    No interactive command is supported.    Command can't be executed as different user using sudo.    User has to explicitly upload the required 3rd party packages (such as jar, so lib, executable etc). Oozie provides a way using and tag through Hadoop's Distributed Cache to upload.    Since Oozie will execute the shell command into a Hadoop compute node, the default installation of utility in the compute node might not be fixed. However, the most common unix utilities are usually installed on all compute nodes. It is important to note that Oozie could only support the commands that are installed into the compute nodes or that are uploaded through Distributed Cache.通过hue使用oozie执行shell action,需要注意一下事项:deleteHdfs.sh 文件的路径尽量使用绝对路径以hdfs://nameservie/.... 开始另添加file:hdfs://nameservie/....  否则报找不到文件错误java.io.exception cannot run program "deleteHdfs.sh" (in directory "/lvm/data10/yarn/nm/usercache/admin/appcache/application_....") error=2 no such file or directory  caused by java.io.ioexception error=2 no such file or directory    添加file:  在配置项中一定要添加mapred.job.queue.name 为develop 如果集群资源是根据队列进行动态资源管理 则执行oozie程序时需要指定队列,同时由于不同用于所拥有的资源权限不一样,需要根据权限分配指定合适的队列。 否则会报application rejected by queue placement policy另外一个注意事项是:如何查看log:一个是通过hue执行界面的日志,可以看一个大概。二是通过oozie,查找到对应的workflow job,查看具体的job情况。三是通过命令行,在集群中执行oozie job -log logId 如果报错 java.lang.illegalargumentexception oozie url is not available neither in command option or in the environment则说明配置文件中没有指定oozie_url即http://oozie server:11000/oozie/    可以在oozie网页的system Info栏下搜索 oozie_url  应该是没有的。有两种方式,一种是更改配置文件。另外一种是在执行oozie 命令时指定oozieURLoozie job -oozie http://oozie_server:11000/oozie/ -log oozieApplicationId  即可查看具体对应的oozie日志四,也是最详细的查看oozie workflow job 执行情况的方法,进入yarn 因为默认配置了mapred.job.queue.name oozie是以mr形式在队列上运行的 所以可以通过yarn的resources manager管理查看对应的oozie application执行情况,查看history,找到对应的map/reduce过程,查看指定过程的log,能够看到详细的执行情况。由于deleteHdfs.sh 执行的是进行删除操作,而由于文件所存在的目录和当前用于所拥有的权限未必匹配。所以可能回报错:logtype:stderrlog upload time:log length:rm:failed to remove to trash:hdfs://nameservie/...... :Permission denied user=yarn access=writer,inode=""failing oozie launcher main class [org.apache.oozie.action.hadoop.shellmain],exit code [1]在stdout中会出现:>>> Invoking Shell command line now >>Exit code of the shell command 1<<< Invocation of Shell command completed <<<如果权限满足,则不会有错误日志。但是 通过oozie的shell 作业进行删除路径操作时,并没有真正意义上的删除路径,而是在写入数据到该路径时直接覆盖数据文件,主要是权限问题。所以,可以通过在workflow中配置prepare进行文件路径的删除添加操作。shell操作时切记只能针对hdfs路径进行操作。不能针对本地路径进行操作。获取输出时,使用${wf:actionData('actionName')['outputParameterName']}例如使用shell 时,在action echoTest里,echomy_output=hello shell则 ${wf:actionData('echoTest')['my_output']}

上一篇下一篇

猜你喜欢

热点阅读