Hadoop(十一):组合任务概述和格式
组合任务概述
一些复杂的任务很难由一个MR处理完成,所以一般需要将其拆分成为多个简单的MR子任务来执行。
MapReduce框架中对于这类的问题提供了几种方式进行任务执行流程的控制,主要包括以下几种方式:
顺序组合式MapReduce任务
前一个执行完,后面再执行
依赖关系组合式MapReduce任务
前面有多个执行完,后面再执行
链式MapReduce任务
在Map之前或者Reduce之后增加处理
其中顺序组合式MapReduce任务可以经过变形成为迭代式的MapReduce任务。
顺序组合式MapReduce任务
多个MR任务作为一个串进行执行,前一个MR的输出作为后一个MR的输入,自动的完成顺序化的执行。
顺序组合式MR中:
每一个子任务都需要专门的设置独立的配置代码(其实就是和普通的MR是一样的)
安装任务的执行顺序设置job的运行顺序
任务完成后所有的中间结果输出目录都可以进行删除操作。
格式: MapReduce1 -> MapReduce2 -> MapReduce3....,
每个子任务都必须调用job.waitForCompletion(true)等待job执行完成才可以--就是前一个执行完成,后面才可以开始执行。
优点:结构简单,容易实现。
缺点:由于后一个MR任务必须等待前一个MR任务完成才可以进行,导致集群利用率不高;无法实现多重依赖的关系(或者说多依赖关系的实现比较麻烦)。
package com.rzp.linemr;
import org.apache.hadoop.mapreduce.Job;
import java.io.IOException;
//测试组合mr任务的案例:wordcount案例的输出结果是按照keyword字典排序进行输出,修改成按出现次数排序
public class Demo1 {
public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException {
//按顺序创建job1,job2...
Job job1 = createJobByTimes(1);
Job job2 = createJobByTimes(2);
//开始执行,这里执行顺序一定要和组合MR的Job的执行顺序一直
runJob(job1,1);
runJob(job2,2);
System.out.println("Job执行成功");
}
//执行Job,执行失败抛出异常
public static void runJob(Job job,int times) throws InterruptedException, IOException, ClassNotFoundException {
if (!job.waitForCompletion(true)){
throw new RuntimeException("第"+times+"个job执行失败");
}
}
/**
* 创建job根据给定的参数times
* times = 组合式MR任务中第几个job
*/
public static Job createJobByTimes(int times){
//和普通MR的Job创建一样,从InputFormant开始到OutputFormat给定
//TODO 创建Job
return null;
}
}
依赖关系组合式
Hadoop框架为复杂的数据依赖关系提供了一种组合式MapReduce作业的执行流程机制。
其实就是MR3依赖于MR1和MR2的结果,但是MR1和MR2不互相依赖,可以同时进行,而如果用顺序式就做不到。
Hadoop通过Job和JobControl类为这些作业提供具体的编程方法。
Job除了维护配置信息外,还需要维护子任务的依赖关系
JobControl类主要用来控制整个作业的执行过程。JobControl是一个Runnable子类,通过线程来调用start方法进行作业的执行流程控制。
Job完整类名为: org.apache.hadoop.mapred.jobcontrol.Job
JobControl完整类名为: org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl
优点:实现相对而言简单,提高了集群利用率。
缺点:需要自己实现job执行流管理(job失败后执行流失败等操作)
package com.rzp.linemr;
import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
import org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl;
import org.apache.hadoop.mapreduce.Job;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//调用createControlledJob()把mapreduce.Job(普通的job)转换为可控制的ControlledJob对象
ControlledJob job1 = createControlledJob(createJobByTimes(1));
ControlledJob job2 = createControlledJob(createJobByTimes(2));
ControlledJob job3 = createControlledJob(createJobByTimes(3));
//指定依赖关系--job3依赖于job1和job2
//addDependinJob会返回Boolean,可以用于验证
job3.addDependingJob(job1);
job3.addDependingJob(job2);
//开始创建job的执行流
JobControl jc = new JobControl("测试依赖关系组合式");
//添加job,没有顺序
jc.addJob(job1);
jc.addJob(job2);
jc.addJob(job3);
//总的job个数
int totalSize = jc.getReadyJobsList().size();
//开始执行job流
//因为继承了Runnable接口,可以直接调用run方法
//jc.run();
//更推荐使用Thread来执行
boolean succeeded = false; //job执行流是否成功执行的标志位
try{
new Thread(jc).start();
while (!jc.allFinished()){
//没有执行完,继续进行
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}finally {
//停止执行
jc.stop();
if(jc.allFinished()&&jc.getSuccessfulJobList().size() == totalSize){
//全部执行完,而且执行成功job个数和总的job个数相等,那么任务job执行陈工
succeeded = true;
}
}
System.out.println("job执行"+(succeeded?"成功":"失败"));
}
//把mapreduce.Job(普通的job)转换为可控制的ControlledJob对象
public static ControlledJob createControlledJob (Job job) throws IOException {
ControlledJob cj = new ControlledJob(job.getConfiguration());
cj.setJob(job);//惊醒设置
return cj;
}
//和普通MR的Job创建一样,从InputFormant开始到OutputFormat给定
public static Job createJobByTimes(int times){
//TODO 创建Job
return null;
}
}
链式MapReduce
前两种方式都会有多个Job的启动和关闭,会消耗资源,而Map和Reduce都涉及IO操作,效率不高,因此可以使用链式MR。
一个MR任务可能会有一些前处理和后处理,比如说文档倒序索引中可能前处理需要去掉一些“停用词”,后处理需要将一些同义词进行归并。
链式MR:链式Mapper(ChainMapper)和链式Reducer(ChainReducer)来完成这种处理。这种作业的执行流程为:map1-->map2-...-->reducer-->map3-->map4-...
链式MR要求一个链路中只能有一个reduce操作,可以有多个map操作。
优点:对于前处理和后处理有要求的MR任务,减轻了操作,提高了效率。
缺点:需要指定额外的参数信息(前两种方式,job本身写法和普通MR是一样的,只是在运行主程序上做了操作,但是这种就不同了)。
创建完job后,需要使用hadoop提供的专门类设置链路中的map-reduce执行顺序。
使用ChainMapper.addMapper添加Map阶段的mapper,按照添加顺序执行,
在Reducer阶段必须先使用ChainReducer.setReducer添加reducer处理类,然后才可以使用ChainReducer.addMapper添加mapper处理类,也是按照添加顺序执行job。
package com.rzp.linemr;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.lib.ChainMapper;
import org.apache.hadoop.mapred.lib.ChainReducer;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws Exception {
Configuration conf1 = new Configuration();
Job job1 = Job.getInstance(conf1,"job1");
job1.setJarByClass(Demo3.class);
FileInputFormat.addInputPath(job1,new Path(""));
/**
* 设置mapper
* klass 对应mapper类
* K1, V1, K2, V2---klass对应的输入、输出的类型
* mapperConf mapper使用的编写信息
*/
//添加第1个mapper
ChainMapper.addMapper(JobConf job,
Class<? extends Mapper<K1, V1, K2, V2>> klass,
Class<? extends K1> inputKeyClass,
Class<? extends V1> inputValueClass,
Class<? extends K2> outputKeyClass,
Class<? extends V2> outputValueClass,
boolean byValue, JobConf mapperConf);
//添加第2个mapper
ChainMapper.addMapper(JobConf job,
Class<? extends Mapper<K1, V1, K2, V2>> klass,
Class<? extends K1> inputKeyClass,
Class<? extends V1> inputValueClass,
Class<? extends K2> outputKeyClass,
Class<? extends V2> outputValueClass,
boolean byValue, JobConf mapperConf);
//添加reducer
//输入值和上面的一样
ChainReducer.setReducer(...);
//添加reducer后续Mapper
//格式也和上面的一样
//注意reducer
ChainReducer.addMapper(...);
//设置总的输入输出路径
job1.setJarByClass(Demo3.class);
//TODO 添加map和reduce的输出key和value的类型
}
}
Hadoop(十一):组合任务概述和格式的更多相关文章
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据
将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...
- hadoop排序组合键的使用情况
于hadoop当处理复杂的业务,需要使用组合键,与单纯的复杂的继承Writable接口,但继承WritableComparable<T>接口.事实上.WritableComparable& ...
- 大数据入门第五天——离线计算之hadoop(上)概述与集群安装
一.概述 根据之前的凡技术必登其官网的原则,我们当然先得找到它的官网:http://hadoop.apache.org/ 1.什么是hadoop 先看官网介绍: The Apache™ Hadoop® ...
- ebay商品基本属性组合成数据表格式,可用上传到系统递交数据
该刊登表设计是利用VB写的,当时因为两个系统的数据不能直接对接,又copy并且组合SKU,一个表格一个表格填写,比较麻烦,还好刊登系统可以允许用excel表格上传数据 所以就下好模板,学了VB语言,在 ...
- Hadoop 3.1.1 - 概述 - 集群安装
Hadoop 集群安装 目标 本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群.如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装). 本文并不包含诸如安 ...
- FineUI第十一天---布局概述
布局概述 1.填充整个页面: 让整个容器填充整个页面,设置PageManager的AutoSizePanelID为需要填充整个页面的容器控件ID. 2. 填充整个容器(Fit): 让一个控件填满另一个 ...
- Hadoop -YARN 应用程序设计概述
一概述 应用程序是用户编写的处理数据的统称,它从YARN中申请资源完毕自己的计算任务.YARN自身相应用程序类型没有不论什么限制,它能够是处理短类型任务的MapReduce作业,也能够是 ...
- HADOOP (十一).安装hbase
下载安装包并解压设置hbase环境变量配置hbase-site.xml启动hbase检测hbase启动情况测试hbase shell 下载安装包并解压 https://mirrors.tuna.tsi ...
- hadoop(十一)HDFS简介和常用命令介绍
HDFS背景 随着数据量的增大,在一个操作系统中内存不了了,就需要分配到操作系统的的管理磁盘中,但是不方便管理者维护,迫切需要一种系统来管理多态机器上的文件,这就是分布式文件管理系统. HDFS的概念 ...
随机推荐
- ggplot2(7) 定位
7.1 简介 位置调整:调整每个图层中出现重叠的对象的位置,对条形图和其他有组距的图形非常有用: 位置标度:控制数据到图形中位置的映射,常用的是对数变换: 分面:先将数据集划分为多个子集,然后将每个子 ...
- vux中表单验证,在提交时自动聚焦到未验证通过的那栏;及循环表单的验证
首先vux中的表单验证在点击触发,失焦时才显示错误信息,如果不管它,它就没反应,这显然是不合理的:解决办法就是:在提交时做验证,不通过的话就使用.focus()及.blur()方法给它聚焦,失焦. i ...
- 如何使用域名访问自己的Windows服务器(Java web 项目)
如何使用域名访问自己的Windows服务器(Java web 项目) 写在前面 前段时间在阿里云弄了个学生服务器,就想着自己搭建一个网站试一试,在网上查阅相关资料时发现大部分都是基于服务器是Linux ...
- 关于emgucv控制多摄像头问题
看到这篇文章你或许已经查阅很多资料,也可能你刚准备深入研究,但是关于调用多摄像头问题我要说明一点,关于多摄像头调用 取决于你电脑本身USB控制器数量,不是说你电脑上5个usb就可以同时控制5台摄像头, ...
- JSP(一)----入门学习
## JSP 1.概念: * Java Server Pages:java服务端页面 * 可以理解为:一个特殊的页面,其中既可以直接定义html标签,又可以定义java代码 2.原理 * ...
- 洛谷 P1891 疯狂LCM 题解
原题链接 享受推式子的乐趣吧 数论真有趣! 庆祝:数论紫题第 \(3\) 道. \[\sum_{i=1}^n \operatorname{lcm}(i,n) \] \[= \sum_{i=1}^n \ ...
- 快速排序-无序数组K小元素
13:07:382020-03-10 11:16:13 问题描述: 找到一个无序数组中第K小的数 样例 1: 输入: [3, 4, 1, 2, 5], k = 3 输出: 3 样例 2: 输入: [1 ...
- Jocke的IOT之路--raspberrypi更换国内镜像
一.编辑sources.list文件 sudo nano /etc/apt/sources.list 使用#将文件内容全部注释调,更改位 deb http://mirrors.tuna.tsinghu ...
- OpenCV-Python 轮廓属性 | 二十三
目标 在这里,我们将学习提取一些常用的物体属性,如坚实度,等效直径,掩模图像,平均强度等.更多的功能可以在Matlab regionprops文档中找到. (注:质心.面积.周长等也属于这一类,但我们 ...
- 一文总结数据科学家常用的Python库(下)
用于建模的Python库 我们已经到达了本文最受期待的部分 - 构建模型!这就是我们大多数人首先进入数据科学领域的原因,不是吗? 让我们通过这三个Python库探索模型构建. Scikit-learn ...