高阶MapReduce_1_链接多个MapReduce作业
链接MapReduce作业
1. 顺序链接MapReduce作业
顺序链接MapReduce作业就是将多个MapReduce作业作为生成的一个自己主动化运行序列,将上一个MapReduce作业的输出作为下一个MapReduce作业的输入。
MapReduce作业的链接就类似于Unix 的管道:
mapreduce – 1 | mapreduce – 2 | mapreduce – 3 | ···
顺序链接MapReduce作业的执行过程,就是driver为MapReduce作业创建一个带有配置參数的JobConf对象,并将该对象传递给JobClient.runJob()来启动这个作业。而当JobClient.runJob()执行到作业结尾处时会被阻止,MapReduce作业的链接就会在这个时候调用另外一个MapReduce作业的driver。每一个作业的driver都必须创建一个新的JobConf对象。并将其输入路径设置为前一个作业的输出路径。
2. 具有复杂依赖的MapReduce链接
假设两个或者多个MapReduce作业之间存在运行的先后顺序关系的话。那么这个时候就不能用顺序链接。
Hadoop怎样处理这样的MapReduce作业之间的关系的呢,Hadoop通过Job和JobControl类来管理这样的(非线性)作业之间的依赖。
Job对象是MapReduce作业的表现形式。
Job对象的实例化通过传递一个JobConf对象到作业的构造函数中来实现。也就是说通过public Job(JobConf jobConf){}来实现实例化一个MapReduce作业。Job通过Job1.addDependingJob(Job2)来维护作业间的依赖关系这也意味着Job1在Job2完毕之前是不会启动的。
JobControl对象负责管理并监视作业Job的运行。加入作业:addJob()方法。而当全部作业和依赖关系加入完毕之后,调用JobControl的run()方法。就会生成一个专门提交作业并监视作业运行的线程,这样就实现了JobControl对Job的管理和监视。
3. 预处理和后处理阶段的链接
Hadoop关于预处理和后处理作业的链接提供了两种解决方式。
方案一:为预处理和后处理步骤各自编写一个MapReduce作业。并将其链接起来。在这些步骤中能够使用IdentityReducer。而在此过程中每个步骤的中间结果都须要占用I/O和存储资源,所以这样的方案是很低效的,普通情况下Hadoop是不建议使用的。
方案二:自己组合mapper和reducer,也就是说自己写mapper去预先调用全部的预处理步骤,再让reducer调用全部的后处理步骤。在Hadoop中呢,是引入了ChainMapper和ChainReducer类来简化预处理和后处理的构成,生成的作业表达式类似于:MAP+ | REDUCE | MAP+ 通过依照这个顺序来运行运行多个mapper来预处理数据,并在reduce之后可选的地按序运行多个mapper来做数据的后处理。
比如:有4个mapper作业和一个reduce作业,顺序例如以下:
Map1 | Map2| Reduce | Map3 | Map4
在这个组合中呢。我们就能够把Map2和Reduce来作业MapReduce作业的核心,把Map1作业预处理步骤,把Map3和Map4作业后处理步骤。
...
conf.setJobName("chain");
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class); JobConf mapAConf = new JobConf(false); ...ChainMapper.addMapper(conf, AMap.class, LongWritable.class, Text.class,Text.class, Text.class, true, mapAConf); JobConf mapBConf = new JobConf(false); ...ChainMapper.addMapper(conf, BMap.class, Text.class, Text.class,LongWritable.class, Text.class, false, mapBConf); JobConf reduceConf = new JobConf(false); ...ChainReducer.setReducer(conf, XReduce.class, LongWritable.class, Text.class,Text.class, Text.class, true, reduceConf); ChainReducer.addMapper(conf, CMap.class, Text.class, Text.class,LongWritable.class, Text.class, false, null); ChainReducer.addMapper(conf, DMap.class, LongWritable.class,Text.class, LongWritable.class, LongWritable.class, true, null); FileInputFormat.setInputPaths(conf, inDir);FileOutputFormat.setOutputPath(conf, outDir); ... JobClient jc = new JobClient(conf); RunningJob job =jc.submitJob(conf); ...
值得注意的是:在ChainMapper.addMapper()方法的签名中:
publicstatic <k1,v1,k2,v2> void addMapper(JobConf job,
Class<?
extends Mapper<k1,v1,k2,v2> kclass,
Class<? extends k1> inputKeyClass,
Class<? extends v2> inputValueClass,
Class<?
extends k2> outputKeyClass,
Class<? extends v2> outputValueClass,
boolean byValue,
JobConf mapperConf)
第8个參数为boolean byValue,第一个和最后一个是全局和本地jobconf对象,第二个是mapper类,接下来四个mapper使用的类。
byValue參数:true表示值传递,false表示引用传递。
在标准Mapper中,<k2,v2>是採用值传递被洗牌到不同节点上(传递副本),可是眼下我们能够将mapper与还有一个链接,就在统一个JVM线程运行,就能够採取引用传递。可是一般来说,map1在调用context.write()写出数据后,这些数据是按约定不会更改的。
假设引用传递就会破坏约定。可是使用引用传递会提高效率。假设确定数据不会被破坏。能够设置为false,一般安全起见,设置为true就可以。。
高阶MapReduce_1_链接多个MapReduce作业的更多相关文章
- [Hadoop in Action] 第5章 高阶MapReduce
链接多个MapReduce作业 执行多个数据集的联结 生成Bloom filter 1.链接MapReduce作业 [顺序链接MapReduce作业] mapreduce-1 | mapr ...
- Cloudera Hadoop 5& Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)
1.课程环境 本课程涉及的技术产品及相关版本: 技术 版本 Linux CentOS 6.5 Java 1.7 Hadoop2.0 2.6.0 Hadoop1.0 1.2.1 Zookeeper 3. ...
- 基于Hadoop2.0、YARN技术的大数据高阶应用实战(Hadoop2.0\YARN\Ma
Hadoop的前景 随着云计算.大数据迅速发展,亟需用hadoop解决大数据量高并发访问的瓶颈.谷歌.淘宝.百度.京东等底层都应用hadoop.越来越多的企 业急需引入hadoop技术人才.由于掌握H ...
- ES6中的高阶函数:如同 a => b => c 一样简单
作者:Sequoia McDowell 2016年01月16日 ES6来啦!随着越来越多的代码库和思潮引领者开始在他们的代码中使用ES6,以往被认为是"仅需了解"的ES6特性变成了 ...
- Python学习笔记 - 高阶函数
高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...
- python---内置函数,匿名函数,嵌套函数,高阶函数,序列化
函数简单说明 # 函数即"变量" # 高阶函数 # a.把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码的情况下,为其添加功能) # b.返回值中包含函数名(不修改函 ...
- Linux 高阶命令进阶(一)
Linux 高阶命令进阶 (一)输出重定向 1. > :正确覆盖输出,会覆盖掉原先的文件内容 把文本写入文档中 # vim test ...
- Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器
迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...
- docker 系列 - Dock高阶知识点文章汇集
docker 技术已经研究了一段时间, 基本的知识点和使用场景比较清楚了, 还有一些比较高阶的内容未曾尝试, 将来工作中如果能用到, 再深入研究吧. 这篇博文汇总了一些有用的文章链接. ======= ...
随机推荐
- 把datagrid转换成gridview
public gridview datagrid2gridview(datagrid dg) { gridview gv = new gridview(); foreach(var p in dg.c ...
- BOM 标记
BOM 是 Byte Order Mark 的简称,即字节序标记.用于标记文本流: 表示文本流的字节顺序,是小端序(little-endian)还是大端序(big-endian); 表示文本流是 Un ...
- [ NOIP 2014 ] TG
\(\\\) \(Day\ 1\) \(\\\) \(\#\ A\) \(Rps\) 定义五种方案的石头剪刀布游戏,两人共进行\(N\)局游戏,已知两人各自的循环节和具体方案,胜者得\(1\)分,败者 ...
- Android项目实战_手机安全卫士home界面
# 安全卫士主页面# ###1.GridView控件 1.与ListView的使用方式差不多,也要使用数据适配器,通过设置android:numColumns控制显示几列 2.通过指定android: ...
- hibernate 级联删除报更新失败的问题(org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update)
首先hibernate级联删除的前提是,首先需要在映射文件中配置,配置多表之间的关联关系: 下面以部门表(Dept)和员工表(Emp)为例: 1.在Emp.hbm.xml映射文件中配置many-to- ...
- JS——缓慢动画封装案例
手风琴 1.排他思想 2.ul宽度需要大一点,防止li撑开跑下去 3.一个变大其他所有变小,变小不能太小,不然会出现空白 <!DOCTYPE html> <html lang=&qu ...
- python调用java API
JPype documentation JPype is an effort to allow python programs full access to java class libraries. ...
- 比较简单的替换配置文件的shell脚本
作为测试,日常更新部署测试版本,修改配置文件是每天必不可少的一个工作.特别是如果需要更改的配置文件存在于多个文件里,更是繁琐不堪. 找了一下Linux shell脚本里有个sed 命令可以实现这个需求 ...
- day02-操作系统、编程语言分类及python安装
目录 操作系统 编程语言分类 安装python解释器 操作系统 操作系统有什么用 操作系统能接受外部指令转化成0和1,并把一些对硬件的复杂操作简化成一个个简单的接口,作为中间人连接硬件和软件 计算机三 ...
- if判断,while循环,for循环
if判断 if判断其实就是让计算机模拟人的判断 if if 条件: 代码1 代码2 代码3 ... # 代码块(同一缩进级别的代码,例如代码1.代码2和代码3是相同缩进的代码,这三个代码组合在一起就是 ...