最早接触大数据,常萦绕耳边的一个词「MapReduce」。它到底是什么,能做什么,原理又是什么?且听下文讲解。

是什么

MapReduce 即是一个编程模型,又是一个计算框架,它充分采用了分治的思想,将数据处理过程拆分成两步:Map 和 Reduce。用户只需要编写 map() 和 reduce() 函数,就能使问题的计算实现分布式,并在Hadoop上执行。

数据处理

MapReduce 操作数据的最小单位是一个键值对。map 端的主要输入是一对<key,value>值,经过 map 计算后输出一对<key,value>,然后将相同的 key 合并,形成<key,value 集合>,再将这个<key,value 集合>输入 reduce ,经过计算输出零个或多个<key,value>对。

两个重要的进程

JobTracker

JobTracker 在集群中负责任务调度集群资源监控这两个功能。TaskTracker 通过周期性的心跳向 JobTracker 汇报当前的健康状况和状态,心跳中包括自身计算资源的信息、被占用的计算资源的信息和正在运行中的任务的状态信息。JobTracker 会根据各个 TaskTracker 周期性发送过来的心跳信息综合考虑TaskTracker 的资源余量、作业优先级、作业提交时间等因素,为 TaskTracker 分配合适的任务。

JobTracker 提供了一个基于 web 的管理界面,可以通过 JobTracker:50030 端口访问。

TaskTracker

TaskTracker 主要负责汇报心跳执行 JobTracker 命令这两个功能。命令主要包括5种:启动命令、提交命令、杀死任务、杀死作业和重新初始化。

几个概念

作业(Job) 和 任务(Task)

MapReduce 作业是用户提交的最小单位,任务是 MapReduce 计算的最小单位。 简单讲,用户提交的是一个MapReduce作业,一个 MapReduce 作业可以被拆分成两种——Map 任务和 Reduce 任务。

槽(slot)

槽是Hadoop计算资源的表示模型,Hadoop 将各个节点上的多维度资源(CPU、内存等)抽象成一维度的槽。一个TaskTracker 能够启动的任务数量是由 TaskTracker 配置的任务槽决定的。

MapReduce 过程

一个MapReduce作业通常经过 input、map、combine、reduce、output 五个阶段。combine 阶段不一定发生,map输出的中间结果分发到 reduce 的过程被称为 shuffle。shuffle 阶段还会发生 copy 和 sort。

两幅重要的流程图

  • map任务流程图
  • reduce 任务流程图

几个重要的阶段说明

map 函数处理后的中间结果会写到本地磁盘上,在刷写磁盘的过程中,还做了 partition 和 sort 操作。

map 函数输出时,并不是简单地刷写磁盘,为了保证 I/O 效率,采取了先写到内存的环形缓冲区,并做一次预排序。请结合map任务流程图理解。

partition

在分区阶段,通过对 key 取模,生成<partition,key,value>三元组,分区阶段进行了一次内排序。

MemoryBuffer

内存缓冲区,保存 map 的结果和 partition 处理后的结果,默认大小为100M,溢写阈值为80M。

spill(溢写)

内存缓冲区达到阈值时,溢写线程锁住这80M的缓冲区,开始将数据写到本地磁盘中,然后释放内存。

每次溢写都会生成一个数据文件,溢出的数据写到磁盘前会对数据进行 sort 以及合并(combine)。

combine

combine 对map 函数的输出结果进行早期聚合以减少传输的数据量,其作用其实和reduce 函数一样。combine 的过程发生在 spill(溢写) 阶段。

combine 能够提升程序性能,但并不是所有常见都适合使用 combine ,例如:求中值。

sort

MapReduce 计算框架主要用到了两种排序:快速排序和归并排序。在 Map 任务和 Reduce 任务的过程中,一共发生了三次排序操作:

  • partition 过程中按照键值进行的内排序。
  • map 任务完成之前,合并溢写文件产生输出文件时进行的一次 sort 操作。
  • shuffle 过程的 sort 操作。

wordcount 实验模拟

map 端编程代码(map_a.py):

import sys
import rep =re.compile(r'\w+')
for line in sys.stdin:world_list =line.strip().split()for word in world_list:if len(word)<2:continuew_list =p.findall(word)if len(w_list)>0:w =w_list[0].lower()print "%s\t%d"%(w,1)

reduce 端编程代码(red_b.py)

