Oozie基本使用

Oozie是一个用来管理Hadoop生态圈job的工作流调度系统。Oozie是运行于Java servlet容器上的一个Java Web应用。Oozie的目的是按照DAG调度一系列的Map/Reduce或者Hived等任务。Oozie本身配置是一种xml格式的配置文件。Oozie跟hue配合使用将会很方便。

适用场景

  • 需要按顺序进行一系列任务
  • 需要并行处理的任务
  • 需要定时、周期触发的任务
  • 可视化作业流运行过程
  • 运行结果或异常的通报

架构

  • Oozie Client 提供命令行、Java api、rest等方式,对Oozie的工作流流程的提交、启动、运行等操作
  • Oozie WebApp 即Oozie Server,本质是一个Java应用。可以使用内置的web容器,也可以使用外置的web容器
  • Hadoop CLuster 底层执行Oozie编排流程的各个Hadoop生态圈组件: Oozie各种类型任务提交底层依赖于mr程序,首先启动一个没有reduce task的mr,通过mr把各个不同类型的任务提交到具体的集群上执行。

基本原理

Oozie对工作流的编排,是基于workflow.xml文件来完成的。用户预先将工作流执行规则定制于workflow.xml文件中,并在job.properties配置相关的参数,然后由Oozie Server向MR提交job来启动工作流。

流程节点

工作流由两种类型的节点组成,分别是

  • ControlFlowNodes:控制工作流执行路径,包括start、end、kill、descision、fork、join
  • Action Nodes:决定每个操作执行的任务类型,包括MapReduce、Java、Hive、Shell等。

工作流类型

  • WorkFlow

规则相对简单,不涉及定时、批处理的工作流。顺序执行流程节点。Workflow缺点:没有定时和条件触发功能。

  • Coordinator

Coordinator将多个工作流Job组织起来,称为Coordinator job,并指定触发时间和频率,还可以配置数据集、并发数,类似于在工作流外部增加一个协调器来管理这些工作流的工作流Job的运行

  • Bundle

针对Coordinator的批处理工作流。Bundle将多个Coordinator管理起来,这样我们只需要一个Bundle提交即可。

Apache Oozie的安装

  • 版本问题:Apache官方提供的是源码包,需要自己结合Hadoop生态圈软件环境进行编译,兼容性问题特别难以处理,因此使用第三方商业公司编译好Cloudera(CDH)
  • 修改Hadoop的相关服务 启动服务 httpfs、jobhistory,配置修改之后需要重启Hadoop集群
  • 解压Oozie安装包 拷贝相关依赖软件
  • 修改oozie-site.xml,主要是mysql相关信息hadoop配置文件
  • 初始化mysql创建库表
  • 生成执行需要的war包

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

Java开发的Oozie工具类

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.oozie.client.OozieClient;
import org.apache.oozie.client.OozieClientException;

import com.alibaba.fastjson.JSONObject;
import com.fline.aic.common.util.AESUtil;
import com.fline.aic.datawarehouse.access.model.DwModel.ModelState;
import com.fline.aic.db.util.FdpClientUitls;
import com.fline.aic.db.util.HttpClientUtil;
import com.fline.fdp.client.DataMgmtClient;
import com.fline.fdp.client.FileClient;
import com.fline.fdp.client.SearchEngineClient;

public class OozieUtil {
    
    
	
	private static String oozieUrl = "oozieUrl";
	
	static {
    
    
		// init
		Properties p = new Properties();
		InputStream fis = OozieUtil.class.getClassLoader()
				.getResourceAsStream("applicationContext.properties");
		if (fis == null) {
    
    
			
		} else {
    
    
			try {
    
    
				p.load(fis);
				fis.close();
			} catch (IOException e) {
    
    
				e.printStackTrace();
			}
		}
		oozieUrl=p.getProperty("multi.oozieUrl");
		
		
	}
	
	public static String restOozieJobStatus(String JobId){
    
    
		String status = HttpClientUtil.doGet(oozieUrl+"job/"+JobId+"?show=status");
		try {
    
    
			JSONObject.parseObject(status);
		} catch (Exception e) {
    
    
			return ModelState.KILLED.getCode();
		}
		status=JSONObject.parseObject(status).getString("status");
		return status;
	}
	
	public static String restOozieJobLog(String JobId){
    
    
		String status = HttpClientUtil.doGet(oozieUrl+"job/"+JobId+"?show=log");
		return status;
	}
	
	public static String restReRunOozieJob(String JobId){
    
    
		String status = HttpClientUtil.doPut(oozieUrl+"job/"+JobId+"?action = rerun","");
		return status;
	}
	
	public static String killOozieJob(String JobId){
    
    
		String status = HttpClientUtil.doPut(oozieUrl+"job/"+JobId+"?action=kill","");
		return status;
	}
	
	public static String restHiveJob(String userName,String nameNode,String jobTracker,String libPath,String hiveSql){
    
    
		StringBuilder sb = new StringBuilder();
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		sb.append("<configuration>");
		sb.append("<property>");
		sb.append("<name>user.name</name>");
		sb.append("<value>" + userName + "</value>");
		sb.append("</property>");
		sb.append("<property>");
		sb.append("<name>mapred.job.tracker</name>");
		sb.append("<value>" + jobTracker + "</value>");
		sb.append("</property>");
		sb.append("<property>");
		sb.append("<name>fs.default.name</name>");
		sb.append("<value>" + nameNode + "</value>");
		sb.append("</property>");
		sb.append("<property>");
		sb.append("<name>oozie.libpath</name>");
		sb.append("<value>" + libPath + "</value>");
		sb.append("</property>");
		sb.append("<property>");
		sb.append("<name>oozie.hive.script</name>");
		sb.append("<value>" + hiveSql + "</value>");
		sb.append("</property>");
		sb.append("<property>");
		sb.append("<name>oozie.proxysubmission</name>");
		sb.append("<value>" + "ture" + "</value>");
		sb.append("</property>");
		sb.append("</configuration>");

		String jobId = HttpClientUtil.postXMLAuthWithHttpPost(oozieUrl+"jobs?jobtype=hive", sb.toString());
		jobId=JSONObject.parseObject(jobId).getString("id");
		return jobId;
	}
}

猜你喜欢

转载自blog.csdn.net/flash_love/article/details/131759554
今日推荐