MapReduce中Shuffle机制的学习案例——房屋租赁信息

MapReduce中Shuffle机制的学习案例——房屋租赁信息

由于在《自己动手搭建一个简单的基于Hadoop的离线分析系统》系列中直接将清洗后的数据导入Hive中进行分析,没有使用到Hadoop中的MapReduce框架,因此这篇文章将通过该框架对输入数据进行清洗,并对清洗后的数据经行分析,数据源仍来源于同一网站的网络爬虫
Hadoop版本:2.6.5

Shuffle机制

  上图是MapReduce框架的原理图,其中Shuffle框架指的是“如何将Map阶段处理的数据传递给Reduce阶段”,具体过程是:

  1. 首先,经由Map处理过的信息不是直接写入文件中,而是写入本地的环形缓冲区中。
  2. 当缓冲区发生溢出时,通过键的compareTo方法对键-值对进行快速排序,并进行分区操作(如果配置了Reduce个数和自定义的Partitioner类,默认根据键执行Hash分组),然后写入到本地文件中,这个文件是不断进行滚动的,当产生新的溢出时,将会滚动到下一个文件进行上述操作。
  3. 缓冲区每次产生新的溢出时,新文件将会和旧文件一起进行合并,这里的“合并”是针对各个分区进行归并排序,这个操作在Map执行任务期间会运行多次。
  4. Reduce端将根据自己所属的分区号,从各个Map端的输出中提取出属于自己的一部分键-值对,并对这些来自于不同Map的键-值对进行归并排序,这个过程将会在内存与本地磁盘上执行多次。
  5. 归并排序后的键-值对集合中,相同键(可以根据Grouping进行自定义)的键-值对将作为一个输入被Reduce端进行读取,并做执行后续操作。

案例任务与相关类

1. 输入数据
房屋详细租赁信息,例如:

北京市	北京市	海淀区	338(总租金)	45(房屋面积)	2(居住人数)	北京市海淀区复兴路61号院	地铁万寿路直达天安门、301医院、美尔目医院

2. 输出数据
各个区/县的最高租金与详细租赁信息、最低租金与详细租赁信息、平均租金(元/人),并按照所属省进行归类输出,例如:

MAXINFO:北京市 北京市 东城区 398(总租金) 46(房屋面积) 2(居住人数) 北京市东城区广渠门夕照寺中街绿景苑小区六号一单元四楼 199.0(人均租金)
MININFO:北京市 北京市 东城区 520(总租金) 90(房屋面积) 7(居住人数) 北京市东城区冠城名敦道 74.28571(人均租金)
MEANPRICE:115.69858(人均租金)

3. Map类(M3RentinfoMapper)
将输入数据根据所需字段进行切分,切分后的信息封装为一个自定义类(RentinfoBean),自定义键(ComparableBean)并实现排序方法,将ComparableBean与RentinfoBean作为键-值对进行输出,例如:

ComparableBean [city=上海市, zone=浦东新区, priceforone=91.6]	上海市 上海市 浦东新区 458(总租金) 60(房屋面积) 5(居住人数) 上海市浦东新区陆家嘴街道钱仓路313弄

4. Reduce类(M3RentinfoReducer)
将输入数据进行相应处理,得到输出数据。

5. Shuffle相关类
自定义分区Partitioner类(PartitionBean)
自定义GroupingComparator类(GroupingBean)

自定义键的排序方法、Partitioner、GroupingComparator

自定义键的排序方法

  MapReduce程序在处理数据的过程中会对数据排序(例如,Map输出的键-值对传输到Reduce端之前,会进行排序),排序的依据是Map输出的键,所以,我们如果要自定义排序方法,可以考虑将排序因素放到键中,让键实现 W r i t a b l e C o m p a r a b l e WritableComparable WritableComparable接口。
  基本思路:自定义的类 C o m p a r a b l e B e a n ComparableBean ComparableBean实现 W r i t a b l e C o m p a r a b l e WritableComparable WritableComparable接口并封装排序所需信息,然后重写键的 c o m p a r e T o compareTo compareTo方法,并将该类作为Map输出的键。由于需要根据不同省对各自区\县的租金(元/人)进行分析,因此需要将市(city)、区/县(zone)和租金(priceforone)封装到 C o m p a r a b l e B e a n ComparableBean ComparableBean中。

package bean;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

public class ComparableBean implements WritableComparable<ComparableBean> {
   

	//设置key中包含的字段:市、区、价格/人
	private String c
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值