原文: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. 前端开发JS——引用类型

    10.流程控制语句      注:var obj = {}:这里的obj转换boolean语句为true   if语句和java是一样的,判断条件也是根据上篇博客提到的假性值 // 弹出一个带输入框的 ...

  2. js javascript 如何获取某个值在数组中的下标

    js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...

  3. 【Java】简体中文、繁体中文转换

    项目中用到繁体中文语言适配,目前已经有开源的框架可以将简体中文转换成繁体中文,在此基础上封装了一个工具类,可以直接将简体中文的strings.xml转换成繁体中文的strings.xml. 引用Jar ...

  4. 设置VMware中Kali 共享文件夹

    (软件环境: Vmware Workstation 15.5 Pro , Kali Linux2019.3) 1. VMware设置共享目录 2. 安装VMware-Tools 命令: apt-get ...

  5. 使用git的几个常用指令

    1. 移除git:rm -rf .git/ 2.查看结果:ls -al 3.语法糖(查看列表):ll 4.将远程库的内容,更新到本地:git pull origin master: 5.添加到本地仓库 ...

  6. 04.UTXO:未使用的交易输出,比特币核心概念之一

    在比特币系统上其实并不存在“账户”,而只有“地址”.只要你愿意,你就可以在比特币区块链上开设无限多个钱包地址,你拥有的比特币数量是你所有的钱包地址中比特币的总和.比特币系统并不会帮你把这些地址汇总起来 ...

  7. 动态规划算法模板和demo

    366. 斐波纳契数列 中文 English 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列 ...

  8. Ubuntu下安装Rabbitmq和golang环境

    安装及配置Rabbitmq 1. 安装: sudo apt-get install rabbitmq-server 2. 启动web管理插件 sudo rabbitmq-plugins enable ...

  9. Virtualbox 修改硬盘的序列号等信息 例

    Virtualbox 修改硬盘的序列号等信息 例 http://blog.csdn.net/eidolon8/article/details/42709365 原创 2015年01月14日 14:24 ...

  10. 【转载】Makedown数学公式语法

    Typora数学模块 行间表达式快捷键($$) 点击"段落"->"公式块" 快捷键Ctrl+Shift+m "$$"+回车 行内表达式 ...