查看原文
其他

原来这就是MapReduce!

Java3y 2021-01-12

以下文章来源于互联网侦察 ,作者channingbreeze

本文公众号来源:互联网侦察   作者:channingbreeze


最近我也在入门大数据相关的基础,这篇文章非常通俗易懂讲解了什么是MapReduce,推荐阅读!


找到工作后的一小段时间是清闲的,小史把新租房收拾利索后,就开始找同学小赵,小李和小王来聚会了。


吃过午饭后,下午没事,四个人一起商量来打升级。打升级要两副扑克牌,小史就去找吕老师借牌去了。



【多几张牌】


吕老师给小史拿出一把牌。


【map-reduce】


(注意,如果有两幅完整的牌,那么小赵手中的黑桃A一定不少于2张,因为其他人手中已经不可能有黑桃A了,图中的数据只是演示。)

【hadoop中的map-reduce】

吕老师:过程看上去很简单,但是要实现并不简单,要考虑很多异常情况,幸好开源项目hadoop已经帮我们实现了这个模型,我们用它很简单就能实现map-reduce

吕老师:hadoop是一个分布式计算平台,我们只要开发map-reduce的作业(job),然后提交到hadoop平台,它就会帮我们跑这个map-reduce的作业啦。

map阶段:

public static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
  protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws java.io.IOException, InterruptedException {
    String card = value.toString();
    context.write(new Text(card), new LongWritable(1L));
  };
}

(友情提示:可左右滑动)


吕老师:申明不用看,主要看map方法,它有三个参数,keyvaluecontext,逻辑也很简单,其实就是用context.write往下游写了一个(card,1)的映射关系。

reduce阶段:

public static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
  protected void reduce(Text key, java.lang.Iterable<LongWritable> values, Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws java.io.IOException, InterruptedException {
    long count = 0L;
    for (LongWritable value : values) {
      count += value.get();
    }
    context.write(key, new LongWritable(count));
  };
}

(友情提示:可左右滑动)

吕老师:reduce也很简单,方法中三个参数,keyvaluescontext,因为到了reduce阶段,一个key可能有多个value,所以这里传进来的是values,函数逻辑其实就是简单地将values累加,然后通过context.write输出。

小史:我明白了,hadoop其实把map-reduce的流程已经固定下来并且实现了,只留给我们自定义map和自定义reduce的接口,而这两部分恰好是和业务强相关的。

小史:也就是说业务方只需要告诉hadoop怎么进行map和怎么进行reducehadoop就能帮我们跑map-reduce的计算任务啦。

【分区函数】

小史:我明白了,这样一来,最后reduce完成之后,我这边多出来的牌全是红心的,其他人多出来的牌也算是同一花色,就不用进行二次统计了,这真是个好办法。

吕老师:没错,这就是分区函数的作用,在hadoop中,虽然shuffle阶段有默认规则,但是我们可以自定义分区函数来改变这个规则,让它更加适合我们的业务。


【合并函数】


吕老师:如果你不合并,那么传给shuffle阶段的就有两个数据,如果你预合并了,那么传给shuffle阶段的就只有一个数据,这样数据量减少了一半。

吕老师:hadoop当然考虑到了这个点,你可以自定义一个合并函数,hadoopmap阶段会调用它对本地数据进行预合并。

【hadoop帮我们做的事情】


吕老师:还有呀,刚才说的分布式系统中网络传输是有成本的,hadoop会帮我们把数据送到最近的节点,尽量减少网络传输。

吕老师:hadoop有两大重大贡献,一个是刚刚讲的map-reduce,另一个是分布式文件系统hdfshdfs可以说是分布式存储系统的基石。其实一般来说,map-reduce任务的输入,也就是那个很大的数据文件,一般都是存在hdfs上的。

【笔记】


小史在往回走的路上,在手机里记录下了这次的笔记。


一、map-reduce的四个关键阶段:file切分、map阶段、shuffle阶段、reduce阶段。


二、hadoop帮我们做了大部分工作,我们只需自定义mapreduce阶段。


三、可以通过自定义分区函数和合并函数控制map-reduce过程的细节。


四、hadoop还有一个叫hdfs的牛逼东西,下次问问吕老师。


【回到房间】






最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

转发到朋友圈是对我最大的支持!

推荐阅读:


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存