前两篇文章介绍了HDFS的原理和高可用,下面再来介绍Hadoop的另外一个模块MapReduce。它的思想是很多技术的鼻祖,值得一学。

MapReduce是什么

MapReduce是一个分布式计算系统,它可以类比为SQL里的select ...group by...

它被分为两个阶段。第一个阶段叫Map,它每次处理一条原始数据的映射、转换,并将中间结果合并、排序,生成Reduce阶段的输入数据。第二个阶段叫Reduce,它拉取Map处理好的数据做排序,一次处理一组数据,生成最终结果。

从上面的定义可以看出,MapReduce是用来做集合的分组汇总操作,它只关心想要的少部分字段,对于原始记录的大多数字段都会忽略掉。

迭代器模式

为啥要在这里提迭代器模式?这是一位老师总结出来的心得。他认为MapReduce的处理过程跟迭代器模式非常像。

我们来看看迭代器模式的定义。学过设计模式的都知道,设计模式包含定义、参与者、场景等等。这里我们来看看定义和场景。

定义:迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

场景:

  1. 访问一个聚合对象的内容而无需暴露它的内部表示
  2. 支持对聚合对象的多种遍历
  3. 为遍历不同的聚合结构提供一个统一的接口

目前还看不出来迭代器与MapReduce的相似之处,先写这里以后来看。

Map原理

在HDFS中,文件是以Block为单位来存放的。但是在Map任务中,输入的单位是split,它跟Block可以是1:1、1:N、N:1的关系。也就是说

  • 一个Block块可以被一个Map任务处理
  • 一个Block块可以被多个Map任务处理,每个Map只处理其中一部分
  • 多个Block块可以合并被一个Map任务处理

Map的处理是在内存里的,而一个Block块的大小可以是128M,也可以是1G,这取决于你在配置文件中的定义。在默认1:1的情况下,如果Block块太大,超出了Map进程所占用的内存,那就没办法一次放到内存中。另外,Map是针对每一条记录来做映射、转换的,它一次只需要读取一条记录,不关心后面还有多少记录。这就可以借鉴迭代器的处理方式,每次从文件读一条记录,处理完之后再判断后面还有没有记录,有的话继续处理,没有就结束。

每条记录经过Map处理的结果是一个K,V,P的三元组,K,V是键和值这好理解,K值相同的记录是一组。P是K的散列值(对Reduce任务数量做散列),决定了它会被哪一个Reduce任务拉取。

当Map任务处理了一部分数据之后,它需要把内存里的处理结果落盘,以便释放空间来处理后续的文件。在落盘之前,它会做这么一件事,就是在内存中,对处理结果排序。首先根据P来排序,不同P值的数据会被不同的Reduce拉取。同一个P值的数据再根据K来排序。排完序的数据就可以落盘了。经过多次这样的操作,它会生成很多个小文件,这些小文件之间内部有序外部无序。在原始文件处理完毕,小文件全部生成之后,使用归并算法将小文件合并成一个中间结果文件,这个文件总体来讲先以P排序,相同P值再以K排序。至此,Map阶段的任务就完成了。

Reduce原理

Reduce阶段它的大处理单元是分区,即Map阶段处理后的P值。它的小处理单元是组,即K值相同的一组数据。

首先,它从所有的Map任务节点拉取自己分区的数据,然后将这些文件归并排序生成Reduce任务的输入数据。经过Reduce计算后,生成最终结果数据。

Map和Reduce的关系

Map与Reduce两个阶段的任务是线性阻塞的。

Map的结果集中,Key值相同的数据属于同一个分组,一个组是不能被分割到不同的Reduce任务去处理的。

Map任务的个数取决于HDFS文件的Block数(Block:Split=1:1情况下),Reduce任务个数可以人工确定。

Map任务与Reduce任务的比例可以是N:1、N:N、1:1、1:N等多种情况。当任务数为1时,会牺牲系统的并发度。当任务数为N时,会增加整个系统的资源开销。

一个实际的任务很难由一次MapReduce过程完成,它会将多个MapReduce任务组成一个pipeline,上一次Reduce的输出成为下一次Map任务的输入,经过多次处理才能获取最终结果。

