多个Mapper和Reducer的Job
多个Mapper和Reducer的Job
@(Hadoop)
对于复杂的mr任务来说,只有一个map和reduce往往是不能够满足任务需求的,有可能是需要n个map之后进行reduce,reduce之后又要进行m个map。
在hadoop的mr编程中可以使用ChainMapper和ChainReducer来实现链式的Map-Reduce任务。
ChainMapper
以下为官方API文档翻译:
ChainMapper类允许在单一的Map任务中使用多个Mapper来执行任务,这些Mapper将会以链式或者管道的形式来调用。
第一个Mapper的输出即为第二个Mapper的输入,以此类推,直到最后一个Mapper则为任务的输出。
这个特性的关键功能在于,在链中的Mappers不必知道他们是否已经被执行,这可以在一个单一的任务中让一些Mapper进行重用,组合在一起完成复杂的操作。
使用的时候需要注意,每个Mapper的输出都会在下一个Mapper的输入中进行验证,这里假设所有的Mapper和Reduce都使用相匹配的key和value作为输入和输出,因为在链式执行的代码中并没有对其进行转换。
使用ChainMapper和ChainReducer可以将Map-Reduce任务组合成[MAP+ / REDUCE MAP*]的形式,这个模式最直接的好处就是可以大大减少磁盘的IO开销。
注意:没有必要为ChainMapper指定输出的key和value的类型,使用addMapper方法添加最后一个Mapper的时候回自动完成。
使用的格式:
Job = new Job(conf);
//mapA的配置,如果不是特殊配置可传入null或者共用一个conf
Configuration mapAConf = new Configuration(false);
//将Mapper加入执行链中
ChainMapper.addMapper(job, AMap.class, LongWritable.class, Text.class,
Text.class, Text.class, true, mapAConf);
Configuration mapBConf = new Configuration(false);
ChainMapper.addMapper(job, BMap.class, Text.class, Text.class,
LongWritable.class, Text.class, false, mapBConf);
job.waitForComplettion(true);
addMapper函数的定义如下:
public static void addMapper(Job job,
Class<? extends Mapper> klass,
Class<?> inputKeyClass,
Class<?> inputValueClass,
Class<?> outputKeyClass,
Class<?> outputValueClass,
Configuration mapperConf)
throws IOException
ChainReducer
基本描述同ChainMapper。
对于每条reduce输出的数据,Mappers将会以链或者管道的形式调用。 ?
ChainReducer有两个基本函数可以调用,使用格式:
Job = new Job(conf);
Configuration reduceConf = new Configuration(false);
//这里是在setReducer之后才调用addMapper
ChainReducer.setReducer(job, XReduce.class, LongWritable.class, Text.class,
Text.class, Text.class, true, reduceConf);
ChainReducer.addMapper(job, CMap.class, Text.class, Text.class,
LongWritable.class, Text.class, false, null);
ChainReducer.addMapper(job, DMap.class, LongWritable.class, Text.class,
LongWritable.class, LongWritable.class, true, null);
job.waitForCompletion(true);
setReducer定义:
public static void setReducer(Job job,
Class<? extends Reducer> klass,
Class<?> inputKeyClass,
Class<?> inputValueClass,
Class<?> outputKeyClass,
Class<?> outputValueClass,
Configuration reducerConf)
addMapper定义同ChainMapper。
实际的测试过程
在demo程序测试中观察结果得到两条比较有用的结论:
- 对于reduce之后添加的Mapper,每条reduce的输出都会马上调用一次该map函数,而不是等待reduce全部完成之后再调用map,如果是有多个map,应该是一样的道理。
- reduce之后的Mapper只执行map过程,并不会有一个完整map阶段(如,map之后的排序,分组,分区等等都没有了)。
**另注:**reduce之前设置多个Mapper使用ChainMapper的addMapper,reduce之后设置多个Mapper使用ChainReducer的addMapper。
多个job连续运行
有时候链式的设置多个Mapper仍然无法满足需求,例如,有时候我们需要多个reduce过程,或者map之后的分组排序等,这就需要多个job协同进行工作。
使用的方法很简单,直接在第一个job.waitForCompletion之后再次实例化一个Job对象,按照八股文的格式进行设置即可,注意输入和输出的路径信息。
example:
Job newJob = Job.getInstance(conf, jobName + "-sort");
newJob.setJarByClass(jarClass);
FileInputFormat.setInputPaths(newJob, new Path(outPath + "/part-*"));
newJob.setInputFormatClass(TextInputFormat.class);
newJob.setMapperClass(SortMapper.class);
newJob.setMapOutputKeyClass(SortKey.class);
newJob.setMapOutputValueClass(NullWritable.class);
FileOutputFormat.setOutputPath(newJob, new Path(outPath + "/sort"));
newJob.setOutputFormatClass(TextOutputFormat.class);
newJob.waitForCompletion(true);
作者:@小黑
多个Mapper和Reducer的Job的更多相关文章
- 关于Mapper、Reducer的个人总结(转)
Mapper的处理过程: 1.1. InputFormat 产生 InputSplit,并且调用RecordReader将这些逻辑单元(InputSplit)转化为map task的输入.其中Inpu ...
- Hadoop(十七)之MapReduce作业配置与Mapper和Reducer类
前言 前面一篇博文写的是Combiner优化MapReduce执行,也就是使用Combiner在map端执行减少reduce端的计算量. 一.作业的默认配置 MapReduce程序的默认配置 1)概述 ...
- Mapper 与 Reducer 解析
1 . 旧版 API 的 Mapper/Reducer 解析 Mapper/Reducer 中封装了应用程序的数据处理逻辑.为了简化接口,MapReduce 要求所有存储在底层分布式文件系统上的数据均 ...
- MapReduce之Mapper类,Reducer类中的函数(转载)
Mapper类4个函数的解析 Mapper有setup(),map(),cleanup()和run()四个方法.其中setup()一般是用来进行一些map()前的准备工作,map()则一般承担主要的处 ...
- Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍
在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法.如下所示: 其方法的调用方式是在run方法中,如下所示: ...
- 027_编写MapReduce的模板类Mapper、Reducer和Driver
模板类编写好后写MapReduce程序,的模板类编写好以后只需要改参数就行了,代码如下: package org.dragon.hadoop.mr.module; import java.io.IOE ...
- [hadoop入门]mapper与reducer(word_count计数demo)
1.mapper #!/usr/bin/env python import sys for line in sys.stdin: line = line.strip() words = line.sp ...
- hadoop2.7之Mapper/reducer源码分析
一切从示例程序开始: 示例程序 Hadoop2.7 提供的示例程序WordCount.java package org.apache.hadoop.examples; import java.io.I ...
- 【Hadoop】Combiner的本质是迷你的reducer,不能随意使用
问题提出: 众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value>键值对,再网络节点间对其进行整理(shuffle),然后使用Reducer处理数据并进行最终输出 ...
随机推荐
- vuex 操作姿势
Vuex 应用的核心就是 store,它包含着你的应用中大部分的状态 (state) 你不能直接改变 store 中的状态.改变 store 中的状态的唯一途径就是显式地提交 (commit) mut ...
- Java 接口和抽象类--缺省模式
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...
- spring完成自动装配
让spring完成自动装配 Autowiring 解决标签为javaBean注入时难以维护而实现的 下面是几种autowire type的说明: 1,byname:试图在容器中寻找和需要自动装配的属性 ...
- Python中__new__()方法的使用和实例化
new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,new()决 ...
- FastReport.Net使用:[1]屏蔽打印对话框
1.如何设置默认打印机 在FastReport设计界面找到File->Printer Setup菜单,运行该菜单显示“打印机设置”对话框.在打印机(Printer)列表中选择默认打印机,并勾上“ ...
- HDU 1698 Just a Hook (线段树)
Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...
- BZOJ 1395 [Baltic2005]Trip(最短路+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1354 [题目大意] 给出一些车的班次,包括起点,终点,到达起点时间区间, 到达终点时间 ...
- 工作中用到的git命令
1.git stash 将本地的修改藏匿,不进行commit也可切换分支 2.git stash apply 将之前藏匿的修改恢复出来 3.git cherry-pick commitId git在当 ...
- bzoj 1098
对于关系,看其是否是“等价关系”,即满足:自反,传递,对称. 如果是可以用并查集来连接等价类. 这道题是求原图补集的联通快个数,考虑原图度最少的点(由鸽巢原理,最多为2*e/n个). 先将未与其连边的 ...
- bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 -- 贪心
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MB Description 一天有 ...