hadoop 实战练习_Hadoop实例练习(一)

实现目标:

在对文档进行单词词频计算的同时,对输出结果按单词的词频进行排序

设计思路:

用一个并行计算任务显然是无法同时完成单词词频统计和排序的。为什么无法同时完成呢?

想一下单词词频统计任务的MapReduce过程:

在Map阶段,Mapper将作为输入的n个文档分割为对应的n(或n个以上)个InputSplits,每个InputSplits分配给一个Mapper--> 调用RecordReader将每个InputSplits的每行解析成一个对,key为行号,value为每行的内容--> 调用用户填写的map()函数,对每个进行处理(相当于对文档中的每一行进行处理),把value转换为字符串,根据空格或其他字符进行切割,对每个切割好的单词形成对,key为该单词,value为1,输出到OutputCollector(Hadoop框架提供,专门用来负责收集Mapper和Reducer的输出结果)中-->若定义了combiner,将该Mapper的所有结果按key值(即单词)排序,把相同key值合并,作为Mapper最终的输出结果输出;

Partition根据Mapper的输出将所有key值相同的分配到一个Reducer;

Reducer阶段:对接收到的数据排序,按key值排序--> 调用用户输入的reduce()函数,合并相同key值得value然后输出。过程如下图所示:

上述过程中,在Mapper和Reducer阶段都有按key值(单词)排序的过程,所以在一个job中,要同时完成单词词频统计和按value值排序输出是不可能的,因为排好序后还是会被Mapper和Reducer中的排序过程打乱。

疑问:Partition分配数据时,相同key值得分配到一个Reducer中,有没大小限制?如果相同key值得数据很大很大呢?会不会分配到两个Reducer?所有相同key值得分配到一个Reducer,但一个Reducer中也可能有其他不同key值的?否则实验时得结果说不过去。

为了实现目标,可以分为两个job顺序执行,可以利用Hadoop的任务管道能力,用上一个任务(单词词频统计任务)的输出作为下一个任务(排序)的输入,顺序执行两个并行计算任务。

只需要利用Hadoop自身的排序过程既可以完成排序,问题是Hadoop是根据key值(单词)进行排序的,而我们需要以词频次数,即value值进行排序,所以可以直接使用InverseMapper类,该类的任务就是简单的将key和value值对调,所以只要在第二个job任务中将Mapper类设置为InverseMapper(已经实现好的)即可:sortJob.setMapperClass(InverseMapper.class);

无需指定Reducer类,Hadoop会使用默认的IdentityReducer类,直接输出中间结果;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值