大数据学习记录(day4)-Hadoop之MapReduce的执行方式
来源:互联网 发布:土地沙漠化数据 编辑:程序博客网 时间:2024/05/29 03:16
学习来源:http://www.aboutyun.com/forum.PHP?mod=viewthread&tid=5541&highlight=Hadoop
http://www.aboutyun.com/thread-7435-1-1.html
说明:由于参考资料大多是2013年以前的,所以有些说法也许并不成立,请读者选择性吸收。
问题导读:
1.比如我们输出的mapreduce结果,需要进入下一个mapreduce,该怎么解决?
可以使用迭代式
2.那么什么是迭代式?
3.什么是依赖式?
4.什么是链式?
5.三种模式各自的应用场景是什么?
网上不少资料,但是对于新手,很难辨认,本文指出了这里面的关键点。
可以使用迭代式
2.那么什么是迭代式?
3.什么是依赖式?
4.什么是链式?
5.三种模式各自的应用场景是什么?
网上不少资料,但是对于新手,很难辨认,本文指出了这里面的关键点。
1.迭代式mapreduce
一些复杂的任务难以用一次MapReduce处理完成,需要多次 MapReduce 才能完成任务,例如Pagrank,K-means算法都需要多次的迭代,关于 MapReduce 迭代在Mahout中运用较多。有兴趣的可以参考一下Mahout的源码。
在MapReduce的迭代思想,类似for循环,前一个 MapReduce的输出结果,作为下一个 MapReduce的输入,任务完成后中间结果都可以删除。
代码示例:
一些复杂的任务难以用一次MapReduce处理完成,需要多次 MapReduce 才能完成任务,例如Pagrank,K-means算法都需要多次的迭代,关于 MapReduce 迭代在Mahout中运用较多。有兴趣的可以参考一下Mahout的源码。
在MapReduce的迭代思想,类似for循环,前一个 MapReduce的输出结果,作为下一个 MapReduce的输入,任务完成后中间结果都可以删除。
代码示例:
Configuration conf1 = new Configuration();Job job1 = new Job(conf1,"job1");.....FileInputFormat.addInputPath(job1,InputPaht1);FileOutputFromat.setOoutputPath(job1,Outpath1);job1.waitForCompletion(true);//sub MapreduceConfiguration conf2 = new Configuration();Job job2 = new Job(conf2,"job2");.....FileInputFormat.addInputPath(job2,Outpath1);FileOutputFromat.setOoutputPath(job2,Outpath2);job2.waitForCompletion(true);//sub MapreduceConfiguration conf3 = new Configuration();Job job3 = new Job(conf3,"job3");.....FileInputFormat.addInputPath(job3,Outpath2);FileOutputFromat.setOoutputPath(job3,Outpath3);job3.waitForCompletion(true);.....
上面满眼的代码,下面列出关键代码:
(1) 第一个job的输出路径为Outpath1
FileOutputFromat.setOoutputPath(job1,Outpath1);
(1) 第一个job的输出路径为Outpath1
FileOutputFromat.setOoutputPath(job1,Outpath1);
(2)第二个job的输入路径为Outpath1,输出路径为Outpath2
FileInputFormat.addInputPath(job2,Outpath1);
FileOutputFromat.setOoutputPath(job2,Outpath2);
FileInputFormat.addInputPath(job2,Outpath1);
FileOutputFromat.setOoutputPath(job2,Outpath2);
(3)第三个job的输入路径为Outpath2
FileInputFormat.addInputPath(job3,Outpath2);
换句话说:第一个job的输出路径为第二个job的输入路径,以此类推。
FileInputFormat.addInputPath(job3,Outpath2);
换句话说:第一个job的输出路径为第二个job的输入路径,以此类推。
上面采用的是一种直线式,那么他们能不能更省事,成为循环样式。
成为循环式,是可以的,但是有不少需要解决的问题:这里只是举例,你可能还会碰到其它问题。
(1)需要他们的key,value等值是完全一致的,也就是说两个job或则说job之间必须是一致的。
(2)输入输出路径需要区分等。
成为循环式,是可以的,但是有不少需要解决的问题:这里只是举例,你可能还会碰到其它问题。
(1)需要他们的key,value等值是完全一致的,也就是说两个job或则说job之间必须是一致的。
(2)输入输出路径需要区分等。
2.依赖关系组合式MapReduce
我们可以设想一下MapReduce有3个子任务job1,job2,job3构成,其中job1和job2相互独立,job3要在job1和job2完成之后才执行。这种关系就叫复杂数据依赖关系的组合时mapreduce。hadoop为这种组合关系提供了一种执行和控制机制,hadoop通过job和jobControl类提供具体的编程方法。Job除了维护子任务的配置信息,还维护子任务的依赖关系,而jobControl控制整个作业流程,把所有的子任务作业加入到JobControl中,执行JobControl的run()方法即可运行程序。
下面给出伪代码:
Configuration job1conf = new Configuration();Job job1 = new Job(job1conf,"Job1");.........//job1 其他设置Configuration job2conf = new Configuration();Job job2 = new Job(job2conf,"Job2");.........//job2 其他设置Configuration job3conf = new Configuration();Job job3 = new Job(job3conf,"Job3");.........//job3 其他设置job3.addDepending(job1);//设置job3和job1的依赖关系job3.addDepending(job2);JobControl JC = new JobControl("123");JC.addJob(job1);//把三个job加入到jobcontorl中JC.addJob(job2);JC.addJob(job3);JC.run();
关键点:
下面代码:addDepending()这个函数,作用的是建立两个job之间的依赖关系。那么如何建立,看下面两行
下面代码:addDepending()这个函数,作用的是建立两个job之间的依赖关系。那么如何建立,看下面两行
//下面面代码的作用是设置job3和job1的依赖关系job3.addDepending(job1);//下面代码的作用是设置job3和job2的依赖关系job3.addDepending(job2);
建立依赖关系之后,还有一步骤,也就是还有一个类需要我们了解JobControl,通过这个类来控制他们之间的依赖关系。如何做到,通过下面代码:
//实例化JobControl JC = new JobControl("123");//把三个job加入到jobcontorl中JC.addJob(job1);JC.addJob(job2);JC.addJob(job3);JC.run();
3.链式MapReduce
首先看一下例子,来说明为什么要有链式MapReduce。
首先看一下例子,来说明为什么要有链式MapReduce。
假设在统计单词是,会出现这样的词,make,made,making等,他们都属于一个词,在单词累加的时候,都归于一个词。解决的方法为用一个单独的Mapreduce任务可以实现,单增加了多个Mapreduce作业,将增加整个作业处理的周期,还增加了I/O操作,因而处理效率不高。
一个较好的办法就是在核心的MapReduce之外,增加一个辅助的Map过程,然后将这个辅助的Map过程和核心的Mapreudce过程合并为一个链式的Mapreduce,从而完成整个作业。hadoop提供了专门的链式ChainMapper和ChainReducer来处理链式任务,ChainMapper允许一个Map任务中添加多个Map的子任务,ChainReducer可以在Reducer执行之后,在加入多个Map的子任务。其调用形式如下:
一个较好的办法就是在核心的MapReduce之外,增加一个辅助的Map过程,然后将这个辅助的Map过程和核心的Mapreudce过程合并为一个链式的Mapreduce,从而完成整个作业。hadoop提供了专门的链式ChainMapper和ChainReducer来处理链式任务,ChainMapper允许一个Map任务中添加多个Map的子任务,ChainReducer可以在Reducer执行之后,在加入多个Map的子任务。其调用形式如下:
ChainMapper.addMapper(...); ChainReducer.addMapper(...); //addMapper()调用的方法形式如下: public static void addMapper(JOb job, Class<? extends Mapper> mclass, Class<?> inputKeyClass, Class<?> inputValueClass, Class<?> outputKeyClass, Class<?> outputValueClass, Configuration conf ){ }
其中,ChainReducer专门提供了一个setRreducer()方法来设置整个作业唯一的Reducer。
note:这些Mapper和Reducer之间传递的键和值都必须保持一致。
下面举个例子:用ChainMapper把Map1加如并执行,然后用ChainReducer把Reduce和Map2加入到Reduce过程中。代码如下:Map1.class 要实现map方法
note:这些Mapper和Reducer之间传递的键和值都必须保持一致。
下面举个例子:用ChainMapper把Map1加如并执行,然后用ChainReducer把Reduce和Map2加入到Reduce过程中。代码如下:Map1.class 要实现map方法
public void function throws IOException { Configuration conf = new Configuration(); Job job = new Job(conf); job.setJobName("ChianJOb"); // 在ChainMapper里面添加Map1 Configuration map1conf = new Configuration(false); ChainMapper.addMapper(job, Map1.class, LongWritable.class, Text.class, Text.class, Text.class, true, map1conf); // 在ChainReduce中加入Reducer,Map2; Configuration reduceConf = new Configuration(false); ChainReducer.setReducer(job, Reduce.class, LongWritable.class, Text.class, Text.class, Text.class, true, map1conf); Configuration map2Conf = new Configuration(); ChainReducer.addMapper(job, Map2.class, LongWritable.class, Text.class, Text.class, Text.class, true, map1conf); job.waitForCompletion(true); }
关键点:
链式,那么什么是链式,链式是mapreduce中存在多个map.
那么是怎么实现的?通过链式ChainMapper和ChainReducer实现。
ChainMapper允许一个Map任务中添加多个Map的子任务,ChainReducer可以在Reducer执行之后,在加入多个Map的子任务。
下面为ChainMapper、ChainReducer:的具体实现。
链式,那么什么是链式,链式是mapreduce中存在多个map.
那么是怎么实现的?通过链式ChainMapper和ChainReducer实现。
ChainMapper允许一个Map任务中添加多个Map的子任务,ChainReducer可以在Reducer执行之后,在加入多个Map的子任务。
下面为ChainMapper、ChainReducer:的具体实现。
ChainMapper.addMapper(job, Map1.class, LongWritable.class, Text.class,Text.class, Text.class, true, map1conf);ChainReducer.addMapper(job, Map2.class, LongWritable.class, Text.class,Text.class, Text.class, true, map1conf);
小结:
今天学习了MapReduce的三种工作方式,通过代码解析的方式对MapReduce的迭代式、依赖式和链式工作方式做了说明。
阅读全文
0 0
- 大数据学习记录(day4)-Hadoop之MapReduce的执行方式
- 大数据学习记录(day3)-Hadoop之MapReduce原理
- 大数据之hadoop[MapReduce]学习 笔记
- 大数据学习笔记之二十八 Hadoop的第一代MapReduce MRV1
- 大数据学习笔记之二十九 Hadoop的第二代MapReduce YARN
- 大数据hadoop学习记录
- (大数据之MapReduce) Hadoop作业提交分析(四)
- 大数据学习记录(day6)-图说Mapreduce工作机制
- 大数据学习记录(day5)-Hadoop之Mapper类和Reducer类代码学习
- 大数据(七)Hadoop-MapReduce
- 大数据学习笔记之四 MapReduce的核心思想
- 大数据时代之hadoop(五):hadoop 分布式计算框架(MapReduce)
- 大数据时代之hadoop(五):hadoop 分布式计算框架(MapReduce)
- HBase导入大数据三大方式之(三)——mapreduce+completebulkload 方式
- 大数据学习记录(day2)-Hadoop概述
- 大数据学习之MapReduce篇
- 大数据学习笔记之MapReduce
- hadoop 里执行 MapReduce 任务的几种常见方式
- SQL分页存储过程和C#中linq分页查询方法
- eclipse运行快捷键
- Day 8 linux基础命令练习五
- linux线程系列(2)linux线程分类
- c#+sql事务处理
- 大数据学习记录(day4)-Hadoop之MapReduce的执行方式
- 第3课
- 粒子滤波--总体流程
- Effective Objective-- 第一章
- jQuery选择器
- CNN、RNN与LSTM
- spring同父接口下装配不同bean的解决方案
- 增量式记录QT学习
- Tomcat的Https设置及Http自动跳转Https