MapReduce原理

MapReduce 的实际处理过程可以分解为 InputMapSort(排序)、Combine(局部合并)、Partition(分区)、Reduce(全局聚合)、Output 等阶段。

1 MapReduce的作用

化大为小、分而治之

2 Map和Reduce阶段的作用

Map阶段:

把输入变成(Key,Value)结果,用于reduce阶段的输入.(结果局部有序)

Reduce阶段:

将map阶段的结果按分组进行汇总.(结果全局有序)  

MapReduce 计算架构提供的主要功能包括以下几点:

1)任务调度提交的一个计算作业(Job)将被划分为很多个计算任务(Tasks)多个map一起进行。一个数据块就要跑一个map,假如感觉reduce特别慢,可以增加reduce的数量.
任务调度功能主要负责为这些划分后的计算任务分配和调度计算结点(Map 结点或 Reduce 结点),同时负责监控这些结点的执行状态,以及 Map 节点执行的同步控制,也负责进行一些计算性能优化处理.
例如,对最慢的计算任务采用多备份执行,选最快完成者作为结果(推测执行).  
2)数据/程序互定位为了减少数据通信量,一个基本原则是本地化数据处理,即一个计算结点尽可能处理其本地磁盘上分布存储的数据,这实现了代码向数据的迁移.
当无法进行这种本地化数据处理时,再寻找其他可用结点并将数据从网络上传送给该结点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻找可用结点以减少通信延迟.  
3)出错处理在以低端商用服务器构成的大规模 MapReduce 计算集群中,结点硬件(主机、磁盘、内存等)出错和软件有缺陷是常态。
因此,MapReduce 架构需要能检测并隔离出错结点,并调度分配新的结点接管出错结点的计算任务.  
4)分布式数据存储与文件管理海量数据处理需要一个良好的分布数据存储和文件管理系统作为支撑,该系统能够把海量数据分布存储在各个结点的本地磁盘上,且保持整个数据在逻辑上成为一个完整的数据文件.
为了提供数据存储容错机制,该系统还要提供数据块的多备份存储管理能力.  
5)Combiner(整合器) 和 Partitioner(划分器)Combiner : map阶段的数据合并功能.Partitioner : 可以指定多个reduce进行数据聚合工作,每个我想要统计的数据一定会到某个同样的reduce中去,如此统计数据就快了,但缺点是数据分散了,会产生多个数据结果.为了减少数据通信开销,中间结果数据进入 Reduce 结点前需要进行合并(Combine)处理,即把具有同样主键的数据合并到一起避免重复传送.  

3 输入文件的split原理

在map阶段读取数据前,FileInputFormat会将输入文件分割成split,split的个数决定了map的个数,影响map个数(split个数)的主要因素有:

1) 文件的大小
当块(dfs.block.size)为128m时,如果输入文件为128m,会被划分为1个split;当块为256m,会被划分为2个split.
2) 文件的个数
FileInputFormat按照文件分割split,并且只会分割大文件,即那些大小超过HDFS块大小(dfs.block.size)的文件.
如果HDFS中dfs.block.size设置为128m,而输入的目录中文件有100个,则划分后的split个数至少为100个.
3) splitsize的大小
分片是按照splitszie的大小进行分割的,一个split的大小在没有设置的情况下,默认等于hdfs block的大小.

配置文件和代码中的设置:

