分享

让你真正明白什么是MapReduce组合式,迭代式,链式

 
howtodown 2014-4-18 15:23:33 发表于 概念型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 23 84955
问题导读:

能够到这一步,说明已经对hadoop入门,并且产生问题。这个问题,似乎困惑了不少初学者。

1.比如我们输出的mapreduce结果,需要进入下一个mapreduce,该怎么解决?
可以使用迭代式
2.那么什么是迭代式?
3.什么是依赖式?
4.什么是链式?
5.三种模式各自的应用场景是什么?



网上不少资料,但是对于新手,很难辨认,这里给大家指出这里面的关键点:

1.迭代式mapreduce
        一些复杂的任务难以用一次MapReduce处理完成,需要多次 MapReduce 才能完成任务,例如Pagrank,K-means算法都需要多次的迭代,关于 MapReduce 迭代在Mahout中运用较多。有兴趣的可以参考一下Mahout的源码。
             在MapReduce的迭代思想,类似for循环,前一个 MapReduce的输出结果,作为下一个 MapReduce的输入,任务完成后中间结果都可以删除。
        代码示例:

  1. Configuration conf1 = new Configuration();
  2. Job job1 = new Job(conf1,"job1");
  3. .....
  4. FileInputFormat.addInputPath(job1,InputPaht1);
  5. FileOutputFromat.setOoutputPath(job1,Outpath1);
  6. job1.waitForCompletion(true);
  7. //sub Mapreduce
  8. Configuration conf2 = new Configuration();
  9. Job job2 = new Job(conf1,"job1");
  10. .....
  11. FileInputFormat.addInputPath(job2,Outpath1);
  12. FileOutputFromat.setOoutputPath(job2,Outpath2);
  13. job2.waitForCompletion(true);
  14. //sub Mapreduce
  15. Configuration conf3 = new Configuration();
  16. Job job3 = new Job(conf1,"job1");
  17. .....
  18. FileInputFormat.addInputPath(job3,Outpath2);
  19. FileOutputFromat.setOoutputPath(job3,Outpath3);
  20. job3.waitForCompletion(true);
  21. .....
复制代码

关键点:
上面满眼的代码,下面列出关键代码:
第一个job的输出路径为Outpath1
FileOutputFromat.setOoutputPath(job1,Outpath1);

第二个job的输入路径为Outpath1,输出路径为Outpath2
FileInputFormat.addInputPath(job2,Outpath1);
FileOutputFromat.setOoutputPath(job2,Outpath2);

第三个job的输入路径为Outpath2
FileInputFormat.addInputPath(job3,Outpath2);
换句话说:第一个job的输出路径为第二个job的输入路径,以此类推。

上面采用的是一种直线式,那么他们能不能更省事,成为循环样式
成为循环式,是可以的,但是有不少需要解决的问题:这里只是举例,你可能还会碰到其它问题。
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()方法即可运行程序。

下面给出伪代码:

  1. Configuration job1conf = new Configuration();
  2. Job job1 = new Job(job1conf,"Job1");
  3. .........//job1 其他设置
  4. Configuration job2conf = new Configuration();
  5. Job job2 = new Job(job2conf,"Job2");
  6. .........//job2 其他设置
  7. Configuration job3conf = new Configuration();
  8. Job job3 = new Job(job3conf,"Job3");
  9. .........//job3 其他设置
  10. job3.addDepending(job1);//设置job3和job1的依赖关系
  11. job3.addDepending(job2);
  12. JobControl JC = new JobControl("123");
  13. JC.addJob(job1);//把三个job加入到jobcontorl中
  14. JC.addJob(job2);
  15. JC.addJob(job3);
  16. JC.run();
复制代码

关键点:

下面代码: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,假设在统计单词是,会出现这样的词,make,made,making等,他们都属于一个词,在单词累加的时候,都归于一个词。解决的方法为用一个单独的Mapreduce任务可以实现,单增加了多个Mapreduce作业,将增加整个作业处理的周期,还增加了I/O操作,因而处理效率不高。

