原文:http://www.sohu.com/a/287135829_818692

小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了。

对小史面试情况感兴趣的同学可以观看面试现场系列。

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

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

【多几张牌】

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

【map-reduce】

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

【hadoop中的map-reduce】

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

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

map阶段:

publicstaticclassMyMapperextendsMapper<LongWritable, Text, Text, LongWritable> {

protectedvoidmap(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)throwsjava.io.IOException, InterruptedException {

String card = value.toString();

context.write( newText(card), newLongWritable( 1L));

};

}

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

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

reduce阶段:

publicstaticclassMyReducerextendsReducer<Text, LongWritable, Text, LongWritable> {

protectedvoidreduce(Text key, java.lang.Iterable<LongWritable> values, Reducer<Text, LongWritable, Text, LongWritable>.Context context)throwsjava.io.IOException, InterruptedException {

longcount = 0L;

for(LongWritable value : values) {

count += value.get();

}

context.write(key, newLongWritable(count));

};

}

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

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

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

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

【分区函数】

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

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

【合并函数】

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

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

【hadoop帮我们做的事情】

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

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

【笔记】

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

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

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

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

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

【回到房间】

生活现场是互联网侦察推出的现场系列中的另一个板块,旨在通过生活中的场景,来解释大数据微服务技术中的基本原理,希望对大家学习技术原理有所帮助。

【生活现场】从打牌到map-reduce工作原理解析(转)的更多相关文章

  1. jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)

    jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一) 线程池介绍 在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在 ...

  2. Map/Reduce 工作机制分析 --- 数据的流向分析

    前言 在MapReduce程序中,待处理的数据最开始是放在HDFS上的,这点无异议. 接下来,数据被会被送往一个个Map节点中去,这也无异议. 下面问题来了:数据在被Map节点处理完后,再何去何从呢? ...

  3. 第十篇:Map/Reduce 工作机制分析 - 数据的流向分析

    前言 在MapReduce程序中,待处理的数据最开始是放在HDFS上的,这点无异议. 接下来,数据被会被送往一个个Map节点中去,这也无异议. 下面问题来了:数据在被Map节点处理完后,再何去何从呢? ...

  4. Map/Reduce 工作机制分析 --- 作业的执行流程

    前言 从运行我们的 Map/Reduce 程序,到结果的提交,Hadoop 平台其实做了很多事情. 那么 Hadoop 平台到底做了什么事情,让 Map/Reduce 程序可以如此 "轻易& ...

  5. 第九篇:Map/Reduce 工作机制分析 - 作业的执行流程

    前言 从运行我们的 Map/Reduce 程序,到结果的提交,Hadoop 平台其实做了很多事情. 那么 Hadoop 平台到底做了什么事情,让 Map/Reduce 程序可以如此 "轻易& ...

  6. Servlet 工作原理解析

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 J ...

  7. [转]Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

  8. Servlet 工作原理解析--转载

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/index.html?ca=drs- Web 技术成为当今主流的互联网 Web 应用 ...

  9. 【Java】Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

随机推荐

  1. Linux文件共享服务 FTP,NFS 和 Samba

    Linux 系统中,存储设主要有下面几种: DAS DAS 指 Direct Attached Storage,即直连附加存储,这种设备直接连接到计算机主板总线上,计算机将其识别为一个块设备,例如常见 ...

  2. DesignPattern系列__07合成复用原则

    基本介绍 合成复用原则的核心,就是尽量去使用组合.聚合等方式,而不是使用继承. 核心思想 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是 ...

  3. 构建maven项目,自定义目录结构方法

    构建maven项目 创建自定义的文件目录方法: 在项目名称右键-->Builder Path-->Configure Builder Path...Source菜单下的Add Folder ...

  4. Gradle 创建java程序详细步骤

    Java构建工具三强: Ant, Maven, GradleAnt历史悠久, 用build.xml 描述, 当时他的xml着实让很多工程师头痛, 但仍有用武之地. Maven 用pom.xml 文件描 ...

  5. tornado 之 RequestHandler(请求)

    RequestHandler from tornado.web import ReuqestHandler 一.利用HTTP协议想服务器传递参数 提取url的特定部分 http://127.0.0.1 ...

  6. Redis缓存实战教程

    目录 Redis缓存 使用缓存Redis解决首页并发问题 1.缓存使用的简单设计 2.Redis的整合步骤 A 将Redis整合到项目中(Redis+Spring) B 设计一个数据存储策越 3.Re ...

  7. 2.3 Scala面向对象编程基础

    一.类 1.类的定义 Unit表示什么都不返回 方法体最后一句的值,就是方法的返回值. 2.类成员的可见性 3.方法的定义方式 定义方法的时候加圆括号,调用时可以加圆括号c.getValue()也可以 ...

  8. yum总结

    yum企业案例          yum命令工具参数详解 yum install httpd 安装httpd软件包 yum search YUM搜索软件包 yum list httpd 显示指定程序包 ...

  9. ReportMachine打印条形码的问题

    ReportMachine打印条形码的问题 最近用RM报表来打印条形码,调试过程非常顺利,扫描枪识别也很正常,唯独斑马打印机的走纸不准确是个问题,正好客户不想用这种纸型,并定制了新纸型,心想等新纸型到 ...

  10. 微信小程序 - 事件 | 传递 | 冒泡

    事件 常见的事件有: 类型 触发条件 最低版本 touchstart 手指触摸动作开始   touchmove 手指触摸后移动   touchcancel 手指触摸动作被打断,如来电提醒,弹窗   t ...