文章目录

  • oozie
    • oozie的安装
      • 解决oozie的页面的时区问题
    • oozie的使用
      • 使用oozie调度shell脚本
      • 使用oozie调度hive
      • 使用oozie调度MR任务
      • oozie的任务串联
      • oozie的任务调度,定时任务执行
      • oozie当中任务的查看以及杀死

oozie

Oozie是运行在hadoop平台上的一种工作流调度引擎,它可以用来调度与管理hadoop任务,如,MapReduce、Pig等。
OozieWorkflow中的一个个的action(可以理解成一个个MapReduce任务)根据向无环图(DAGDirect Acyclic Graph)的模式来进行管理调度的,我们可以利用HPDL语言(一种xml语言)来定义整个workflow,实现工作流的调度oozie的架构以及执行流程。

oozie的架构
1、client 客户端,提交任务到oozie的服务端
2、oozie-server 服务端,就是运行了一个tomcat的实例,主要是用于接收客户端提交的任务
3、db 数据库,服务端将客户端提交的任务都保存在db里面了,默认使用的db是h2

azkaban可以检测失败,但无法设定下一步。oozie可以控制执行成功怎么办,执行失败又怎么办。

oozie的执行流程

oozie的组件介绍
1、workFlow 就是定义工作流 从哪一个开始执行,到哪一个最终结束,最后定义完成之后,形成一个有向无环图DAG。workflow里面由一个个的action组成,一个aciton就是我们一个需要执行的任务。
2、Coordinator 协作器,是一个任务调度的模块,可以设置我们定时执行,相当于一个定时器
3、bundle 捆绑器 可以将我们多个Coordinator 捆绑到一起叫做一个bundle

oozie的安装

一共14个步骤

  1. 修改core-site.xml
    因为oozie默认用户是oozie,而我们这里默认全部用root用户,所以需要添加代理用户。
    修改core-site.xml添加我们hadoop集群的代理用户
    cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
    vim core-site.xml
<property><name>hadoop.proxyuser.root.hosts</name><value>*</value></property><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property>

注意:hadoop的历史任务的服务必须启动,即19888端口可以查看,具体如何配置19888请查看hadoop的环境搭建
修改完成之后,记得重启hadoop的hdfs与yarn集群,还要记得启动jobhistory

重启hdfs与yarn集群
cd /export/servers/hadoop-2.6.0-cdh5.14.0
sbin/stop-dfs.sh
sbin/start-dfs.sh
sbin/stop-yarn.sh
sbin/start-yarn.sh

  1. 上传oozie的安装包并解压

cd /export/softwares/
tar -zxvf oozie-4.1.0-cdh5.14.0.tar.gz -C …/servers/

  1. 解压hadooplibs到与oozie平行的目录

cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxvf oozie-hadooplibs-4.1.0-cdh5.14.0.tar.gz -C …/

  1. 创建libext目录

在oozie的安装路径下创建libext目录,jar包的拓展目录
cd /export/servers/oozie-4.1.0-cdh5.14.0
mkdir -p libext

  1. 拷贝依赖包到libext