一个较好的办法就是在核心的MapReduce之外,增加一个辅助的Map过程,然后将这个辅助的Map过程和核心的Mapreudce过程合并为一个链式的Mapreduce,从而完成整个作业。hadoop提供了专门的链式ChainMapper和ChainReducer来处理链式任务,ChainMapper允许一个Map任务中添加多个Map的子任务,ChainReducer可以在Reducer执行之后,在加入多个Map的子任务。其调用形式如下:

  1. ChainMapper.addMapper(...);
  2.     ChainReducer.addMapper(...);
  3.     //addMapper()调用的方法形式如下:
  4.     public static void addMapper(JOb job,
  5.             Class<? extends Mapper> mclass,
  6.             Class<?> inputKeyClass,
  7.             Class<?> inputValueClass,
  8.             Class<?> outputKeyClass,
  9.             Class<?> outputValueClass,
  10.             Configuration conf
  11.     ){
  12.     }
复制代码

其中,ChainReducer专门提供了一个setRreducer()方法来设置整个作业唯一的Reducer。

note:这些Mapper和Reducer之间传递的键和值都必须保持一致。

下面举个例子:用ChainMapper把Map1加如并执行,然后用ChainReducer把Reduce和Map2加入到Reduce过程中。代码如下:Map1.class 要实现map方法

  1. public void function throws IOException {
  2.         Configuration conf = new Configuration();
  3.         Job job = new Job(conf);
  4.         job.setJobName("ChianJOb");
  5.         // 在ChainMapper里面添加Map1
  6.         Configuration map1conf = new Configuration(false);
  7.         ChainMapper.addMapper(job, Map1.class, LongWritable.class, Text.class,
  8.                 Text.class, Text.class, true, map1conf);
  9.         // 在ChainReduce中加入Reducer,Map2;
  10.         Configuration reduceConf = new Configuration(false);
  11.         ChainReducer.setReducer(job, Reduce.class, LongWritable.class,
  12.                 Text.class, Text.class, Text.class, true, map1conf);
  13.         Configuration map2Conf = new Configuration();
  14.         ChainReducer.addMapper(job, Map2.class, LongWritable.class, Text.class,
  15.                 Text.class, Text.class, true, map1conf);
  16.         job.waitForCompletion(true);
  17.     }
复制代码

关键点:
链式,那么什么是链式,链式是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);









本帖被以下淘专辑推荐:

已有(23)人评论

跳转到指定楼层
InSight 发表于 2014-10-7 20:39:02
写的很详细,关键点都给出来了。感谢分享。、
回复

使用道具 举报

轩辕依梦Q 发表于 2014-10-21 15:27:17
谢谢版主分享
回复

使用道具 举报

ruguoaaa 发表于 2014-11-7 18:11:01
谢谢lz,我收藏了
回复

使用道具 举报

wjhdtx 发表于 2014-11-14 16:56:42
先感谢分享,我的理解是不是ChainMapper、ChainReducer可以简单的取代oozie了?
回复

使用道具 举报

bioger_hit 发表于 2014-11-14 17:13:51
wjhdtx 发表于 2014-11-14 16:56
先感谢分享,我的理解是不是ChainMapper、ChainReducer可以简单的取代oozie了?
两个是有所相似的,但是取代谈不上。
条件允许,可以使用oozie。
有点类似,一个是工业化(oozie),一个手工
回复

使用道具 举报

wjhdtx 发表于 2014-11-14 17:26:12
回复

使用道具 举报

goo 发表于 2014-12-29 11:03:50
回复

使用道具 举报

strivecheng 发表于 2015-1-4 09:55:07
真心涨姿势了,感谢楼主的讲解,豁然开朗
回复

使用道具 举报

howtodown 发表于 2015-1-5 01:51:00
goo 发表于 2014-12-29 11:03
我是新手,第三个例子没看懂,链式结构怎么解决单词变形统计的啊?希望大神具体解释,再次膜拜{:soso_e196: ...
链式单独拿出一个map来处理make、made等,处理完毕,一块到reduce里。

回复

使用道具 举报

123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条