oozie安装及使用

oozie (会用!)
	任务调度框架  
		当一个项目中出现多个shell、MapReduce、hql、sqoop类型的任务时
		并且这些任务之前存在一种依赖关系时,需要借助专业的任务调度框架完成任务流的定义控制  
	oozie可以实现
		多个任务执行的顺序控制 
			job1->job2->job3/job4->job7  ..
		多个任务组成的一个任务流的执行频率控制		
			每天、每小时、每周执行一个任务流	
		一个循环执行的任务流的生命周期 
			在以后的哪段时间范围内循环的执行  				


oozie 
	cloudera公司开源,贡献给Apache基金会,TM   
	http://oozie.apache.org/ 
		
		
		
其他常用的任务调度工具/框架 
	linux crontab  
		最简单的调度服务,也是最常用
		周期性、定时执行调度某个命令或者shell脚本任务
		服务名称为crond
		编辑任务:
			crontab -e 
				分 小时 日  月  星期  + shell命令
		举例:
			定期每周三凌晨一点清空服务器的/tmp目录
				0 1 * * 3  /bin/rm -rf  /tmp/*

		对单一的定时任务调度比较方便,对于一个项目中同时存在的多个有依赖关系的任务调度时不能满足 
	
	
		
	Azkaban 
		https://azkaban.github.io/
		https://zhuanlan.zhihu.com/p/22184691?refer=dataeye		
		领英公司开源的一款针对hadoop任务(MapReduce、sqoop、hql、pig、spark..)的调度框架
		适合小公司使用,有用户交互界面,功能简单实用
		为crontab的界面化工具,但可以解决多任务依赖  
		
		
		
	zeus(宙斯)	 
		阿里开源 
		有中文文档  
		国内大公司有使用  

oozie组件架构 (PPT-14)
物理组件
oozie server / Tomcat server =》
oozie的核心服务进程
提供了与其他框架或客户端的交互通道
oozie database
oozie需要一个数据库的支撑存储到调度的任务元数据信息

功能组件 
	workflow:任务流   
		控制流节点 ->控制任务的流向 
			start
			kill
			fork
			end 
			……				
		动作节点 ->要调度执行的任务本身 
			action  
				shell  
				MapReduce 
				hql 
				sqoop
				email 
			动作节点的任务的执行结果会影响到任务的流向	

			
	coordinator  
		定义一个workflow任务流的执行循环条件及生命长度 
			执行循环条件 
				基于时间的循环 =》每小时、每天、每月
				基于数据的循环 =》当目标文件多大时开始执行workflow
			循环执行的生命长度 		
			
			
	bundle  
		将多个coordinator调度任务打包执行  

oozie的安装部署

http://oozie.apache.org/docs/4.1.0/DG_QuickStart.html   - 官方安装文档  

System Requirements 
	jdk 
	hadoop -》oozie依赖hadoop  
		oozie的任务流中的action节点的执行本身就是一个MapReduce任务
		oozie需要在hdfs上创建一个jar包共享库,将所有可能调度到的框架的相关jar包上传到hdfs上
		在本地开发编辑的workflow任务app最终需要上传到hdfs上,oozie最终需要到hdfs上读取相关任务的配置文件 

1、确保hadoop已经安装成功

2、上传解压oozie的tar包
$ tar zxf /opt/softwares/oozie-4.1.0-cdh5.14.2.tar.gz -C /opt/cdh-5.14.2/

3、为oozie服务在hadoop集群上配置一个代理用户

在hadoop的core-site.xml中添加一下配置 
	注意:两个属性中的用户名需要修改为当前的普通用户
<!-- OOZIE -->
  <property>
	<name>hadoop.proxyuser.xxx.hosts</name>
	<value>*</value>
  </property>
  <property>
	<name>hadoop.proxyuser.xxx.groups</name>
	<value>*</value>
  </property>	

4、重启hadoop服务进程
hdfs
yarn

$ sbin/stop-all.sh 

5、将oozie安装目录下的oozie-hadooplibs-4.1.0-cdh5.14.2.tar.gz解压到oozie框架所解压的目录,会在oozie的安装目录下发现一个hadooplibs 目录

$ tar zxf /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/oozie-hadooplibs-4.1.0-cdh5.14.2.tar.gz -C /opt/cdh-5.14.2/		

6、在oozie的安装目录下创建一个libext目录,并将hadooplibs/hadooplib-2.6.0-cdh5.14.2.oozie-4.1.0-cdh5.14.2/目录下的所有的jar包拷贝到libext目录下
$ mkdir /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/libext
$ cp /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/hadooplibs/hadooplib-2.6.0-cdh5.14.2.oozie-4.1.0-cdh5.14.2/* /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/libext/

7、将oozie web控制台所需要的js 库添加到 libext目录下

8、安装mysql并创建一个oozie所需要的数据库
> create database oozie;

9、将访问mysql的驱动包放入到oozie的libext目录下
$ cp /opt/cdh-5.14.2/hive-1.1.0-cdh5.14.2/lib/mysql-connector-java-5.1.27-bin.jar /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/libext/

10、配置oozie访问mysql的权限
$ vi conf/oozie-site.xml

<property>
    <name>oozie.service.JPAService.jdbc.driver</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>
        JDBC driver class.
    </description>
</property>


<property>
    <name>oozie.service.JPAService.jdbc.url</name>
    <value>jdbc:mysql://192.168.134.101:3306/oozie</value>
    <description>
        JDBC URL.
    </description>
</property>

<property>
    <name>oozie.service.JPAService.jdbc.username</name>
    <value>root</value>
    <description>
        DB user name.
    </description>
</property>

<property>
    <name>oozie.service.JPAService.jdbc.password</name>
    <value>123456</value>
    <description>
        DB user password.

        IMPORTANT: if password is emtpy leave a 1 space string, the service trims the value,
                   if empty Configuration assumes it is NULL.

        IMPORTANT: if the StoreServicePasswordService is active, it will reset this value with the value given in
                   the console.
    </description>
</property>



注意: 
	jdbc.url的路径中的主机名修改
	确认使用的用户名和密码是否有效  

11、oozie关联hadoop的配置文件

$ vi conf/oozie-site.xml    
oozie.service.HadoopAccessorService.hadoop.configurations *=/opt/cdh-5.14.2/hadoop-2.6.0-cdh5.14.2/etc/hadoop

12、依次执行以下三个命令

$ bin/oozie-setup.sh prepare-war [-d directory] [-secure]
sharelib create -fs <FS_URI> [-locallib ]
db create|upgrade|postupgrade -run [-sqlfile ]

1)使用oozie自带脚本将本地的所有框架的jar包上传到hdfs上某个路径下(hdfs上的共享jar包库路径)

$ bin/oozie-setup.sh  sharelib create  -fs hdfs://192.168.134.101:8020  -locallib /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/oozie-sharelib-4.1.0-cdh5.14.2-yarn.tar.gz

the destination path for sharelib is: /user/beifeng/share/lib/lib_20181202230508  --hdfs上的共享jar包库路径 

2)初始化oozie在mysql中状态(创建一些oozie所需要用到的表)

$ bin/oozie-setup.sh  db create  -run   -sqlfile  ./oozie.sql

3)生成oozie的Tomcat web工程 war包 – 打war包
# yum -y install unzip zip

$ bin/oozie-setup.sh  prepare-war 

13、启动 oozie server (Tomcat server )
$ bin/oozied.sh start

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cdh-5.14.2/hive-1.1.0-cdh5.14.2/lib/*

14、访问oozie的web控制台
http://192.168.134.101:11000/oozie/

案例
案例一 :配置一个只包含一个shell脚本任务的workflow
案例二 :配置一个包含多个shell脚本任务的workflow
案例三 :配置一个包含MapReduce任务的workflow
案例四 :配置一个coordinator应用,去周期性调度执行案例二中的workflow任务流

============================================

案例一:
配置一个只包含一个shell脚本任务的workflow

$ tar zxf oozie-examples.tar.gz   解压oozie应用模板
$ cp -r /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/examples/apps/shell/ /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell  拷贝shell任务模板  
shell任务模板文件  
	job.properties  
		java属性文件
		内部定义了多个被workflow.xml调用的变量值 
	workflow.xml
		xml文件 
		定义了任务流的执行逻辑及具体要调度执行的任务的具体信息 

自定义shell脚本

$ vi check_mem.sh
#!/bin/sh
/usr/bin/free -m >> /tmp/mem.log
/bin/date +"%Y%m%d-%H:%M:%S" >> /tmp/mem.log
/bin/echo “~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~” >> /tmp/mem.log

1、 修改job.properties

nameNode=hdfs://192.168.134.101:8020
jobTracker=192.168.134.101:8032
queueName=default

examplesRoot属性用来定义自定义的oozie应用所在的hdfs上的根目录

examplesRoot=oozie-apps

声明自定义的app应用所在hdfs上路径

oozie.wf.application.path= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/myshell

定义要调度执行的脚本的变量

check_mem=check_mem.sh

	<exec>${check_mem}</exec>  ---要调度执行的脚本的名称
	<file>/${examplesRoot}/myshell/${check_mem}#${check_mem}</file> 
		--要执行的脚本所在的hdfs上路径  
		--#${check_mem} 表示oozie会将hdfs上的要执行的shell脚本拷贝给最终执行该脚本的服务器节点一份

2、修改workflow.xml

${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${check_mem} /${examplesRoot}/myshell/${check_mem}#${check_mem} Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]

3、上传自定义的myshell 应用到hdfs上
$ bin/hdfs dfs -mkdir /oozie-apps
$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/ /oozie-apps

注意: 
	在所有的oozie app应用中,job.properties属于应用的属性文件,该文件不需要上传到hfds上,在本地提交给oozie执行workflow应用时会在本地直接加载读取该文件 
	workflow.xml及对应要调度执行的脚本必须上传到hdfs上,并且后续对其修改后一定要将hdfs上的原文件进行替换 

4、提交oozie workflow应用
$ sbin/mr-jobhistory-daemon.sh start historyserver

$ bin/oozie job -oozie http://192.168.134.101:11000/oozie  -config  /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/job.properties  -run



JA006: Call From bigdata01.project.com/192.168.134.101 to bigdata01.project.com:10020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
	
$ sbin/mr-jobhistory-daemon.sh start historyserver  


kill掉某个workflow任务 
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -kill 0000000-181202231324729-oozie-beif-W	

案例二:
在案例一基础上添加另外一个shell脚本任务

任务流: 
	start -》 
		检查内存脚本 
			ok-》 	检查磁盘空间脚本 
			error-》检查磁盘空间脚本  
		检查磁盘空间脚本 
			ok-》   end  	
			error-》kill  



定义另外一个检查磁盘空间脚本 

$ vi check_disk.sh   

#!/bin/sh
/bin/df -h >> /tmp/disk.log
/bin/date +"%Y%m%d-%H:%M:%S" >> /tmp/disk.log
/bin/echo “~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~” >> /tmp/disk.log

修改案例一的job.properties属性文件 

定义要调度执行的脚本的变量

check_disk=check_disk.sh

修改案例一的workflow.xml  
${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${check_mem} /${examplesRoot}/myshell/${check_mem}#${check_mem} ${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${check_disk} /${examplesRoot}/myshell/${check_disk}#${check_disk} Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
替换hdfs上原workflow.xml  并上传新的check_disk.sh脚本 
	$ bin/hdfs dfs -rm /oozie-apps/myshell/workflow.xml
	$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/check_disk.sh  /oozie-apps/myshell/    

	
	
提交workflow应用给oozie执行 
	$ bin/oozie job -oozie http://192.168.134.101:11000/oozie  -config  /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/job.properties  -run		
		
		
		
查看两个脚本执行结果 
	$ tail -f /tmp/mem.log 
	# tail -f /tmp/disk.log

	
如何排错: 
	首先找11000web上的对应的action的提示信息 
	到oozie安装目录下找logs/oozie.log  

案例三
如何调度执行MapReduce任务
配置一个包含MapReduce任务的任务流

1、拷贝模板并修改文件
$ cp -r examples/apps/map-reduce/ myapps/my-map-reduce
$ rm job-with-config-class.properties workflow-with-config-class.xml
job.properties lib workflow.xml
lib – 存放了所要调度执行的MapReduce程序jar包

$  rm lib/oozie-examples-4.1.0-cdh5.14.2.jar 
将之前开发过的MapReduce-wordcount jar包上传此lib目录下 

2、修改job.properties

nameNode=hdfs://192.168.134.101:8020
jobTracker=192.168.134.101:8032
queueName=default

examplesRoot属性用来定义自定义的oozie应用所在的hdfs上的根目录

examplesRoot=oozie-apps

#定义workflow应用在hdfs上的路径
oozie.wf.application.path= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/my-map-reduce

#定义MapReduce程序的hdfs上输出目录
outputdir=/oozie-apps/output/output1
#定义MapReduce程序的输入目录
inputDir=/oozie-apps/inputdir

3、修改workflow.xml

本地造数据并上传到MapReduce-wc的输入目录下
$ vi wc.txt
$ bin/hdfs dfs -mkdir -p /oozie-apps/inputdir
$ bin/hdfs dfs -put wc.txt /oozie-apps/inputdir






j o b T r a c k e r < / j o b − t r a c k e r > < n a m e − n o d e > {jobTracker}</job-tracker> <name-node> jobTracker</jobtracker><namenode>{nameNode}






mapred.mapper.new-api
true


mapred.reducer.new-api
true



mapreduce.input.fileinputformat.inputdir
i n p u t D i r < / v a l u e > < / p r o p e r t y > < ! − − M a p p e r c l a s s − − > < p r o p e r t y > < n a m e > m a p r e d u c e . j o b . m a p . c l a s s < / n a m e > < v a l u e > o r g . a p a c h e . h a d o o p . w o r d c o u n t . W o r d C o u n t M a p R e d u c e {inputDir}</value> </property> <!--Mapper class --> <property> <name>mapreduce.job.map.class</name> <value>org.apache.hadoop.wordcount.WordCountMapReduce inputDir</value></property><!Mapperclass><property><name>mapreduce.job.map.class</name><value>org.apache.hadoop.wordcount.WordCountMapReduceWordCountMapper


mapreduce.map.output.key.class
org.apache.hadoop.io.Text


mapreduce.map.output.value.class
org.apache.hadoop.io.IntWritable



mapreduce.job.reduce.class
org.apache.hadoop.wordcount.WordCountMapReduce W o r d C o u n t R e d u c e r < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > m a p r e d u c e . j o b . o u t p u t . k e y . c l a s s < / n a m e > < v a l u e > o r g . a p a c h e . h a d o o p . i o . T e x t < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > m a p r e d u c e . j o b . o u t p u t . v a l u e . c l a s s < / n a m e > < v a l u e > o r g . a p a c h e . h a d o o p . i o . I n t W r i t a b l e < / v a l u e > < / p r o p e r t y > < ! − − o u t p u t − − > < p r o p e r t y > < n a m e > m a p r e d u c e . o u t p u t . f i l e o u t p u t f o r m a t . o u t p u t d i r < / n a m e > < v a l u e > WordCountReducer</value> </property> <property> <name>mapreduce.job.output.key.class</name> <value>org.apache.hadoop.io.Text</value> </property> <property> <name>mapreduce.job.output.value.class</name> <value>org.apache.hadoop.io.IntWritable</value> </property> <!--output --> <property> <name>mapreduce.output.fileoutputformat.outputdir</name> <value> WordCountReducer</value></property><property><name>mapreduce.job.output.key.class</name><value>org.apache.hadoop.io.Text</value></property><property><name>mapreduce.job.output.value.class</name><value>org.apache.hadoop.io.IntWritable</value></property><!output><property><name>mapreduce.output.fileoutputformat.outputdir</name><value>{outputdir}







Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]


4、上传oozie wf应用到hdfs上
$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/my-map-reduce/ /oozie-apps/

5、提交oozie wf应用
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -config /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/my-mr/job.properties -run

其他类型任务的action如何定义
Action Extensions
Email Action
Shell Action
MapReduce Action
Hive Action
Sqoop Action
Ssh Action
DistCp Action
Writing a Custom Action Executor

案例四
如何借助coordinator功能模块周期性定时执行一个workflow任务流

基于时间使用coordinator功能模块时需要进行的配置修改

1、修改本地系统时间及时区 
	$ date -R 查看时区 应该 +0800  
	$ sudo rm -rf /etc/localtime 
	$ sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
	# ntpdate  -u  cn.pool.ntp.org 
	
	
2、修改oozie框架所使用的时区  
	默认使用的UTC(时间统一协调时)=》改成中国使用 +0800  
		
	$ vi conf/oozie-site.xml  
	
	
<property>
    <name>oozie.processing.timezone</name>
    <value>GMT+0800</value>
</property>		
	
	
	
3、修改oozie web控制器前端的js时区  
	$ vi oozie-server/webapps/oozie/oozie-console.js   
	
function getTimeZone() {
	Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
	return Ext.state.Manager.get("TimezoneId","GMT+0800");
}		



4、重启oozie server  
	$ bin/oozied.sh stop 
	$ bin/oozied.sh start   

需求:
要求从2020年1月6号12点开始到17点之间,每5分钟检查一次服务器的内存资源及磁盘资源并将检查结果记录到本地的/tmp目录下的日志文件中
(使用coordinator功能模块定义一个coordinator应用,在指定的生命周期内每5分钟执行一次案例二中的workflow应用)

1、拷贝coordinator模板 
	$ cp -r examples/apps/cron  myapps/mycron
	coordinator.xml  job.properties  workflow.xml 
		coordinator.xml  -- 
			用来定义所要执行的的workflow应用所在hdfs上的路径
			定义要执行的workflow应用的频率及生命周期 
		

2、删除模板中的workflow.xml文件 
	因为当前此案例二的脚本及workflow.xml文件已经存在于hdfs的/oozie-apps/myshell  
	
				
		
3、修改coordinator应用的job.properties 

nameNode=hdfs://192.168.134.101:8020
jobTracker=192.168.134.101:8032
queueName=default

examplesRoot属性用来定义自定义的oozie应用所在的hdfs上的根目录

examplesRoot=oozie-apps

当前定义的coordinator应用所在的hdfs上路径

oozie.coord.application.path= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/mycron

定义当前的coordinator应用要调度执行的workflow应用的hdfs路径

或者= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/myshell

workflowAppUri= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/mycron

定义要调度执行的脚本的变量

check_mem=check_mem.sh
check_disk=check_disk.sh

定义循环任务的生命长度

start时间相当于任务提交给oozie那一刻的时间需要是一个将来的时间

start=2018-12-4T11:10+0800
end=2018-12-4T17:00+0800

4、修改coordinator.xml  




w o r k f l o w A p p U r i < / a p p − p a t h > < c o n f i g u r a t i o n > < p r o p e r t y > < n a m e > j o b T r a c k e r < / n a m e > < v a l u e > {workflowAppUri}</app-path> <configuration> <property> <name>jobTracker</name> <value> workflowAppUri</apppath><configuration><property><name>jobTracker</name><value>{jobTracker}


nameNode
n a m e N o d e < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > q u e u e N a m e < / n a m e > < v a l u e > {nameNode}</value> </property> <property> <name>queueName</name> <value> nameNode</value></property><property><name>queueName</name><value>{queueName}




<coordinator-app name="my-cron-coord" frequency="${coord:minutes(5)}" start="${start}" end="${end}" timezone="GMT+0800"			 
	frequency="${coord:minutes(5)}" 
		定义所要执行的workflow的执行频率  
		${coord:minutes(5)} =》 可以修改为 ${*/5 * * * *}	
		
		执行频率不能快于5分钟  
			<name>oozie.service.coord.check.maximum.frequency</name>
			
		
		
		
		
5、上传coordinator应用到hdfs  
	$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/mycron/ /oozie-apps/  
	
	
6、提交coordinator应用  
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie  -config  /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/mycron/job.properties  -run			
	
	
	
	
7、查看执行情况  
	http://192.168.134.101:11000/oozie/ 
	查看脚本执行的日志文件 




$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -kill  0000000-181204103407182-oozie-beif-C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值