精华内容
下载资源
问答
  • Oozie

    2020-02-01 14:01:42
  • OOZIE

    千次阅读 2015-02-05 15:12:53
    oozie

    Oozie工作流程定义详解

    Oozie工作流程定义是一个DAG(Directed Acyclical Graphs)图,它由控制流节点(Control Flow Nodes)或动作节点(Action Nodes)组成,各个节点又是通过表征转移的箭线(transitions
    arrows)互相连通。对于工作流一般对应存在流程定义语言,例如jBPM是jPDL,大多数都是基于XML定义的,Oozie流程定义语言也是基于XML定义的,称为hPDL(Hadoop Process Definition Language)。
    下面,我们详细说明工作流定义相关的内容:

    工作流生命周期

    Oozie中,工作流的状态可能存在如下几种:

    状态 含义说明
    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的运行。

    控制流节点(Control Flow Nodes)

    工作流程定义中,控制工作流的开始和结束,以及工作流Job的执行路径的节点,它定义了流程的开始(start节点)和结束(end节点或kill节点),同时提供了一种控制流程执行路径的机制(decision决策节点、fork分支节点、join会签节点)。通过上面提到的各种节点,我们大概应该能够知道它们在工作流中起着怎样的作用。下面,我们看一下不同节点的语法格式:

    • start节点
      	<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
      		...
      		<start to="[NODE-NAME]" />
      		...
      	</workflow-app>
      	

      上面start元素的to属性,指向第一个将要执行的工作流节点。

    • end节点
      	<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
      		...
      		<end name="[NODE-NAME]" />
      		...
      	</workflow-app>
      	

      达到该节点,工作流Job会变成SUCCEEDED状态,表示成功完成。需要注意的是,一个工作流定义必须只能有一个end节点。

    • kill节点
      	<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
      		...
      		<kill name="[NODE-NAME]">
      			<message>[MESSAGE-TO-LOG]</message>
      		</kill>
      		...
      	</workflow-app>
      	

      kill元素的name属性,是要死的工作流节点的名称,message元素指定了工作流节点被死的备注信息。达到该节点,工作流Job会变成状态KILLED。

    • decision节点
      	<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
      		...
      		<decision name="[NODE-NAME]">
      			<switch>
      				<case to="[NODE_NAME]">[PREDICATE]</case>
      				...
      				<case to="[NODE_NAME]">[PREDICATE]</case>
      				<default to="[NODE_NAME]" />
      			</switch>
      		</decision>
      		...
      	</workflow-app>
      	

      decision节点通过预定义一组条件,当工作流Job执行到该节点时,会根据其中的条件进行判断选择,满足条件的路径将被执行。decision节点通过switch…case语法来进行路径选择,只要有满足条件的判断,就会执行对应的路径,如果没有可以配置default元素指向的节点。

    • fork节点和join节点
      	<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
      		...
      		<fork name="[FORK-NODE-NAME]">
      			<path start="[NODE-NAME]" />
      			...
      			<path start="[NODE-NAME]" />
      		</fork>
      		...
      		<join name="[JOIN-NODE-NAME]" to="[NODE-NAME]" />
      		...
      	</workflow-app>
      	

      for元素下面会有多个path元素,指定了可以并发执行的多个执行路径。fork中多个并发执行路径会在join节点的位置会合,只有所有的路径都到达后,才会继续执行join节点。

    动作节点(Action Nodes)

    工作流程定义中,能够触发一个计算任务(Computation Task)或者处理任务(Processing Task)执行的节点。所有的动作(
    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节点。

    下面详细介绍Oozie内置支持的动作节点类型,如下所示:

    • Map-Reduce动作

    map-reduce动作会在工作流Job中启动一个MapReduce Job任务运行,我们可以详细配置这个MapReduce Job。另外,可以通过map-reduce元素的子元素来配置一些其他的任务,如streaming、pipes、file、archive等等。
    下面给出包含这些内容的语法格式说明:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    	...
    	<action name="[NODE-NAME]">
    		<map-reduce>
    			<job-tracker>[JOB-TRACKER]</job-tracker>
    			<name-node>[NAME-NODE]</name-node>
    			<prepare>
    				<delete path="[PATH]" />
    				...
    				<mkdir path="[PATH]" />
    				...
    			</prepare>
    			<streaming>
    				<mapper>[MAPPER-PROCESS]</mapper>
    				<reducer>[REDUCER-PROCESS]</reducer>
    				<record-reader>[RECORD-READER-CLASS]</record-reader>
    				<record-reader-mapping>[NAME=VALUE]</record-reader-mapping>
    				...
    				<env>[NAME=VALUE]</env>
    				...
    			</streaming>
    			<!-- Either streaming or pipes can be specified for an action, not both -->
    			<pipes>
    				<map>[MAPPER]</map>
    				<reduce>
    					[REDUCER]
    				</reducer>
    					<inputformat>[INPUTFORMAT]</inputformat>
    					<partitioner>[PARTITIONER]</partitioner>
    					<writer>[OUTPUTFORMAT]</writer>
    					<program>[EXECUTABLE]</program>
    			</pipes>
    			<job-xml>[JOB-XML-FILE]</job-xml>
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    			<file>[FILE-PATH]</file>
    			...
    			<archive>[FILE-PATH]</archive>
    			...
    		</map-reduce>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Hive动作

    Hive主要是基于类似SQL的HQL语言的,它能够方便地操作HDFS中数据,实现对海量数据的分析工作。HIve动作的语法格式如下所示:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.2">
    	...
    	<action name="[NODE-NAME]">
    		<hive xmlns="uri:oozie:hive-action:0.2">
    			<job-tracker>[JOB-TRACKER]</job-tracker>
    			<name-node>[NAME-NODE]</name-node>
    			<prepare>
    				<delete path="[PATH]" />
    				...
    				<mkdir path="[PATH]" />
    				...
    			</prepare>
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    			<script>[HIVE-SCRIPT]</script>
    			<param>[PARAM-VALUE]</param>
    			...
    		</hive>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Sqoop动作

    Sqoop是一个能够在Hadoop和结构化存储系统之间进行数据的导入导出的工具,Sqoop动作的语法格式如下:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.2">
    	...
    	<action name="[NODE-NAME]">
    		<sqoop xmlns="uri:oozie:sqoop-action:0.2">
    			<job-tracker>[JOB-TRACKER]</job-tracker>
    			<name-node>[NAME-NODE]</name-node>
    			<prepare>
    				<delete path="[PATH]" />
    				...
    				<mkdir path="[PATH]" />
    				...
    			</prepare>
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    			<command>[SQOOP-COMMAND]</command>
    			<file>[FILE-PATH]</file>
    			...
    		</sqoop>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Pig动作

    pig动作可以启动运行pig脚本实现的Job,在工作流定义中配置的语法格式说明如下:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.2">
    	...
    	<action name="[NODE-NAME]">
    		<pig>
    			<job-tracker>[JOB-TRACKER]</job-tracker>
    			<name-node>[NAME-NODE]</name-node>
    			<prepare>
    				<delete path="[PATH]" />
    				...
    				<mkdir path="[PATH]" />
    				...
    			</prepare>
    			<job-xml>[JOB-XML-FILE]</job-xml>
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    			<script>[PIG-SCRIPT]</script>
    			<param>[PARAM-VALUE]</param>
    			...
    			<param>[PARAM-VALUE]</param>
    			<argument>[ARGUMENT-VALUE]</argument>
    			...
    			<argument>[ARGUMENT-VALUE]</argument>
    			<file>[FILE-PATH]</file>
    			...
    			<archive>[FILE-PATH]</archive>
    			...
    		</pig>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Fs动作

    Fs动作主要是基于HDFS的一些基本操作,如删除路径、创建路径、移动文件、设置文件全乡等等。
    语法格式:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    	...
    	<action name="[NODE-NAME]">
    		<fs>
    			<delete path='[PATH]' />
    			...
    			<mkdir path='[PATH]' />
    			...
    			<move source='[SOURCE-PATH]' target='[TARGET-PATH]' />
    			...
    			<chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' />
    			...
    			<touchz path='[PATH]' />
    		</fs>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • SSH动作

    该动作主要是通过ssh登录到一台主机,能够执行一组shell命令,它在Oozie schema 0.2中已经被删除。
    语法格式:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    	...
    	<action name="[NODE-NAME]">
    		<ssh>
    			<host>[USER]@[HOST]</host>
    			<command>[SHELL]</command>
    			<args>[ARGUMENTS]</args>
    			...
    			<capture-output />
    		</ssh>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Java动作

    Java动作,是执行一个具有main入口方法的应用程序,在Oozie工作流定义中,会作为一个MapReduce Job执行,这个Job只有一个Map任务。我们需要指定NameNode、JobTracker的信息,还有配置一个Java应用程序的JVM选项参数(java-opts),以及传给主函数(arg)。
    语法格式:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    	...
    	<action name="[NODE-NAME]">
    		<java>
    			<job-tracker>[JOB-TRACKER]</job-tracker>
    			<name-node>[NAME-NODE]</name-node>
    			<prepare>
    				<delete path="[PATH]" />
    				...
    				<mkdir path="[PATH]" />
    				...
    			</prepare>
    			<job-xml>[JOB-XML]</job-xml>
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    			<main-class>[MAIN-CLASS]</main-class>
    			<java-opts>[JAVA-STARTUP-OPTS]</java-opts>
    			<arg>ARGUMENT</arg>
    			...
    			<file>[FILE-PATH]</file>
    			...
    			<archive>[FILE-PATH]</archive>
    			...
    			<capture-output />
    		</java>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Sub-workflow动作

    Sub-workflow动作是一个子流程的动作,主流程执行过程中,遇到子流程节点执行时,会一直等待子流程节点执行完成后,才能继续跳转到下一个要执行的节点。
    语法格式:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    	...
    	<action name="[NODE-NAME]">
    		<sub-workflow>
    			<app-path>[WF-APPLICATION-PATH]</app-path>
    			<propagate-configuration />
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    		</sub-workflow>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    
    • Shell动作

    Shell动作可以执行Shell命令,并通过配置命令所需要的参数。它的语法格式:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.4">
    	...
    	<action name="[NODE-NAME]">
    		<shell xmlns="uri:oozie:shell-action:0.2">
    			<job-tracker>[JOB-TRACKER]</job-tracker>
    			<name-node>[NAME-NODE]</name-node>
    			<prepare>
    				<delete path="[PATH]" />
    				...
    				<mkdir path="[PATH]" />
    				...
    			</prepare>
    			<configuration>
    				<property>
    					<name>[PROPERTY-NAME]</name>
    					<value>[PROPERTY-VALUE]</value>
    				</property>
    				...
    			</configuration>
    			<exec>[SHELL-COMMAND]</exec>
    			<argument>[ARGUMENT-VALUE]</argument>
    			<capture-output />
    		</shell>
    		<ok to="[NODE-NAME]" />
    		<error to="[NODE-NAME]" />
    	</action>
    	...
    </workflow-app>
    

    表达式语言函数(Expression Language Functions)

    Oozie除了可以使用Properties文件定义一些属性之外,还提供了一些内置的EL函数,能够方便地实现流程的定义和控制,下面我们分组列表说明:

    • 基本EL常量
    常量名称 含义说明
    KB 1KB,类型为long。
    MB 1MB,类型为long。
    GB 1GB,类型为long。
    TB 1TB,类型为long。
    PB 1PB,类型为long。
    • 基本EL函数
    函数声明 含义说明
    String firstNotNull(String value1, String value2) 返回value1和value2中不为null的值,若都为null则返回null
    String concat(String s1, String s2) 连接字符串s1和s2,如果s1或s2为null值,则使用空字符串替换null值
    String replaceAll(String src, String regex, String replacement) 满足正则表达式regex,则使用replace替换src字符串中匹配上的部分
    String appendAll(String src, String append, String delimeter) 将src中的分隔符delimeter替换为append
    String trim(String s) 字符串两边的空格,如果s为null则返回空字符串
    String urlEncode(String s) 对字符串s使用URL UTF-8进行编码
    String timestamp() 返回UTC当前时间字符串,格式为YYYY-MM-DDThh:mm:ss.sZ
    String toJsonStr(Map) Oozie 3.3支持,将Map转转成一个XML编码的JSON表示形式
    String toPropertiesStr(Map) Oozie 3.3支持,将Map转转成一个XML编码的Properties表示形式
    String toConfigurationStr(Map) Oozie 3.3支持,将Map转转成一个XML编码的Configuration表示形式
    • 工作流EL函数
    函数声明 含义说明
    String wf:id() 返回当前的工作流Job的ID
    String wf:name() 返回当前的工作流Job的名称
    String wf:appPath() 返回当前的工作流Job的应用路径
    String wf:conf(String name) 返回当前的工作流Job的配置属性
    String wf:user() 返回启动当前的工作流Job的用户名称
    String wf:group() 返回当前的工作流Job的的用户组名称
    String wf:callback(String stateVar) 返回当前的工作流Job的当前动作节点的回调URL
    String wf:transition(String node) 返回转移节点,该节点是一个工作流动作节点触发的
    String wf:lastErrorNode() 返回最后一个以ERROR状态退出的节点名称
    String wf:errorCode(String node) 返回指定动作节点执行的错误码,如果没有则返回空
    String wf:errorMessage(String message) 返回指定动作节点执行的错误信息,如果没有则返回空
    int wf:run() 返回当前工作流Job的运行编号,正常的话返回0,如果执行过re-run则返回非0
    Map wf:actionData(String node) 返回当前动作节点完成时输出的信息
    int wf:actionExternalId(String node) 返回动作节点的外部ID
    int wf:actionTrackerUri(String node) 返回跟踪一个动作节点的URI
    int wf:actionExternalStatus(String node) 返回一个动作节点的状态
    • Hadoop EL常量
    常量名称 含义说明
    RECORDS Hadoop Record计数器组名称
    MAP_IN Hadoop Mapper输入Record计数器名称
    MAP_OUT Hadoop Mapper输出Record计数器名称
    REDUCE_IN Hadoop Reducer输入Record计数器名称
    REDUCE_OUT HadoopReducer输出Record计数器名称
    GROUPS 1024 * Hadoop Mapper/Reducer输入Record组计数器名称
    • Hadoop EL函数
    函数声明 含义说明
    Map < String, Map > hadoop:counters(String node) 返回工作流Job某个动作节点的统计计数器信息,例如,MR的动作统计集合内容:
    {
    “ACTION_TYPE”: “MAP_REDUCE”,
    “org.apache.hadoop.mapred.JobInProgress$Counter”: {
    “TOTAL_LAUNCHED_REDUCES”: 1,
    “TOTAL_LAUNCHED_MAPS”: 1,
    “DATA_LOCAL_MAPS”: 1
    },
    “FileSystemCounters”: {
    “FILE_BYTES_READ”: 1746,
    “HDFS_BYTES_READ”: 1409,
    “FILE_BYTES_WRITTEN”: 3524,
    “HDFS_BYTES_WRITTEN”: 1547
    },
    “org.apache.hadoop.mapred.Task$Counter”: {
    “REDUCE_INPUT_GROUPS”: 33,
    “COMBINE_OUTPUT_RECORDS”: 0,
    “MAP_INPUT_RECORDS”: 33,
    “REDUCE_SHUFFLE_BYTES”: 0,
    “REDUCE_OUTPUT_RECORDS”: 33,
    “SPILLED_RECORDS”: 66,
    “MAP_OUTPUT_BYTES”: 1674,
    “MAP_INPUT_BYTES”: 1409,
    “MAP_OUTPUT_RECORDS”: 33,
    “COMBINE_INPUT_RECORDS”: 0,
    “REDUCE_INPUT_RECORDS”: 33
    }
    }
    则${hadoop:counters(“mr-node”)["FileSystemCounters"]["FILE_BYTES_READ"]},得到名称为mr-node的动作节点组的FILE_BYTES_READ计数器的值
    • HDFS EL函数
    选项 含义说明
    boolean fs:exists(String path) path是否存在
    boolean fs:isDir(String path) path是否是目录
    long fs:dirSize(String path) 如果path不是目录或者path是一个文件,则返回-1,否则返回该path下所有文件的字节数
    long fs:fileSize(String path) 如果path是目录,则返回-1,否则返回该path下所有文件的字节数
    long fs:blockSize(String path)

    如果path不是文件或者不存在则返回-1,否则返回文件的块大小字节数

    展开全文
  • oozie

    2020-05-05 09:52:08
    Oozie英文翻译为:驯象人。一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache,提供对Hadoop MapReduce、Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。主要用于定时调度任务,多任务...

    Oozie英文翻译为:驯象人。一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache,提供对Hadoop MapReduce、Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。主要用于定时调度任务,多任务可以按照执行的逻辑顺序调度。
    第2章 Oozie的功能模块介绍
    2.1模块 ==》实际上对应的3个 xml的文件

    1. Workflow : 工作单位的协调依赖
      顺序执行流程节点,支持fork(分支多个节点),join(合并多个节点为一个)

    2. Coordinator : 协调调度器
      定时触发workflow

    3. Bundle : 多个workfole的调度问题, 少用
      绑定多个Coordinator
      2.2 Workflow常用节点

    4. 控制流节点(Control Flow Nodes)
      控制流节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill等。以及提供工作流的执行路径机制,如decision,fork,join等。

    5. 动作节点(Action Nodes)
      负责执行具体动作的节点,比如:拷贝文件,执行某个Shell脚本等等。

    基本的流程文件:

    第3章 Oozie的部署
    3.1 部署Hadoop(CDH版本的)

    版本一:cloudera
    CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全 性,稳定性上有所增强。
    版本二:Hortonworks
    Hortonworks 的主打产品是Hortonworks Data Platform (HDP),也同样是100%开 源的产品

    3.1.2 修改Hadoop配置
    core-site.xml

    hadoop.proxyuser.atguigu.hosts * hadoop.proxyuser.atguigu.groups *

    Hdfs.xml的配置 ==》second name 或者副本数

    mapred-site.xml +=》指定历史服务地址

    mapreduce.jobhistory.address hadoop102:10020 mapreduce.jobhistory.webapp.address hadoop102:19888

    yarn-site.xml

    yarn.log.server.url http://hadoop102:19888/jobhistory/logs/

    完成后:记得scp同步到其他机器节点
    格式化,一定要注意bin目录下的:bin/hdfs fs namenode format;
    3.1.3 启动Hadoop集群
    [atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ sbin/start-dfs.sh
    [atguigu@hadoop103 hadoop-2.5.0-cdh5.3.6]$ sbin/start-yarn.sh
    [atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ sbin/mr-jobhistory-daemon.sh start historyserver
    注意:需要开启JobHistoryServer, 最好执行一个MR任务进行测试。
    3.2 部署Oozie
    3.2.1 解压Oozie==>根据视频安装
    [atguigu@hadoop102 software]$ tar -zxvf /opt/software/cdh/oozie-4.0.0-cdh5.3.6.tar.gz -C /opt/module
    3.2.2 在oozie根目录下解压自己的文件oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxvf oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz -C …/
    完成后Oozie目录下会出现hadooplibs目录。

    3.2.3 在Oozie目录下创建libext目录
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ mkdir libext/
    3.2.4 拷贝依赖的Jar包到libext
    1)将hadooplibs里面的jar包,拷贝到libext目录下:==》lib下面不要有路径

    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -ra hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6/* libext/

    2)拷贝Mysql驱动包到libext目录下:==》/mysql-connector-java-5.1.27
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -a /opt/software/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar ./libext/

    3)将ext-2.2.zip拷贝到libext/目录下
    ext是一个js框架,用于展示oozie前端页面:
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -a /opt/software/cdh/ext-2.2.zip libext/

    3.2.6 修改Oozie配置文件
    oozie-site.xml

    属性:oozie.service.JPAService.jdbc.driver
    属性值:com.mysql.jdbc.Driver
    解释:JDBC的驱动

    属性:oozie.service.JPAService.jdbc.url
    属性值:jdbc:mysql://hadoop102:3306/oozie ==》mysql中的数据库
    解释:oozie所需的数据库地址

    属性:oozie.service.JPAService.jdbc.username
    属性值:root
    解释:数据库用户名

    属性:oozie.service.JPAService.jdbc.password
    属性值:000000
    解释:数据库密码

    属性:oozie.service.HadoopAccessorService.hadoop.configurations
    属性值:*=/opt/module/CDH/hadoop-2.5.0-cdh5.3.6/etc/hadoop
    解释:让Oozie引用Hadoop的配置文件

    3.2.7 在Mysql中创建Oozie的数据库
    进入Mysql并创建oozie数据库:
    $ mysql -uroot -p000000
    mysql> create database oozie; ===》手动创建

    3.2.8 初始化Oozie

    1. 上传Oozie目录下的yarn.tar.gz文件到HDFS:
      ==》提示:yarn.tar.gz文件会自行解压

    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie-setup.sh sharelib create -fs hdfs://hadoop102:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz ==》目录文件
    ==.sharelib : 共享的lib包

    执行成功之后,去50070检查对应目录有没有文件生成。
    2) 执行oozie.sql文件建表
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/ooziedb.sh create -sqlfile oozie.sql -run

    ==》oozie.sql都是建表语句 脚本的执行语句

    3)打包项目,生成war包 ==>web项目需要有war包才能启动web端
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie-setup.sh prepare-war
    3.2.9 Oozie的启动与关闭
    启动命令如下:
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh start
    关闭命令如下:
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh stop
    3.2.10 访问Oozie的Web页面
    http://hadoop102:11000/oozie
    第4章 Oozie的使用
    4.1 案例一:Oozie调度shell脚本
    目标:使用Oozie调度Shell脚本
    分步实现:
    1)创建工作目录
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ mkdir -p oozie-apps/shell
    2)在oozie-apps/shell目录下创建两个文件——job.properties和workflow.xml文件
    [atguigu@hadoop102 shell]$ touch workflow.xml
    [atguigu@hadoop102 shell]$ touch job.properties
    3)编辑job.properties和workflow.xml文件
    job.properties
    #HDFS地址
    nameNode=hdfs://hadoop102:8020
    #ResourceManager地址
    jobTracker=hadoop103:8032 ===>yarn的角色:jobTRacker=resourcemanger
    #队列名称
    queueName=default ===》yarn容量调度器,队列的名称
    examplesRoot=oozie-apps ==》keyvalue键值对,在路径中引用
    oozie.wf.application.path=nameNode/user/{nameNode}/user/{user.name}/${examplesRoot}/shell
    ==》非常重要,是job/workflow的路径,这个要和HDFS对应,是上传的路径

    执行顺序: 读取oozie-apps/shell/job.propertiess的配置文件
    获取job在HDFS的地址,然后执行相应命令

    workflow.xml

    ${jobTracker} ${nameNode} mapred.job.queue.name ==>任务提交的队列 ${queueName} mkdir /opt/module/d Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]

    4)上传任务配置
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hadoop fs -put oozie-apps/ /user/atguigu
    5)执行任务
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config oozie-apps/shell/job.properties -run

    ==》config :本地路径下的job地址
    ==》-oozie http://hadoop102:11000/oozie 指定oozie的服务地址
    6)杀死某个任务
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -kill 0000004-170425105153692-oozie-z-W

    用mr的形式执行shell

    4.2 案例二:Oozie逻辑调度执行多个Job
    目标:使用Oozie执行多个Job调度
    分步执行:
    1)编辑job.properties和workflow.xml文件
    job.properties
    nameNode=hdfs://hadoop102:8020
    jobTracker=hadoop103:8032
    queueName=default
    examplesRoot=oozie-apps
    oozie.wf.application.path=nameNode/user/{nameNode}/user/{user.name}/examplesRoot/shellsworkflow.xml<workflowappxmlns="uri:oozie:workflow:0.4"name="shellwf"><startto="p1shellnode"/><actionname="p1shellnode"><shellxmlns="uri:oozie:shellaction:0.2"><jobtracker>{examplesRoot}/shells workflow.xml <workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf"> <start to="p1-shell-node"/> <action name="p1-shell-node"> <shell xmlns="uri:oozie:shell-action:0.2"> <job-tracker>{jobTracker}
    nameNode</namenode><configuration><property><name>mapred.job.queue.name</name><value>{nameNode}</name-node> <configuration> <property> <name>mapred.job.queue.name</name> <value>{queueName}


    mkdir
    /opt/module/d1




    <action name="p2-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>mkdir</exec>
            <argument>/opt/module/d2</argument>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    

    ==》这种情况下,map端就不用配置了


    通过yarn获取mapreduce中的所有属性,然后配置相应的位置

    5)拷贝待执行的jar包到map-reduce的lib目录下
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -a /opt /module/cdh/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar oozie-apps/map-reduce/lib
    6)上传配置好的app文件夹到HDFS
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/map-reduce/ /user/admin/oozie-apps
    7)执行任务
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config oozie-apps/map-reduce/job.properties -run

    4.4 案例四:Oozie定时任务/循环任务
    目标:Coordinator周期性调度任务
    分步实现:==》在历史服务器中有时间戳,同步时间,需要先关闭历史服务器
    1)配置Linux时区以及时间服务器
    2)检查系统当前时区:

    date -R

    注意:如果显示的时区不是+0800,删除localtime文件夹后,再关联一个正确时区的链接过去,命令如下:

    rm -rf /etc/localtime

    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    同步时间:

    ntpdate pool.ntp.org

    修改NTP配置文件:

    vi /etc/ntp.conf

    去掉下面这行前面的# ,并把网段修改成自己的网段:
    restrict 192.168.122.0 mask 255.255.255.0 nomodify notrap
    注释掉以下几行:
    #server 0.centos.pool.ntp.org
    #server 1.centos.pool.ntp.org
    #server 2.centos.pool.ntp.org
    把下面两行前面的#号去掉,如果没有这两行内容,需要手动添加
    server 127.127.1.0 # local clock
    fudge 127.127.1.0 stratum 10
    重启NTP服务:

    systemctl start ntpd.service,

    注意,如果是centOS7以下的版本,使用命令:service ntpd start

    systemctl enable ntpd.service,

    注意,如果是centOS7以下的版本,使用命令:chkconfig ntpd on
    集群其他节点去同步这台时间服务器时间:
    首先需要关闭这两台计算机的ntp服务

    systemctl stop ntpd.service,

    centOS7以下,则:service ntpd stop

    systemctl disable ntpd.service,

    centOS7以下,则:chkconfig ntpd off

    systemctl status ntpd,查看ntp服务状态

    pgrep ntpd,查看ntp服务进程id

    同步第一台服务器linux01的时间:

    ntpdate hadoop102

    使用root用户制定计划任务,周期性同步时间:

    crontab -e

    */10 * * * * /usr/sbin/ntpdate hadoop102
    重启定时任务:

    systemctl restart crond.service,

    centOS7以下使用:service crond restart,
    其他台机器的配置同理。
    ==》时间同步完成

    3)配置oozie-site.xml文件
    属性:oozie.processing.timezone
    属性值:GMT+0800
    解释:修改时区为东八区区时
    注:该属性去oozie-default.xml中找到即可
    4)修改js框架中的关于时间设置的代码
    $ vi /opt/module/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie/oozie-console.js
    修改如下:
    function getTimeZone() {
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    return Ext.state.Manager.get(“TimezoneId”,“GMT”);
    }
    5)重启oozie服务,并重启浏览器(一定要注意清除缓存)
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh stop
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh start
    6)拷贝官方模板配置定时任务
    $ cp -r examples/apps/cron/ oozie-apps/
    7)修改模板job.properties和coordinator.xml以及workflow.xml
    job.properties
    nameNode=hdfs://hadoop102:8020
    jobTracker=hadoop103:8032
    queueName=default
    examplesRoot=oozie-apps

    oozie.coord.application.path=nameNode/user/{nameNode}/user/{user.name}/KaTeX parse error: Expected 'EOF', got '#' at position 21: …plesRoot}/cron #̲start:必须设置为未来时间…{nameNode}/user/user.name/{user.name}/{examplesRoot}/cron
    EXEC=p1.sh

    coordinator.xml ==》定时调度
    Oozie 这里最小5min; azkaban 最小1min



    workflowAppUri</apppath><configuration><property><name>jobTracker</name><value>{workflowAppUri}</app-path> <configuration> <property> <name>jobTracker</name> <value>{jobTracker}


    nameNode
    nameNode</value></property><property><name>queueName</name><value>{nameNode}</value> </property> <property> <name>queueName</name> <value>{queueName}




    workflow.xml ==》写的是自定义的脚本




    jobTracker</jobtracker><namenode>{jobTracker}</job-tracker> <name-node>{nameNode}


    mapred.job.queue.name
    queueName</value></property></configuration><exec>{queueName}</value> </property> </configuration> <exec>{EXEC}
    /user/atguigu/oozie-apps/cron/KaTeX parse error: Expected 'EOF', got '#' at position 7: {EXEC}#̲{EXEC}






    Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]


    8)上传配置
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/cron/ /user/atguigu/oozie-apps
    9)启动任务
    [atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config oozie-apps/cron/job.properties -run
    注意:oozie允许的最小执行任务的频率是5分钟
    2

    ==》HIVE模板
    第5章 常见问题总结
    1)Mysql权限配置
    授权所有主机可以使用root用户操作所有数据库和数据表
    mysql> grant all on . to root@’%’ identified by ‘000000’;
    mysql> flush privileges;
    mysql> exit;
    2)workflow.xml配置的时候不要忽略file属性
    3)jps查看进程时,注意有没有bootstrap
    4)关闭oozie
    如果bin/oozied.sh stop无法关闭,则可以使用kill -9 [pid],之后oozie-server/temp/xxx.pid文件一定要删除。
    5)Oozie重新打包时,一定要注意先关闭进程,删除对应文件夹下面的pid文件。(可以参考第4条目)
    6)配置文件一定要生效
    起始标签和结束标签无对应则不生效,配置文件的属性写错了,那么则执行默认的属性。
    7)libext下边的jar存放于某个文件夹中,导致share/lib创建不成功。
    8)调度任务时,找不到指定的脚本,可能是oozie-site.xml里面的Hadoop配置文件没有关联上。
    9)修改Hadoop配置文件,需要重启集群。一定要记得scp到其他节点。
    10)JobHistoryServer必须开启,集群要重启的。
    11)Mysql配置如果没有生效的话,默认使用derby数据库。
    12)在本地修改完成的job配置,必须重新上传到HDFS。
    13)将HDFS中上传的oozie配置文件下载下来查看是否有错误。
    14)Linux用户名和Hadoop的用户名不一致。

    展开全文

空空如也

空空如也

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

oozie