【Hadoop】MapReduce——分布式计算框架

article/2025/10/20 7:37:37

文章目录

  • 一、MapReduce设计理念
  • 二、MpaReduce计算流程
    • 1 原始数据File
    • 2 数据块Block
    • 3 切片Split
    • 4 MapTask
    • 5 环形数据缓冲区KvBuffer
    • 6 分区Partation
    • 7 排序Sort
    • 8 溢写Spill
    • 9 合并Merge
    • 10 组合器Combiner
    • 11 拉取Fetch
    • 12 合并 merge
    • 13 归并Reduce
    • 14 写出Output
    • 15 MapReduce过程图解
  • 三、MapReduce架构特点
    • 1 MapReduce1.x
    • 2 MapReduce2.x
  • 四、Hadoop搭建yarn环境

一、MapReduce设计理念

MR架构——kv格式(key+value): map–>映射;reduce–>归纳
MapReduce: Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
Mapreduce核心功能: 将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上

二、MpaReduce计算流程

在这里插入图片描述
“计算1T数据中每个单词出现的次数” 为例

1 原始数据File

1T数据被切分成块存放在HDFS上,每一个块有128M大小

2 数据块Block

  • hdfs上数据存储的一个单元,同一个文件中块的大小相同
  • 数据存储到hafs上不可变,所以有可能块的数量和集群的计算能力不匹配
  • 需要一个动态调整本次参与计算节点数量的一个单位
  • 可以动态的改变这个单位,也就是节点参与的数量

3 切片Split

切片: 切片是一个逻辑概念,在不改变现有数据存储的情况下,控制参与计算的节点数目,具体通过控制切片的大小实现,有多少个切片就会执行多少个map任务

  • 如果Split大小>Block大小,计算节点少了
  • 如果Split大小<Block大小,计算节点多了
  • 默认情况下,Split切片的大小等于Block的大小,默认128M
  • 一个切片对应一个MapTask

4 MapTask

  • map默认从所属切片读取数据,每次读取一行到内存中
  • 可以根据自己书写的分词逻辑计算每个单词出现的次数
  • 产生Map<String,Integer>临时数据,存放在内存中
  • 但是内存大小是有限的,如果多个任务同时执行可能存在内存溢出(OOM)
  • 把数据直接存放在硬盘上效率太低 在OOM和效率低之间平衡,提供一个有效方案:先在内存中写入一部分,然后写出到硬盘

5 环形数据缓冲区KvBuffer

可以利用这块内存区域,减少数据溢写时map的停止时间

  • 每一个map可以独享的一个内存区域
  • 在内存中构建的一个环形数据缓冲区(KvBuffer),默认大小为100M
  • 设置缓冲区的阈值为80%,当缓冲区的数据达到80M开始向外溢写到硬盘
  • 溢写的时候还有20M的空间可以被使用,效率并不会被减缓
  • 数据将会循环写入到硬盘,不用担心OOM问题

6 分区Partation

  • 根据key直接计算出对应的reduce
  • 分区的数量和reduce的数量是相等的 hash(key)%partation=num
  • 分区的默认算法是Hash然后取余:如果两个对象相同,其hashcode一定相等;如果两个对象的hashcode相等,但是这两个对象不一定相同

7 排序Sort

  • 对要溢写的数据进行排序(quicksort)
  • 按照先partation后key的顺序进行排序,相同分区在一起,相同key在一起
  • 这样会保证溢写出来的小文件也都是有序的

8 溢写Spill

  • 将内存中的数据循环写入到硬盘,不用担心OOM的问题
  • 每次会产生一个80M的文件
  • 若本次map产生的数据较多,可能会溢写多个文件

9 合并Merge

  • 将小文件直接合并成大文件,将来拉取的数据直接从大文件拉取即可
  • 合并小文件的时候同样进行排序(归并排序),最终产生一个有序的大文件