import sys
wt =0
cur_word =None
for line in sys.stdin:word,cnt =line.strip().split('\t')if cur_word ==None:cur_word =wordif cur_word !=word:print "%s\t%d"%(cur_word,wt)wt =0cur_word =wordwt =wt+int(cnt)
print "%s\t%d"%(cur_word,wt)

模拟命令

cat The_man_of_property.txt |python ./project/map_a.py | sort -k 1 |python ./project/red_b.py

输出显示

转载于:https://www.cnblogs.com/bbmkey/p/10702196.html

MapReduce详解和WordCount模拟相关推荐

  1. 图解大数据 | 分布式平台Hadoop与Map-Reduce详解

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/84 本文地址:https://www.showmeai.tech/article-d ...

  2. hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce详解

    我们在前一章已经学习了HDFS: hadoop基础----hadoop理论(三)-----hadoop分布式文件系统HDFS详解 我们已经知道Hadoop=HDFS(文件系统,数据存储技术相关)+ M ...

  3. 冒泡排序和qsort函数详解以及如何模拟实现qsort函数

    一.冒泡排序 冒泡排序是一种常见的排序方式,它可以把数组元素有序或无序的数组进行重新排序,并使得数组中的元素从大到小或从小到大进行排序(就像泡泡一样). 冒泡排序原理: 每次比较数组中的相邻的两个元素 ...

  4. SPI总线协议、SPI时序图详解、GPIO模拟SPI

    SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  5. 大数据之MapReduce详解(MR的运行机制及配合WordCount实例来说明运行机制)

    目录 前言: 1.MapReduce原理 2.mapreduce实践(WordCount实例) 目录 今天先总体说下MapReduce的相关知识,后续将会详细说明对应的shuffle.mr与yarn的 ...

  6. mapreduce 丢数据_大数据之MapReduce详解

    1.什么是Map/Reduce,看下面的各种解释: (1)MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框,就是mapre ...

  7. mapreduce编程规范_大数据之MapReduce详解

    今天要讲的是MapReduce 目录 今天先总体说下MapReduce的相关知识,后续将会详细说明对应的shuffle.mr与yarn的联系.以及mr的join操作的等知识.以下内容全是个人学习后的见 ...

  8. 3、MapReduce详解与源码分析

    文章目录 1 Split阶段 2 Map阶段 2.1分区 2.2排序 3 Shuffle阶段 4 Reduce阶段 1 Split阶段      首先,接到hdf文件输入,在mapreduce中的ma ...

  9. MapReduce详解

    1.概述 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map"(映射)和"Reduce(归约)",是它们的主要思想,都是从 ...

最新文章

  1. sqlalchemy安装以及使用_防火阀的安装以及使用特点详细介绍
  2. 协议簇:TCP 解析: Sequence Number
  3. ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)
  4. 常用数学符号的 LaTeX 表示方法(附代码)
  5. 4.10 风格代价函数
  6. 真与开源“化敌为友”:微软连自己的 Linux 发行版都有了!
  7. java 之 servlet简介
  8. 关于android集成开发环境-引入jar包错误的问题
  9. 单台主机一键编译部署LAMP+wordpress+discuz系统的shell脚本
  10. 交易平台谁能在移动支付的大潮中成为赢家?
  11. 怎么用计算机同步文件夹,DSynchronize同步电脑本地文件夹教程
  12. html商城网站模板
  13. 情绪管理训练APP的产品概念分析
  14. 进销存php 百度云盘,fb1334 PHP网络版进销存源码WEB进销存源码含说明
  15. Safari 兼容问题累积
  16. Flask 学习-22.可插拨视图MethodView类
  17. 基于GEE黑龙江省大宗农作物空间分布(注释+全套代码)
  18. python投票系统项目ppt_python fastApi实战项目 - 爱投票管理系统(一)
  19. linux修改组群名字,Linux用户和组 - 回忆斑斑驳驳的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. vant的时间选择器使用

热门文章

  1. WeMos下实现小车避障与手机控制
  2. 卷积核和全连接层的区别_「动手学计算机视觉」第十六讲:卷积神经网络之AlexNet...
  3. 雷鸟html签名设置,thunderbird 使用OpenPGP加解密邮件
  4. IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
  5. HashSet和LinkedHashSet使用
  6. RocketMQ核心概念
  7. Spring系列(三):@ComponentScan注解用法介绍
  8. 数据库技术:数据存储和查询知识笔记
  9. 为啥你用@JsonFormat注解反序列化LocalDateTime总失败?
  10. java获取用户地理位置_java web 通过ip获取当前地理位置