大数据学习(04)——MapReduce原理的更多相关文章

  1. 大数据运算模型 MapReduce 原理

    大数据运算模型 MapReduce 原理 2016-01-24 杜亦舒 MapReduce 是一个大数据集合的并行运算模型,由google提出,现在流行的hadoop中也使用了MapReduce作为计 ...

  2. 大数据学习系列之五 ----- Hive整合HBase图文详解

    引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...

  3. 大数据学习(一) | 初识 Hadoop

    作者: seriouszyx 首发地址:https://seriouszyx.top/ 代码均可在 Github 上找到(求Star) 最近想要了解一些前沿技术,不能一门心思眼中只有 web,因为我目 ...

  4. 大数据篇:MapReduce

    MapReduce MapReduce是什么? MapReduce源自于Google发表于2004年12月的MapReduce论文,是面向大数据并行处理的计算模型.框架和平台,而Hadoop MapR ...

  5. 大数据学习(16)—— HBase环境搭建和基本操作

    部署规划 HBase全称叫Hadoop Database,它的数据存储在HDFS上.我们的实验环境依然基于上个主题Hive的配置,参考大数据学习(11)-- Hive元数据服务模式搭建. 在此基础上, ...

  6. 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

    引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...

  7. 大数据学习系列之六 ----- Hadoop+Spark环境搭建

    引言 在上一篇中 大数据学习系列之五 ----- Hive整合HBase图文详解 : http://www.panchengming.com/2017/12/18/pancm62/ 中使用Hive整合 ...

  8. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  9. 大数据学习系列之九---- Hive整合Spark和HBase以及相关测试

    前言 在之前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,但是在使用hive进行数据查询的时候会非常的慢,因为h ...

  10. 大数据学习之Linux基础01

    大数据学习之Linux基础 01:Linux简介 linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ...

随机推荐

  1. 合肥某小公司面试题:Spring基础

    <对线面试官>系列目前已经连载25篇啦!有深度风趣的系列! [对线面试官]Java注解 [对线面试官]Java泛型 [对线面试官] Java NIO [对线面试官]Java反射 & ...

  2. 用transform和rem哪个好

    个人觉得电脑端的用transform好,毕竟电脑端的项目基本都会固定屏幕比列,16:9.28:9.32:9的 一个固定的设计稿就能很好的适配. 移动端用rem比较好,移动端的屏幕比列太杂,使用rem自 ...

  3. vs中打开ashx文件没有提示,没有高亮标记解决方法

    在VS菜单中 工具 --- 选项 --- 文本编辑器 --- 文件扩展名,在右侧添加 ashx ,选中Microsoft Visual C# 保存后,再打开就行了 ashx文件头部报错后,删除 < ...

  4. 20201123 实验二《Python程序设计》实验报告

    20201123 2020-2021-2 <Python程序设计>实验报告课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验日期 ...

  5. 17、linux root用户密码找回

    17.1.救援模式: 光盘模式启动(第一启动项) 删除/mnt/sysimage/etc/passwd root的密码,halt重启. 改为硬盘启动模式,无密码进入root,为root新建密码 17. ...

  6. 寻找无序数组中的前k大元素

    题目描述 以尽可能小的代价返回某无序系列中的两个最大值,当有重复的时设置某种机制进行选择. 题解 首先要考虑的是重复的数的问题. A.不处理重复数据方法:在处理第k大的元素时不处理重复的数据,也就是将 ...

  7. 【转载】Nginx多服务绑定80端口及映射域名

    多服务绑定80端口及映射域名 说明:业务需要配置的样例模板,如需深入了解,请查看官方文档 1.Nginx配置文件nginx.conf(可拆分多台机器部署) worker_processes  1; e ...

  8. [心得体会]spring事务源码分析

    spring事务源码分析 1. 事务的初始化注册(从 @EnableTransactionManagement 开始) @Import(TransactionManagementConfigurati ...

  9. Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

    解决办法: 去掉ps -aux 中的"-",改成ps aux 就可以了

  10. ES异地双活方案

    对于单机房而言,只要参考Elastic Search 官方文档,搭建一个集群即可,示意图如下: 原理类似分布式选举那一套,当一个master节点宕机时,剩下2个投票选出1个新老大,整个集群可以继续服务 ...