6.7 Mapreduce作业流JobControl和Oozie
1.1 Mapreduce作业流JobControl和Oozie
更复杂的任务,需要多个mapreduce作业,形成作业流,而不是增加map和reduce的复杂度。复杂问题,可以用高级语言pig、hive、cascading、crunch、spark。
1.1.1 问题分解成mapreduce作业流
按天统计每天的最高气温,求出每月的最高气温平均值;再找出每年中平均气温最高的月,找出1901-2000年哪一年的哪一个月的平均气温最高。分解为mapreduce作业流。
Mapreduce作业1
(1) map计算出每天的最高气温;(日期,最高气温)
(2) reduce计算所有每月最高气温的平均值。
MapReduce作业2
(1) 找出每年平均气温最高的月。(年份月份,最高平均气温)
(2) 找出1901-2000年之间气温最高的年月。
1.1.2 JobControl控制作业流顺序
可以使用jobClient线性执行两个作业,并通过waitForcompletion()返回值判断执行是否成功。
JobClient.runJob(conf1);
JobClient.runJob(conf2);
还可以用org.apache.hadoop.mapreduce.jobcontrol包或者org.apache.hadoop.mapred.jobcontrol中的JobControl实例来控制执行顺序。可以查看进程和作业状态,错误信息。使用步骤
(1)作业1加入控制器
ControlledJob ctrljob1 = new ControlledJob(conf);
ctrljob1.setJob(job1);
(2)作业2加入控制器,并依赖于作业1
ControlledJob ctrljob2 = new ControlledJob(conf);
ctrljob2.setJob(job2);
// 设置多个作业直接的依赖关系,意思为job2的启动,依赖于job1作业的完成
ctrljob2.addDependingJob(ctrljob1);
(3) 作业3加入控制容器,并能个依赖于作业2
ControlledJob ctrljob3 = new ControlledJob(conf);
ctrljob3.setJob(job3);
ctrljob3.addDependingJob(ctrljob2);
(4)JobControl控制作业流
// 主的控制容器,控制上面的总的3个子作业
JobControl jobCtrl = new JobControl("myctrl");
// 添加到总的JobControl里,进行控制
jobCtrl.addJob(ctrljob1);
jobCtrl.addJob(ctrljob2);
jobCtrl.addJob(ctrljob3);
// 在线程启动,记住一定要有这个
Thread t = new Thread(jobCtrl);
t.start();
while (true)
{
if (jobCtrl.allFinished())
{// 如果作业成功完成,就打印成功作业的信息
System.out.println(jobCtrl.getSuccessfulJobList());
System.out.println("所有job执行完毕");
jobCtrl.stop();
break;
}
}
1.1.3 Apache Oozie工作流调度系统
http://oozie.apache.org/docs/5.0.0/index.html
Oozie是工作流调度系统,用于调度作业流按照复杂的顺序逻辑执行。先将作业组成工作流workflow,然后coordinate引擎用于协调多个工作流workflow执行。Bundle将多个coordinate进行汇总处理。Workflow->Coordinate->Bundle.
Oozie与支持多种类型的Hadoop作业(如Java map-reduce、流式map-reduce、Pig、Hive、Sqoop和Distcp)以及特定于系统的工作(如Java程序和shell脚本)。
作业流由actions 集合(例如Hadoop map/reduce作业,pig作业),actions被安排在一个控制依赖项DAG(Direct Acyclic Graph)中,按顺序执行。
workflow工作流 |
流式作业,将任务分解为hadoop作业(MapReduce,pig,Hive)。通过workflow.xml配置执行工作流。 |
coordinator引擎 |
周期性执行工作流或者控制相互依赖的workflow 作业流。 |
Bundle |
将多个coordinate进行汇总处理。 |
Oozie架构图
Workflow流程图
Coordinate流程图
Bundle流程图
1.1.4 oozie工作流job组成
一个oozie 的 job 一般由以下文件组成:
job.properties :记录了job的属性,nameNode,jobTracker和 workflow.xml在hdfs中的位置必须设置。
workflow.xml :使用xml配置文件定义任务的流程和分支
lib目录:用来执行具体的任务。
(1)job.properties属性
KEY |
含义 |
nameNode |
HDFS地址 |
jobTracker |
jobTracker(ResourceManager)地址 |
queueName |
Oozie队列(默认填写default) |
examplesRoot |
全局目录(默认填写examples) |
oozie.usr.system.libpath |
是否加载用户lib目录(true/false) |
oozie.libpath |
用户lib库所在的位置 |
oozie.wf.application.path |
Oozie流程所在hdfs地址(workflow.xml所在的地址) |
user.name |
当前用户 |
oozie.coord.application.path |
Coordinator.xml地址(没有可以不写) |
oozie.bundle.application.path |
Bundle.xml地址(没有可以不写) |
实例如下
nameNode=hdfs://cm1:8020
jobTracker=cm1:8032
queueName=default
examplesRoot=examples
oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell
(2)workflow.xml
Workflow.xml定义了控制节点(start,kill,end)和动作节点action,控制节点控制流程的运行,动作节点定义了作业的任务。
Wordcount的workflow.xml实例
<workflow-app name='wordcount-wf' xmlns="uri:oozie:workflow:0.1">
<start to='wordcount'/>
<action name='wordcount'>
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.mapper.class</name>
<value>org.myorg.WordCount.Map</value>
</property>
<property>
<name>mapred.reducer.class</name>
<value>org.myorg.WordCount.Reduce</value>
</property>
<property>
<name>mapred.input.dir</name>
<value>${inputDir}</value>
</property>
<property>
<name>mapred.output.dir</name>
<value>${outputDir}</value>
</property>
</configuration>
</map-reduce>
<ok to='end'/>
<error to='end'/>
</action>
<kill name='kill'>
<message>Something went wrong: ${wf:errorCode('wordcount')}</message>
</kill/>
<end name='end'/>
</workflow-app>
(3)Lib目录:
在workflow工作流定义的同级目录下,需要有一个lib目录,在lib目录中存在java节点MapReduce使用的jar包。
需要注意的是,oozie并不是使用指定jar包的名称来启动任务的,而是通过指定主类来启动任务的。在lib包中绝对不能存在某个jar包的不同版本,不能够出现多个相同主类。
(4)执行作业流
将job.properties、workflow.xml和lib文件夹放在用户名的目录(${namenode}/user/${user.name})下的max-temp-workflow,复制到HDFS.
%hadoop fs –put Hadoop-examples/target/max-temp-workflow max-temp-workflow.
使用oozie命令行工具设置环境变量OOZIE_URL指定Oozie服务器
%export OOZIE_URL=”http://localhsot:11000/oozie”
运行工作流
% oozie job –config ch06-mr-dev/max-temp-workflow.preoperties –run job:0001-121
–config设置工作流属性文件,内含namenode、资源管理器地址、作业路径(oozie.wf.application.path=${namenode}/user/${user.name}/max-temp-workflow)
-run 参数用于运行指定的作业。
通过-info查看作业状态
%oozie job –info 0001-121
6.7 Mapreduce作业流JobControl和Oozie的更多相关文章
- MapReduce使用JobControl管理实例
import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; impo ...
- (转)多个mapreduce工作相互依赖处理方法完整实例(JobControl)
多个mapreduce工作相互依赖处理方法完整实例(JobControl) 原文地址:http://mntms.iteye.com/blog/2096456?utm_source=tuicool&am ...
- 使用JobControl控制MapReduce任务
代码结构 BeanWritable:往数据库读写使用的bean ControlJobTest:JobControl任务控制 DBInputFormatApp:将关系型数据库的数据导入HDFS,其中包含 ...
- 【Hadoop离线基础总结】oozie调度MapReduce任务
目录 1.准备MR执行的数据 2.执行官方测试案例 3.准备我们调度的资源 4.修改配置文件 5.上传调度任务到hdfs对应目录 6.执行调度任务 1.准备MR执行的数据 MR的程序可以是自己写的,也 ...
- 【机器学习实战】第15章 大数据与MapReduce
第15章 大数据与MapReduce 大数据 概述 大数据: 收集到的数据已经远远超出了我们的处理能力. 大数据 场景 假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则 ...
- (转)MapReduce Design Patterns(chapter 6 (part 1))(十一)
Chapter 6. Metapatterns 这种模式不是解决某个问题的,而是处理模式的关系的.可以理解为“模式的模式”.首先讨论的是job链,把几个模式联合起来解决复杂的,有多个阶段要处理的问题. ...
- 使用mapreduce计算环比的实例
最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个 ...
- Apriori on MapReduce
Apiroi算法在Hadoop MapReduce上的实现 输入格式: 一行为一个Bucket 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 34 36 38 ...
- MapReduce实例-NASA博客数据频度简单分析
环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境,gnuplot, 数据:http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.htm ...
随机推荐
- MySQL 8.0 技术详解
MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上 ...
- 神经网络入门——7or 感知器
OR 感知器 OR 感知器与 AND 感知器很类似,在下图中,OR 感知器与 AND 感知器有相同的分割线,只是 OR 感知器分割线下移了一段距离.对权重或者偏置做怎样的设置可以实现这个效果?用下面的 ...
- jq实现超级简单的隔行变色
文章地址:https://www.cnblogs.com/sandraryan/ <!DOCTYPE html> <html lang="en"> < ...
- HMM——维特比算法(Viterbi algorithm)
1. 前言维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给定 ...
- Java使用RandomAccessFile读写文件
目录 转载自:http://blog.csdn.net/akon_vm/article/details/7429245 Java RandomAccessFile RandomAccessFile是用 ...
- H3C ISDN BRI和PRI
- [转]来自后端的逆袭 blazor简介 全栈的福音
背景 什么是SPA 什么是MPA MPA (Multi-page Application) 多页面应用指的就是最传统的 HTML 网页设计,早期的网站都是这样的设计,所之称为「网页设计」.使用 MPA ...
- Python--day27--内置函数isinstance和issubclass方法
- 【js】vue 2.5.1 源码学习 (十) $mount 挂载函数的实现
大体思路(九) 本节内容: 1. $mount 挂载函数的实现. // 将Vue.prototype.$mount 缓存下来 ==>mountComponet(this,el) { // 组建挂 ...
- linux平台依赖性
每个电脑平台有其自己的特点, 内核设计者可以自由使用所有的特性来获得更好的性能. in the target object file ??? 不象应用程序开发者, 他们必须和预编译的库一起连接他们的代 ...