# 应用程序可以通过两个参数来对splitsize进行调节
InputSplit=Math.max(minSize, Math.min(maxSize, blockSize)
# 其中:
minSize=mapred.min.split.size
maxSize=mapred.max.split.size# 我们可以在MapReduce程序的驱动部分添加如下代码:
TextInputFormat.setMinInputSplitSize(job,1024L); # 设置最小分片大小
TextInputFormat.setMaxInputSplitSize(job,1024×1024×10L); # 设置最大分片大小
# 总结如下:
当mapreduce.input.fileinputformat.split.maxsize > mapreduce.input.fileinputformat.split.minsize > dfs.blockSize的情况下,此时的splitSize 将由mapreduce.input.fileinputformat.split.minsize参数决定
当mapreduce.input.fileinputformat.split.maxsize > dfs.blockSize > mapreduce.input.fileinputformat.split.minsize的情况下,此时的splitSize 将由dfs.blockSize配置决定
当dfs.blockSize > mapreduce.input.fileinputformat.split.maxsize > mapreduce.input.fileinputformat.split.minsize的情况下,此时的splitSize将由mapreduce.input.fileinputformat.split.maxsize参数决定。

4 Partition算法

为什么要有partition这个过程存在:

一个 reduce 结点所处理的数据可能会来自多个map结点,如果所有的map节点结果数据都拉去到同一个reduce上去,极有可能造成OOM(内存溢出);
因此,map结点输出的结果需使用一定的策略进行适当的划分(partition)处理,保证相同key的数据进入同样的reduce,如此统计数据就快了而且保证了计算结果的准确性.
注意 : 有一个reduce的情况下,就没有partition过程.  有多个reduce的情况下,就会有partition过程.

为什么要把相同的key进入到同一个reduce中计算

为了保证计算结果的快速、准确.

如何保证相同的key进入到同一个reduce中:

# hashpartion算法
PID(partition id) = (key.hashcode&Integer.max_value) % (reduce的个数)==
# (key的hashcode值与Integer的最大值进行位运算) % (reduce的个数)# 假设:reduce数量是2
PID = 0
PID = 1# 假设:reduce数量是3
PID = 0
PID = 1
PID = 2# reduce 数量决定了partition 数量。

5 Map与Reduce之间的通信

在 MapReduce 整个处理过程中,不同的 Map 任务之间不会进行任何通信,不同的 Reduce 任务之间也不会发生任何信息交换.  
用户不能够显式地从一个结点向另一个结点发送消息,所有的信息交换都是通过 MapReduce 框架实现的.
MapReduce 计算模型之所以得到如此广泛的应用,就是因为应用开发者不需要处理分布式和并行编程中的各种复杂问题.
如分布式存储、分布式通信、任务调度、容错处理、负载均衡、数据可靠等,这些问题都由 Hadoop MapReduce 框架负责处理,
应用开发者只需要负责完成 Map 函数与 Reduce 函数的实现.

Hadoop应用最广泛的三种数据传输方式:

HTTP             请求与响应,map与reduce之间的通信方式  
RPC              在namenode和datanode之间,datanode和datanode之间进行通信时使用.  
NIO+SOCKET       在HDFS的客户端向datanode存数据的时候使用(因为可以开通道进行操作).  

为什么Map与Reduce之间的通信用http协议呢???

http是请求与响应模式,在map向applicationmaster发送状态后到接收到reduce的请求前,会有一个时间间隔;
在这段时间内不能保证map的数据有没有发生改变,为了保证reduce获取数据的准确性,用http请求与响应模式.

Map与Reduce之间的通信流程:

map向applicationmaster发送自己的状态,applicationmaster将map的状态告知reduce;
此时reduce会向map发送一次请求,询问数据状态是否正确;
如果map响应正确,则reduce即开始从map拉取数据;
如此,可以避免拉取数据的重复或不成功的发生,保证拉取数据的准确性.

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

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

相关文章

专业习惯:拥有好习惯,让自己少走弯路

小细节决定成败,小习惯决定未来。也许读者对于做IT产品缺乏深度与广度的应用认知,不能完全理解,这没有关系。跟着博主的节奏来,随着理论结合实践的深入学习,你会越来越明白的。 俗话说,”有志不在年高&…

Js地图路线规划以及点击获取经纬度

废话不多说&#xff0c;直接上代码。 代码script引用链接链接来自高德地图开放平台。&#xff08;高德开放平台 | 高德地图API (amap.com)&#xff09; <!doctype html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-…

OpenHarmony 实战开发——南向统一编译的docker镜像来了

由于我自己的南向设备开发平台的需求&#xff0c;我将当前几个不同的 docker 镜像版本进行了整合&#xff0c;经过一段时间的攻关和验证&#xff0c;目前整合已完成&#xff0c;新版本的 Dockerfile 如下&#xff0c;这个不是公共需求&#xff0c;所以没有提交主干&#xff0c;…

std::lock_guard和std::unique_lock的差别

std::lock_guard 和 std::unique_lock 都是 C 标准库 <mutex> 中提供的用于管理互斥体&#xff08;mutex&#xff09;的 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;风格的类。它们的主要目标都是确保互斥体在适当的时候被锁定和解锁&#xff0…

Web APIs 学习归纳8---移动端特效

上一节学习了PC端的特效&#xff0c;现在学习移动端的特效。 一、移动端触屏事件 1.1 触屏事件概述 移动端浏览器兼容性较好&#xff0c;我们不需要考虑以前 JS 的兼容性问题&#xff0c;可以放心的使用原生 JS 书写效果&#xff0c;但是移动 端也有自己独特的地方。比如触屏…

Go语言函数

在Go语言中&#xff0c;函数是一种基本的构建块&#xff0c;用于组织代码并执行特定任务。它们是可重复使用的代码段&#xff0c;可以接收输入参数&#xff0c;执行一系列操作&#xff0c;并可返回结果。以下是Go语言中函数的详细介绍及其使用方法&#xff1a; 基本语法 Go语…

让新手变中手的ChatGPT 使用方法

让新手变中手的ChatGPT 使用方法 已经要一年了,没想到这篇还是一样有用。看到许多依然是一句话就要问出结果的教学,就知道AI 进步很快,但人的学习速度还需要更多时间。 以下为去年原版内容加上新的两招更新,希望帮助你使用ChatGPT 更好用,当未来文字可直接生成影像时,你…

容联云孔淼:大模型落地与全域营销中台建设

近日&#xff0c;由金科创新社主办的2024区域性商业银行数智化转型研讨会顺利召开&#xff0c; 容联云产业数字云事业群副总经理、诸葛智能创始人孔淼受邀出席&#xff0c;并分享数智化转型实践经验。 他分享了容联云两大核心产品&#xff0c;“大模型应用容犀Copilot”在金融营…

TypeScript 基础学习笔记:interface 与 type 的异同

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 TypeScript 学习笔记&#xff1a;interface 与 type 的异同&#x1f3a3; 引言&#x1f680; 快速入门1️⃣ Interface&#xff08;接口&#xff09;&#x1f4cb; 定义&#x1f91d; 实现&#x1f4a1; 特点 2️⃣ Type Al…

Android 高版本实现沉浸式状态栏

目前实现的android高版本沉浸式状态栏分为两类&#xff1a; 1、是纯透明状态栏&#xff1b; 2、是纯透明状态栏&#xff0c;但是状态栏字体是黑色&#xff1b; 将状态栏的代码封装到BaseActivity中更方便使用&#xff1a; BaseActivity: public abstract class BaseActivit…

如何在Linux中安装Docker Compose

下载安装 在Linux中安装Docker Compose相对简单&#xff0c;你可以按照以下步骤进行 确保Docker已经安装   Docker Compose需要在系统上安装了Docker才能正常工作。如果你的系统上还没有安装Docker&#xff0c;请先安装Docker。 下载Docker Compose   你可以从Docker官方Gi…

记录HCIP学习过程中的疑问

1、查看协议路由表、本地核心路由表、FIB表的命令&#xff1f;&#xff1f;&#xff1f; 查看FIB表&#xff1a;display fib [ slot-id ] 2、最优路由选择&#xff0c;当达到目的地址的路由有多条时&#xff0c;本地核心路由 与FIB表的情况&#xff1f;&#xff1f;&#xf…

代码随想录算法训练营第四十四天

sad的一天&#xff0c;明天开始上班&#xff0c;而且娃还行&#xff0c;媳妇儿状态不稳定&#xff0c;太难了也&#xff01;&#xff01;&#xff01; 完全背包 #include<vector> #include<iostream> using namespace::std; int main(){int N;//种类int V;//空间ci…

AI一键换装超强电商生产力工具下载

支持win版本&#xff0c;对电脑硬件有一定的要求。建议固态硬盘留足至少30 G的空间&#xff0c;显卡n卡显存至少4G。一些低端独立显卡可能还不如高配cpu集成。 程序文件比较大&#xff0c;因为涉及到大型模型。 下载链接在后面 下载链接&#xff1a; https://pan.baidu.com…

【Linux】如何定位客户端程序的问题

文章目录 1 客户端程序和服务端程序的差别2 问题类型2.1 崩溃(crash)2.2 CPU高2.3 内存高2.4 线程卡死 3 总结 1 客户端程序和服务端程序的差别 客户端程序是运行在终端上&#xff0c;通常都会与业务系统共存&#xff0c;而服务端程序通常会运行在单独的节点上&#xff0c;或者…

怎麼檢測線上代理IP是否生效?

代理IP在保護網路隱私、繞過地理限制、提高網路安全等方面發揮著重要的作用。使用代理IP時&#xff0c;經常會涉及到一個問題&#xff1a;如何確定代理IP是否生效&#xff1f;在這篇文章中&#xff0c;我們將詳細討論幾種檢測線上代理IP是否生效的方法。 一、使用線上代理檢測…

Shell编程之条件语句与case语句

目录 1.条件测试 1.1 文件测试 1.2 整数测试 1.3 字符串测试 1.4 逻辑测试 2.if语句 2.1 单分支if语句 2.2 双分支if语句 2.3 多分支if语句 3.case分支语句 1.条件测试 test命令 Shell环境根据命令执行后的返回状态值&#xff08;$?&#xff09;来判断是否执行成功…

找最大数字-第12届蓝桥杯国赛Python真题解析

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第60讲。 找最大数字&#…

你会拧螺丝吗?来看看如何拧紧螺丝?——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺丝拧紧看似简单&#xff0c;却是一门需要技巧和耐心的技术活。很多人可能会认为&#xff0c;只要把螺丝旋进孔里&#xff0c;用力拧紧就可以了。但实际上&#xff0c;拧紧螺丝的过程远不止如此。在这篇文章中&#xf…

FPGA+DDR+SERDES+USB3.0单向传输机方案,数据只能单向传输,避免反向攻击,确保系统安全

FPGADDRSERDESUSB3.0方案&#xff0c;设备包含发送端接收端&#xff0c;物料上采用光纤通讯&#xff0c;数据只能单向传输&#xff0c;避免反向攻击&#xff0c;确保系统安全 客户应用:高安全、高可靠性要求的场景 主要性能: 1.支持USB3.0传输&#xff0c;实测可达到350MB/s 2.…