拷贝一些依赖包到libext目录下面去
拷贝所有的依赖包
cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -ra hadooplibs/hadooplib-2.6.0-cdh5.14.0.oozie-4.1.0-cdh5.14.0/* libext/
拷贝mysql的驱动包
cp /export/servers/hive-1.1.0-cdh5.14.0/lib/mysql-connector-java-5.1.38.jar /export/servers/oozie-4.1.0-cdh5.14.0/libext/

  1. 添加ext-2.2.zip压缩包

拷贝ext-2.2.zip这个包到libext目录当中去。是一个前端的js框架。
将我们准备好的软件ext-2.2.zip拷贝到我们的libext目录当中去

  1. 修改oozie-site.xml

如果没有这些属性,直接添加进去即可,oozie默认使用的是UTC的时区,我们需要在我们oozie-site.xml当中记得要配置我们的时区为GMT+0800时区

cd /export/servers/oozie-4.1.0-cdh5.14.0/conf
vim oozie-site.xml

<property><name>oozie.service.JPAService.jdbc.driver</name><value>com.mysql.jdbc.Driver</value></property><property><name>oozie.service.JPAService.jdbc.url</name><value>jdbc:mysql://node03.hadoop.com:3306/oozie</value></property><property><name>oozie.service.JPAService.jdbc.username</name><value>root</value></property><property><name>oozie.service.JPAService.jdbc.password</name><value>123456</value></property><property><name>oozie.processing.timezone</name><value>GMT+0800</value></property><property><name>oozie.service.ProxyUserService.proxyuser.hue.hosts</name><value>*</value></property><property>   <name>oozie.service.ProxyUserService.proxyuser.hue.groups</name><value>*</value></property><property><name>oozie.service.coord.check.maximum.frequency</name><value>false</value></property>     <property><name>oozie.service.HadoopAccessorService.hadoop.configurations</name><value>*=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop</value>
</property>
  1. 创建mysql数据库

mysql -uroot -p
create database oozie;

  1. 上传oozie依赖的jar包到hdfs上面去

上传oozie的解压后目录的yarn.tar.gz到hdfs目录去
bin/oozie-setup.sh sharelib create -fs hdfs://node01:8020 -locallib oozie-sharelib-4.1.0-cdh5.14.0-yarn.tar.gz
实际上就是将这些jar包解压到了hdfs上面的路径下面去了

  1. 创建oozie的数据库表

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh db create -run -sqlfile oozie.sql

  1. 打包项目,生成war包

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh prepare-war

  1. 配置oozie的环境变量

vim /etc/profile

export OOZIE_HOME=/export/servers/oozie-4.1.0-cdh5.14.0
export OOZIE_URL=http://node03.hadoop.com:11000/oozie
export PATH=:$OOZIE_HOME/bin:$PATH

source /etc/profile

  1. 启动与关闭oozie服务
    启动命令
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozied.sh start
    关闭命令
    bin/oozied.sh stop

  2. 浏览器页面访问oozie
    http://node03:11000/oozie/


启动后可以看到显示有一个catalina_pid,如果oozie启动不了,可以删除这个对应路径中的temp文件夹,pid是进程号。

解决oozie的页面的时区问题

修改js当中的时区问题
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie-server/webapps/oozie
vim oozie-console.js

function getTimeZone() {Ext.state.Manager.setProvider(new Ext.state.CookieProvider());return Ext.state.Manager.get("TimezoneId","GMT+0800");
}

重启oozie即可
cd /export/servers/oozie-4.1.0-cdh5.14.0
关闭oozie服务
bin/oozied.sh stop
启动oozie服务
bin/oozied.sh start

oozie的使用

使用oozie调度shell脚本

  1. 解压官方提供的调度案例

cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxf oozie-examples.tar.gz

  1. 创建我们的工作目录
    调度任务的配置文件全部放到oozie的工作目录当中去
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    mkdir oozie_works

  2. 拷贝我们的任务模板到我们的工作目录当中去

将shell的任务模板拷贝到我们oozie的工作目录当中去
cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -r examples/apps/shell/ oozie_works/

  1. 随意准备一个shell脚本

cd /export/servers/oozie-4.1.0-cdh5.14.0
vim oozie_works/shell/hello.sh

#!/bin/bash
echo "hello world" >> /export/servers/hello_oozie.txt
  1. 修改模板下的配置文件
    oozie的两个配置文件
    job.properties:
    定义一些变量,例如我们的集群的hdfs的访问地址,mapreduce任务的提交地址。job.proerties这个文件,保存在本地磁盘
    workflow.xml
    定义我们的工作流,里面有一个个的aciton,一个action就是一个我们要执行的任务,需要读取job.properties里面的配置,这个配置文件需要上传到hdfs
    hello.sh :我们需要执行的脚本文件

修改job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/shell
vim job.properties

nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works
# 这个参数定义了workflow.xml所在的hdfs的路径
# hdfs://node01:8020/user/root/oozie_works/shell
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell
EXEC=hello.sh

修改workflow.xml
vim workflow.xml
这里workflow直接设置ok to=“end”,略过决策执行成功失败的判断。

<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="shell-node"/>
<action name="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>${EXEC}</exec><!-- <argument>my_output=Hello Oozie</argument> --><file>/user/root/oozie_works/shell/${EXEC}#${EXEC}</file><capture-output/></shell><ok to="end"/><error to="fail"/>
</action>
<decision name="check-output"><switch><case to="end">${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}</case><default to="fail-output"/></switch>
</decision>
<kill name="fail"><message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output"><message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>
  1. 上传我们的调度任务到hdfs上面去
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    hdfs dfs -put oozie_works/ /user/root

这一步我这里报过错,显示Warning: fs.defaultFS is not set when running “put” command.
原因:因为 /usr/bin/下存在hadoop,hdfs的可执行文件,优先查找这个路径,所以没有执行我们安装目录下的hdfs
解决
rm -rf /usr/bin/hadoop
rm -rf /usr/bin/hdfs
rm -rf /usr/bin/hive

可以执行 which hadoop和which hdfs来查找验证这2个命令所在位置.

最后 source /etc/profile ,不行也可以试试重启,我两个都做了。

  1. 执行调度任务
    通过oozie的命令来执行我们的调度任务
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/shell/job.properties -run

查看hadoop的19888端口

使用oozie调度hive

oozie是一个真正的分布式的调度框架,如果写一个hive的脚本,没法确定这个hive的脚本究竟会在哪一台机器上面执行。
如果只有第三台安装了hive,那么hive的脚本可能没法执行
三台都安装hive可以执行,或者shell脚本里面通过ssh 到我们第三台机器来执行。

这里采用hiveserver2的方式连接,可以指定连接到哪一个机器。

  1. 拷贝hive的案例模板

cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -ra examples/apps/hive2/ oozie_works/

  1. 编辑hive模板
    这里使用的是hiveserver2来进行提交任务,需要注意我们要将hiveserver2的服务给启动起来
    修改job.properties
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/hive2
    vim job.properties
nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
jdbcURL=jdbc:hive2://node03:10000/default
examplesRoot=oozie_worksoozie.use.system.libpath=true
# 配置我们文件上传到hdfs的保存路径 实际上就是在hdfs 的/user/root/oozie_works/hive2这个路径下
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/hive2

编辑hivesql文件
vim script.q

DROP TABLE IF EXISTS test;
CREATE EXTERNAL TABLE test (a INT) STORED AS TEXTFILE LOCATION '${INPUT}';
insert into test values(10);
insert into test values(20);
insert into test values(30);
  1. 上传工作文件到hdfs
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    hdfs dfs -put hive2/ /user/root/oozie_works/

  2. 执行oozie的调度
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/hive2/job.properties -run

  3. 查看调度结果

使用oozie调度MR任务

这里选用hadoop工程自带的MR程序来运行wordcount的示例。
准备以下数据上传到HDFS的/oozie/input路径下去
hdfs dfs -mkdir -p /oozie/input
vim wordcount.txt
hello world hadoop
spark hive hadoop

  1. 将我们的数据上传到hdfs对应目录
    hdfs dfs -put wordcount.txt /oozie/input

  2. 执行官方测试案例
    yarn jar /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar wordcount /oozie/input/ /oozie/output

  3. 准备我们调度的资源
    将我们需要调度的资源都准备好放到一个文件夹下面去,包括我们的jar包,我们的job.properties,以及我们的workflow.xml。
    拷贝MR的任务模板
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    cp -ra examples/apps/map-reduce/ oozie_works/

删掉MR任务模板lib目录下自带的jar包
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib
rm -rf oozie-examples-4.1.0-cdh5.14.0.jar

  1. 拷贝我们自己的jar包到对应目录
    把我们需要调度的jar包也放到这个路径下即可
    cp /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib/

  2. 修改配置文件
    修改job.properties
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce
    vim job.properties

nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_worksoozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/map-reduce/workflow.xml
outputDir=/oozie/output
inputdir=/oozie/input

修改workflow.xml
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce
vim workflow.xml
修改delete path,然后注释掉原本的Hadoop1.x的property。注释从标黄部分开始到最后一个property。(< /configuration>之前的部分)

添加新的property,对应mapreduce的八个步骤

<!-- 开启使用新的API来进行配置 --><property><name>mapred.mapper.new-api</name><value>true</value></property><property><name>mapred.reducer.new-api</name><value>true</value></property><!-- 指定MR的输出key的类型 --><property><name>mapreduce.job.output.key.class</name><value>org.apache.hadoop.io.Text</value></property><!-- 指定MR的输出的value的类型--><property><name>mapreduce.job.output.value.class</name><value>org.apache.hadoop.io.IntWritable</value></property><!-- 指定输入路径 --><property><name>mapred.input.dir</name><value>${nameNode}/${inputdir}</value></property><!-- 指定输出路径 --><property><name>mapred.output.dir</name><value>${nameNode}/${outputDir}</value></property><!-- 指定执行的map类 --><property><name>mapreduce.job.map.class</name><value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value></property><!-- 指定执行的reduce类 --><property><name>mapreduce.job.reduce.class</name><value>org.apache.hadoop.examples.WordCount$IntSumReducer</value></property><!--  配置map task的个数 --><property><name>mapred.map.tasks</name><value>1</value></property>
  1. 上传调度任务到hdfs对应目录
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    hdfs dfs -put map-reduce/ /user/root/oozie_works/

  2. 执行调度任务
    cd /export/servers/oozie-4.1.0-cdh5.14.0
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/map-reduce/job.properties -run

oozie的任务串联

  1. 准备工作目录
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    mkdir -p sereval-actions

  2. 准备调度文件
    将之前的hive,shell,以及MR的执行,进行串联成到一个workflow当中去
    准备资源文件
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
    cp hive2/script.q sereval-actions/
    cp shell/hello.sh sereval-actions/
    cp -ra map-reduce/lib sereval-actions/

  3. 开发调度的配置文件
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/sereval-actions
    配置文件workflow.xml

<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="shell-node"/>
<action name="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>${EXEC}</exec><!-- <argument>my_output=Hello Oozie</argument> --><file>/user/root/oozie_works/sereval-actions/${EXEC}#${EXEC}</file><capture-output/></shell><ok to="mr-node"/><error to="mr-node"/>
</action><action name="mr-node"><map-reduce><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><prepare><delete path="${nameNode}/${outputDir}"/></prepare><configuration><property><name>mapred.job.queue.name</name><value>${queueName}</value></property><!-- 开启使用新的API来进行配置 --><property><name>mapred.mapper.new-api</name><value>true</value></property><property><name>mapred.reducer.new-api</name><value>true</value></property><!-- 指定MR的输出key的类型 --><property><name>mapreduce.job.output.key.class</name><value>org.apache.hadoop.io.Text</value></property><!-- 指定MR的输出的value的类型--><property><name>mapreduce.job.output.value.class</name><value>org.apache.hadoop.io.IntWritable</value></property><!-- 指定输入路径 --><property><name>mapred.input.dir</name><value>${nameNode}/${inputdir}</value></property><!-- 指定输出路径 --><property><name>mapred.output.dir</name><value>${nameNode}/${outputDir}</value></property><!-- 指定执行的map类 --><property><name>mapreduce.job.map.class</name><value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value></property><!-- 指定执行的reduce类 --><property><name>mapreduce.job.reduce.class</name><value>org.apache.hadoop.examples.WordCount$IntSumReducer</value></property><!--  配置map task的个数 --><property><name>mapred.map.tasks</name><value>1</value></property></configuration></map-reduce><ok to="hive2-node"/><error to="fail"/></action><action name="hive2-node"><hive2 xmlns="uri:oozie:hive2-action:0.1"><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><prepare><delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive2"/><mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/></prepare><configuration><property><name>mapred.job.queue.name</name><value>${queueName}</value></property></configuration><jdbc-url>${jdbcURL}</jdbc-url><script>script.q</script><param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param><param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive2</param></hive2><ok to="end"/><error to="fail"/></action>
<decision name="check-output"><switch><case to="end">${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}</case><default to="fail-output"/></switch>
</decision>
<kill name="fail"><message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output"><message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>

job.properties配置文件
vim job.properties

nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works
EXEC=hello.sh
outputDir=/oozie/output
inputdir=/oozie/input
jdbcURL=jdbc:hive2://node03:10000/default
oozie.use.system.libpath=true
# 配置我们文件上传到hdfs的保存路径 实际上就是在hdfs 的/user/root/oozie_works/sereval-actions这个路径下
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/sereval-actions/workflow.xml
  1. 上传资源文件夹到hdfs对应路径
    cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/
    hdfs dfs -put sereval-actions/ /user/root/oozie_works/

  2. 执行调度任务
    cd /export/servers/oozie-4.1.0-cdh5.14.0/
    bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/serveral-actions/job.properties -run

oozie的任务调度,定时任务执行

oozie当中的定时任务
Coordinator :oozie当中的协作器,主要适用于我们的定时任务的执行,通过配置Coordinator可以实现我们的任务的定时的执行
定时的任务调度: 两种调度方式
第一种:基于数据的调度,有了数据就开始运行
第二种:基于时间的调度,定时的执行

主要涉及到三个配置文件
第一个:workflow.xml 工作流的定义
第二个:coordinator.xml 定义我们的定时任务,定时执行我们的workflow.xml
第三个配置文件:job.properties 定义我们的一些变量

oozie当中任务的查看以及杀死

查看所有普通任务
oozie jobs
查看定时任务
oozie jobs -jobtype coordinator

oozie可以通过jobid来杀死某个定时任务
oozie job -kill [id]
例如我们可以使用命令
oozie job -kill 0000003-200607144136085-oozie-root-C
来杀死我们定时任务

最新文章

  1. 虚商烦恼多?不在怕的!你距离享受高效虚商控制台只差一步的距离
  2. 饥荒自建服务器崩了之后没有记录了,请问一下为什么服务器建一次之后就再也成功不了了。。...
  3. [一文一命令]less命令详解
  4. 一起谈.NET技术,C#创建不规则窗体的几种方式
  5. java中日期格式转换
  6. 不可不知的C#基础 4. 延迟加载 -- 提高性能
  7. 每天一道LeetCode-----将数字用字母表示(本质是26进制转换)
  8. java单例模式的七种写法_Java设计模式之单例模式的七种写法
  9. MongoDB数据建模介绍
  10. 航测和倾斜摄影处理软件汇总
  11. html表格打印分页无边框_excel怎么显示打印线-表格换页打印没有边框线
  12. mbr+ghost装黑苹果OS X 10.13
  13. unity抠人像原理_PS 抠人像如何抠得干净?
  14. 四川农业大学计算机专业课程资料
  15. Linux串口编程 —— 发送的数据无法被接收,且被原封不动返回
  16. CentOS下zookeeper集群搭建
  17. ubuntu linux0.12,ubuntu Linux 安装 jdk1.6.0_12和 Netbean 6.5
  18. 金蝶9.1 mdac安装 question
  19. 由于找不到concrt140.dll怎么办?
  20. python生成xml报表_使用python生成Xml

热门文章

  1. 详细安装sqlmap详细教程
  2. SSD 超详细入门(代码+原文)
  3. as ssd中文版测试软件,AS SSD Benchmark
  4. 【bat批处理脚本命令】bat命令接收用户输入的内容(保姆级图文+实现代码)
  5. 测试用例的设计方法及例子
  6. java中的数据结构——图
  7. 2020互联网大厂中秋礼盒PK!我酸了!
  8. Ajax文件上传(formdata)
  9. Unicode编码表
  10. 基于JavaWeb的网上订餐网站设计与实现