10 组合器Combiner

  • 集群的带宽限制了mapreduce作业的数量,因此应该尽量避免map和reduce任务之间的数据传输。hadoop允许用户对map的输出数据进行处理,用户可自定义combiner函数(如同map函数和reduce函数一般), 其逻辑一般和reduce函数一样,combiner的输入是map的输出,combiner的输出作为reduce的输入, 很多情况下可以直接将reduce函数作为conbiner函数来使用
    (job.setCombinerClass(FlowCountReducer.class;)
  • combiner属于优化方案, 所以无法确定combiner函数会调用多少次,可以在环形缓存区溢出文件时调用combiner函数,也可以在溢出的小文件合并成大文件时调用combiner。但要保证不管调用几次combiner函数都不会影响最终的结果,所以不是所有处理逻辑都可以使用combiner组件,有些逻辑如果在使用了combiner函数后会改变最后reduce的输出结果(如求几个数的平均值,就不能先用combiner求一次各个map输出结果的平均值,再求这些平均值的平均值,这将导致结果错误)。
  • combiner的意义就是对每一个maptask的输出进行局部汇 总,以减小网络传输量。
    比如原先传给reduce的数据是a1 a1 a1a1 a1
    第一次combiner组合之后变为a{1,1,1,1,1,1}
    第二次combiner后传给reduce的数据变为a{4,2,3,5…}

11 拉取Fetch

  • 需要将map的临时结果拉取到reduce节点
  • 原则:相同的key必须拉取到同一个reduce节点,但是一个reduce节点可以有多个key
  • 拉取数据的时候必须对map产生的最终的合并文件做全序遍历,而且每一个reduce都要做一个全序遍历
  • 如果map产生的大文件是有序的,每一个reduce只需要从文件中读取自己所需的即可

12 合并 merge

  • reduce拉取时,会从多个map上拉取,每个map都会产生一个小文件(文件之间无序,文件内部有序),为了方便计算进行文件合并
  • 将小文件直接合并成大文件,将来拉取的数据直接从大文件拉取即可
  • 合并小文件的时候同样进行排序(归并排序),最终产生一个有序的大文件

13 归并Reduce

  • 将文件中的数据读取到内存中
  • 一次性将相同的key全部读取到内存中
  • 直接将相同的key得到结果

14 写出Output

每个reduce将自己计算的结果存放到hdfs上

15 MapReduce过程图解

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

三、MapReduce架构特点

1 MapReduce1.x

在这里插入图片描述

  • client:负责发送mapreduce任务到集群(hadoop jar wordcount.jar)
  • JobTracker:接受客户端的mapdurce任务,与Tasktracker保持心跳,接收汇报信息
  • TaskTracker:保持心跳,汇报资源(当前机器内存,当前机器任务数);当分配资源之后,开始在本机分配对应的资源给Task;实时监控任务的执行,并汇报
  • Slot(槽):属于JobTracker分配的资源,包括计算能力、IO能力;不管任务大小,资源是恒定的,不灵活但是好管理
  • Task(MapTask–ReduceTask):开始按照MapReduce的流程执行业务,当任务完成时,JobTracker告诉TaskTracker回收资源

缺点:

  1. 单点故障
  2. 内存扩展
  3. 业务瓶颈
  4. 只能执行MapReduce的操作
  5. 若其它框架需要运行在Hadoop上需要独立开发自己的资源调度框架

2 MapReduce2.x

在这里插入图片描述
在这里插入图片描述
2.x开始使用Yarn统一管理资源,其它计算框架可以直接访问yarn获取当前集群的空闲节点
client:客户端发送MapReduce任务
ResourceManager:

  • 资源协调框架的管理者,分为主节点与备用节点(主备切换基于Zookeeper进行管理)
  • 时刻与NodeManager保持心跳,接受NodeManager的汇报
  • 当有外部框架要使用资源的时候访问ResourceManager的汇报
  • 若有MapReduce任务,先去ResourceManager申请资源,ResourceManager根据汇报分配资源

yarn(NodeManager):

  • 资源协调框架的执行者
  • 每一个DataNode上默认有一个NodeManager

Container: 2.x资源的代名词,是动态分配的
ApplicationMaster:

  • 本次任务的主导者
  • 负责调度本次被分配的资源Container
  • 当所有节点任务全部完成,application告诉ResourceManager请求杀死当前ApplicationMaste线程
  • 本次任务所有的资源都会被释放

Task(MapTask–ReduceTask): 开始按照MapReduce的流程执行业务,当任务完成时,ApplicationMaster接收到当前节点的回馈

四、Hadoop搭建yarn环境

NN-1NN-2DNZKFCZKJNNRSNM
Node1*******
Node2******
Node3*****

yarn环境搭建基于HA环境
1.切换目录

cd /opt/hadoop-2.7.1/etc/hadoop/

2.拷贝配置文件

cp mapred-site.xml.template mapred-site.xml

3.修改 mapred-site.xml

vim mapred-site.xml
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>

4.修改yarn-site.xml

vim yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><property><name>yarn.resourcemanager.cluster-id</name><value>mr_my_cluster</value></property><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><property><name>yarn.resourcemanager.hostname.rm1</name><value>node1</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>node3</value></property><property><name>yarn.resourcemanager.zk-address</name><value>node2:2181,node3:2181,node4:2181</value></property>
</configuration>

5.拷贝至其它节点

scp mapred-site.xml root@node2:`pwd` # [1]
scp mapred-site.xml root@node3:`pwd` # [1]scp yarn-site.xml root@node2:`pwd` # [1]
scp yarn-site.xml root@node3:`pwd` # [1]

6.启动zookeeper、启动集群

zkServer.sh start # [123]
start-dfs.sh # [1]
start-yarn.sh # [1]
yarn-daemon.sh start resourcemanager # [1]

7.关闭拍摄快照

stop-all.sh # [1]
yarn-daemon.sh stop resourcemanager # [1]
zkServer.sh stop # [123]

http://chatgpt.dhexx.cn/article/rKqtNtrq.shtml

相关文章

python-17-并行计算和分布式计算框架dask

dask入门教程 并行计算库Dask官方教程&#xff08;中文翻译&#xff09; dask和numpy的计算对比 1 并行计算和分布式计算 1.1 并行计算parallel computing 并行计算&#xff1a;这是一台计算机的概念&#xff0c;即一台计算机中多个处理器被组织起来&#xff0c;大任务下达的…

大数据技术入门:MapReduce(分布式计算框架)

大家好&#xff0c;我是百思不得小赵。 创作时间&#xff1a;2022 年 7 月 7 日 博客主页&#xff1a; &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1222天。觉得有帮助麻烦&#x1…

05-分布式计算框架

目录 一&#xff0c;MapReduce 1&#xff0c;简介 2&#xff0c;原理 2.1 基本概念 2.2 程序执行过程 2.3 作业运行模式 二&#xff0c;Spark 1&#xff0c;简介 1.1 背景 1.2 概念 1.3 特点 2&#xff0c;原理 2.1 编程模型 2.2 运行模式 2.3 运行过程 2.4 DA…

大数据之Hadoop分布式计算框架MapReduce

这里写目录标题 一、MapReduce概述二、MapReduce编程模型简述三、MapReduce词频统计案例mvn clean package 四、词频统计案例进阶之Combiner五、词频统计案例进阶之Partitioner六、案例二介绍 一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架&#xff0c;用于编写批处…

分布式系列之分布式计算框架Flink深度解析

Flink作为主流的分布式计算框架&#xff0c;满足批流一体、高吞吐低时延、大规模复杂计算、高可靠的容错和多平台部署能力。本文简要介绍了Flink中的数据流处理流程以及基本部署架构和概念&#xff0c;以加深对分布式计算平台的了解。 1、Flink概述 Apache Flink是一个框架和分…

分布式计算框架——MapReduce

一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架&#xff0c;用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。 MapReduce 作业通过将输入的数据集拆分为独立的块&#xff0c;这些块由 map 以并行的方式处理&#xff0c…

【学习笔记1】分布式计算技术及框架

一.定义及描述 分布式计算(Distributed Computing)&#xff0c;又称分散式计算&#xff0c;指通过分布式系统进行计算的方式。分布式系统中的每一个运算单元存在于不同的计算机/处理器上&#xff0c;通过调度算法进行信息传递、协作以实现一件大而繁的目标。 简单来说&#x…

C#之简易计算器的制作

在一些问题中有时会用到计算器,今天我们可以用C#做一个简易的计算器 用到的开发工具为Visual Studio 2019(我用的是2019,其他版本的也可以) 1.首先新建一个项目文件. 2.在Form1.cs文件(Winform框架基础文件)中添加所用到的控件. 3.添加TextBox和ComboBox以及Button控件 4.对But…

JS原生——编写简易计算器

一个非常适合新手练习的小案例&#xff01;&#xff01;&#xff01; 使用JS的ES5语法HTMLCSS及企业级代码规范&#xff0c;方便后续良好的代码习惯养成&#xff01;&#xff01;&#xff01; 先来看一下样式吧&#xff01;&#xff01;&#xff01;&#xff08;后附代码&…

Java 实现简易计算器

前言&#xff1a; 出此文章是因为楼主之前在面试中遇到一个笔试题&#xff0c;当时一时半会没想出来&#xff0c;所以后续研究出来了&#xff0c;发出来希望对大家能有所帮助~ 题目&#xff1a;设计一个计算器&#xff0c;可以接收用户输入两个数字与 - * / 的符号&#xff0c…

Matlab设计简易计算器

效果如如下&#xff1a; 整个工程还是挺简单的&#xff0c;之前一直都是用matlab做信号处理&#xff0c;由于要做课程设计&#xff0c;就学了一下matlab的GUI。下面总结几个关键的地方。 &#xff08;1&#xff09;控件拉到自己喜欢的位置&#xff0c;并将控件的Text和Tag改好…

简易计算器(有界面)

&#xff08;没有括号和优先级&#xff0c;简易计算器&#xff09;界面&#xff1a; package javaprogram;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import j…

Andriod设计简易计算器

1&#xff0e;设计任务及要求 &#xff08;1&#xff09;设计一款基于Android系统下的计算器&#xff0c;实现加减乘除算法&#xff0c;以及清零、撤销操作。界面设计应该就尽量简洁而美观&#xff0c;具有良好的交互性&#xff0c;程序应具有较好的稳健性&#xff1b; &a…

java实现简易计算器

Java简易计算器 用java语言写的一个简易计算器&#xff0c;实现了最基本的、-、*、/ 运算。 先来看下效果&#xff1a; 界面简述&#xff1a; 整个面板的由一个JTextFiled组件16个JButton组件构成&#xff0c;外加一个JPanel组件存放16个按钮&#xff0c;其布局为4x4的网格…

做一个简易计算器(VB版)

今天小编来带大家用VB做一个简易计算器 废话不多说&#xff0c;下面就是具体步骤了 1、创建控件组的方法首先创建一个命令按钮&#xff0c;调整其大小&#xff08;觉得合适就行&#xff09;&#xff0c;名称为Command1&#xff0c;Caption 属性为数字 0 &#xff1b;然后进行…

简易计算器的设计_C#课程设计

以下内容可且仅可供参考&#xff0c;如有错误欢迎指正。 部分内容借鉴自百度 侵删致歉 位切换键盘的实现用了复杂的拖64给label的方法&#xff0c;此功能可以在自己计算机上的计算器里找到。 目录 一、设计简介 1.设计背景 2.开发工具及环境 二、需求分析 1.设计功能要求 …

Python制作简易计算器(GUI)---Tkinter

Python制作简易计算器&#xff08;GUI&#xff09;---Tkinter Tkinter简介Tkinter 与 PyQt5 的比较TkinterPyQt5 项目展示导入模块函数封装1. 运算公式的拼接与展示2. 将显示框的内容删除3. 使用eval()函数对表达式求值 主逻辑1. 布局窗口2. 布局表达式展示区域3. 布局按钮 代码…

自制个性计算器

一、布局文件xml的制作。 如图&#xff1a;是布局之后的一个效果图 完全可以自定义自己喜欢的各种类型的图片。 代码如下&#xff1a; 正所谓每一个鲜艳靓丽app背后都有成堆的代码支撑这句话是没有错的。由于没有长截屏软件只能用短截屏了&#xff0c;大家谅解一下&#…

C++简易计算器的实现

定义&#xff1a; 计算器是近代人发明的可以进行数字运算的机器。 也就是说&#xff0c;计算器不等同于算盘&#xff0c;前者能自行运算&#xff0c;后者只能简便计算过程&#xff0c;在古代,人们发明了许多计算工具,如算筹、算盘、计算尺等,随着社会的发展和科技的进步,计算…

制作简易计算器

简易计算器 效果展示图项目要求内容分析涉及函数 效果展示图 项目要求 制作简易计算器&#xff0c;使其能实现简单的加&#xff0c;减&#xff0c;乘&#xff0c;除运算。 1.在两个文本框中分别输入两个数字 2.输入完成后&#xff0c;再次点击加&#xff0c;减&#xff0c;乘&…