MapReduce详解和WordCount模拟

最早接触大数据,常萦绕耳边的一个词「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。
MapReduce过程

两幅重要的流程图

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无法创建系统映像_如何创建USB驱动器的映像

无法创建系统映像You can back up your USB drive by creating a saved image. You can then take that saved image and clone multiple USB sticks. This guide shows you how to create an image of your USB drive using Windows 10. 您可以通过创建保存的图像来备份USB驱动…

使用高级管理控制台获得对Windows Home Server的扩展访问

Windows Home Server is easy to setup and use so anyone with basic computer knowledge can operate their own server. But what if you’re an advanced user and want more control over various administrative functions? The Advanced Admin Console Addin gives you…

变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

首先回顾前面的文章&#xff0c;我们把for_each 归类为非变动性算法&#xff0c;实际上它也可以算是变动性算法&#xff0c;取决于传入的第三个参数&#xff0c;即函数 指针。如果在函数内对容器元素做了修改&#xff0c;那么就属于变动性算法。 变动性算法源代码分析与使用示例…

如何在Outlook中的电子邮件上显示快速操作按钮

There are probably actions you regularly perform in Outlook, such as deleting, archiving, and marking things as read. Here’s how to use Quick Action buttons to add one-click options that appear over every email to perform each action. 您可能会在Outlook中定…

使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1

我在RestTemplate的配置类里使用了 LoadBalancedComponentpublic class RestTemplateConfig { Bean LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }}或者 再调用Autowiredprivate RestTemplate restTemplate;必须使用应用名作为代替ip:端口&a…

zune linux_更新您的Zune Player软件

zune linuxKeeping your computer and software up to date is very important in keeping everything running smooth and secure. It’s also important to keep your geeky gadgets updated as well. Here we take a look at updating a Zune HD. 保持计算机和软件的最新状态…

写一个简单的 django_post demo

1.新建一个django工程&#xff0c;其路由为下图 2.要做的是一个 简单的登录请求&#xff0c;以表单形式提交&#xff0c;html 部分代码如下 这里注意action指向的是路由的地址&#xff0c;index1后的views.login部分代码如下 这段代码指的是&#xff0c;如果login接收到的请求是…

日志收集

2019独角兽企业重金招聘Python工程师标准>>> ELK (ElasticSearch、Logstash、Kibana)&#xff1a; https://my.oschina.net/itblog/blog/547250 转载于:https://my.oschina.net/zfscofield/blog/1625703

autocopy2u_借助AutoCopy简化Firefox中的文本复制和粘贴

autocopy2uLooking for an easy way to speed up copying and pasting in Firefox? Now you can reduce the amount of work that you have to do by half with AutoCopy. 是否在寻找一种简便的方法来加快Firefox中的复制和粘贴&#xff1f; 现在&#xff0c;您可以使用自动复…

僵尸进程处理方式

Linux服务器上&#xff0c;多少会出现一些僵尸进程&#xff0c;下面介绍如何快速寻找和消灭这些僵尸进程的方法 首先&#xff0c;我们可以用top命令来查看服务器当前是否有僵尸进程&#xff0c;在下图中可以看到僵尸进程数的提示&#xff0c;如果数字大于0&#xff0c;那么意味…

chromebook刷机_如何查看Chromebook的停产日期

chromebook刷机Google谷歌There comes a time in your Chromebook’s life when it no longer receives updates from Google. It’s inevitable and could be a lot sooner than you think. Here’s how to see your Chromebook’s scheduled end-of-life date. Chromebook一生…

如何在Google文档中的图片周围换行

If you want to insert an image or object into a document, it’s relatively simple. However, positioning and getting them to stay where you want can be frustrating. The wrap text feature in Google Docs makes all of this more manageable. 如果要将图像或对象插…

如何在Linux上使用history命令

Fatmawati Achmad Zaenuri/ShutterstockFatmawati Achmad Zaenuri / ShutterstockLinux’s shell saves a history of the commands you run, and you can search it to repeat commands you’ve run in the past. Once you understand the Linux history command and how to u…

mysql导入sqlserver数据库表

原文&#xff1a;https://zhidao.baidu.com/question/1114325744502691499.html 在Navicat for MySQL 管理器中&#xff0c;创建目标数据库(注意&#xff1a;因为是点对点的数据导入&#xff0c;要求sql server 中要导出的数据库名称和要导入到Mysql 中的数据库的名字相同)点击…

mac自带邮箱导出邮件_如何将电子邮件从Mac Mail导出到Notes应用程序

mac自带邮箱导出邮件Khamosh PathakKhamosh PathakIf you use the Mail app regularly, you’re used to archiving or flagging emails for later. But what if you want to save a particular message for future reference in the Notes app? Well, there’s a work-around…

Appium使用Python运行appium测试的实例

Appium使用Python运行appium测试的实例 一&#xff0e; Appium之介绍 https://testerhome.com/topics/8038 详情参考-- https://testerhome.com/topics/8038 Appium是一个移动端的自动化框架&#xff0c;可用于测试原生应用&#xff0c;移动网页应用和混合型应用&#xff0c;且…

ubuntu 任务栏监视器_从系统任务栏监视Google服务

ubuntu 任务栏监视器Are you looking for an app that sits in your System Tray and will notify you when you have new items in your Google accounts? Now you can easily monitor all of your favorite Google services with Googsystray. 您是否正在寻找一个位于系统任…

Java发送邮件(带附件)

实现java发送邮件的过程大体有以下几步&#xff1a; 准备一个properties文件&#xff0c;该文件中存放SMTP服务器地址等参数。利用properties创建一个Session对象利用Session创建Message对象&#xff0c;然后设置邮件主题和正文利用Transport对象发送邮件需要的jar有2个&#x…

google天气预报接口_将天气预报添加到谷歌浏览器

google天气预报接口Are you looking for a quick and easy way to see your local weather forecast in Google Chrome? Then you will definitely want to take a good look at the AccuWeather Forecast extension. 您是否正在寻找一种快速简便的方法来在Google Chrome浏览器…

hive中任意相邻时间段数据获取

通过sql语句获取相邻时段数据不比通过其它编程语言&#xff0c;因为sql里面没有for循环&#xff0c;故在实现时需要增加一份副表数据&#xff0c;这里对该方法做一个记录。背景&#xff1a;获取2017年全年平台用户进出贵州省的次数&#xff08;分为进港次数和出港次数&#xff…