Hadoop高手之路5-MapRreduce

news2024/12/25 4:03:42

文章目录

  • Hadoop高手之路5-MapReduce分布式计算框架
  • 一、MapReduce概述
    • 1.MapReduce核心思想
    • 2.MapReduce编程模型
    • 3.MapReduce编程实例——词频统计
  • 二、MapReduce的工作原理
    • 1. MapReduc的工作过程
      • 1) 分片、格式化数据源
      • 2) 执行MapTask
      • 3) 执行Shuffle
      • 4) 执行ReduceTask
      • 5) 写入文件
    • 2. MapTask工作原理
      • 1) Read 阶段
      • 2) Map阶段
      • 3) Collect阶段
      • 4) Spill阶段
      • 5) Combine阶段
    • 3. ReduceTask工作原理
      • 1) Copy阶段
      • 2) Merge阶段
      • 3) Sort阶段
      • 4) Reduce阶段
      • 5) Write阶段
    • 4. Shuffle工作原理
  • 三、MapReduce编程组件
    • 1.InputFormat组件
    • 2.Mapper组件
    • 3.Reducer组件
    • 4.Partitioner组件
    • 5.Combiner组件
    • 6.OutputFormat组件
  • 四、MapReduce运行模式与性能优化策略
    • 1.运行模式
      • 1) 本地运行模式
      • 2) 集群运行模式
    • 2.性能优化策略
      • 1) 数据输入
      • 2) Map阶段
      • 3) Reduce阶段
      • 4) Shuffle阶段
      • 5) 其他调优属性
  • 五、本地模式执行MapReduce
    • 1. 启动idea,新建一个maven项目
    • 2. 添加pom依赖
    • 3. 新建包
    • 4. 新建mapper类
    • 5. 新建reducer类,输入代码
    • 6. 新建一个主类
    • 7.运行,查看结果
    • 8. 添加一个日志输出文件
  • 六、集群模式执行MapReduce
    • 1. 启动hadoop集群
    • 2. 项目通过本地模式进行调试,确认运行正确
    • 3. 保持mappper和reducer类不变,跟本地模式一致
    • 4. 修改主类
    • 5. 准备好用于单词计数的文本文件并上传hadoop集群
    • 6. 项目打成jar包
    • 7. 把jar包上传的linux虚拟机hadoop001下
    • 8. 通过集群模式运行jar包
    • 9. 查看结果
  • 七、MapReduce的经典案例一-数据去重
    • 1. **案例分析**
    • 2. 准备好数据文件
    • 3. **需求**
    • 4. **编写mapper类**
    • 5. 编写reducer类
    • 6. 编写主类
    • 7. 本地模式执行查看结果
  • 八、MapReduce的经典案例之二-TopN
    • 1. 案例分析
    • 2. 准备好数据文件
    • 3. 需求分析
    • 4.新建一个maven项目
    • 5. 编写Mapper类
    • 6. 编写reduce类
    • 7. 编写主类
    • 8. 运行,查看结果

img

Hadoop高手之路5-MapReduce分布式计算框架

MapReduce是Hadoop系统核心组件之一,它是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算,是目前分布式计算模型中应用较为广泛的一种。

一、MapReduce概述

1.MapReduce核心思想

MapReduce的核心思想是“分而治之”。所谓“分而治之”就是把一个复杂的问题,按照一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,把各部分的结果组成整个问题的结果,这种思想来源于日常生活与工作时的经验,同样也完全适合技术领域。

MapReduce作为一种分布式计算模型,它主要用于解决海量数据的计算问题。使用MapReduce操作海量数据时,每个MapReduce程序被初始化为一个工作任务,每个工作任务可以分为Map和Reduce两个阶段。

  • Map阶段:负责将任务分解,即把复杂的任务分解成若干个“简单的任务”来并行处理,但前提是这些任务没有必然的依赖关系,可以单独执行任务。
  • Reduce阶段:负责将任务合并,即把Map阶段的结果进行全局汇总。

MapReduce就是“任务的分解与结果的汇总”。即使用户不懂分布式计算框架的内部运行机制,但是只要能用Map和Reduce思想描述清楚要处理的问题,就能轻松地在Hadoop集群上实现分布式计算功能。

在这里插入图片描述

2.MapReduce编程模型

MapReduce是一种编程模型,用于处理大规模数据集的并行运算。使用MapReduce执行计算任务的时候,每个任务的执行过程都会被分为两个阶段,分别是Map和Reduce,其中Map阶段用于对原始数据进行处理,Reduce阶段用于对Map阶段的结果进行汇总,得到最终结果。

在这里插入图片描述

MapReduce编程模型借鉴了函数式程序设计语言的设计思想,其程序实现过程是通过map()函数和reduce()函数来完成。从数据格式上来看,map函数接受的数据格式是键值对,产生的输出结果也是键值对形式,reduce会将map函数的输出的键值对作为输入,把相同的key值的value进行汇总,输出新的键值对。

在这里插入图片描述

说明:对于某些任务来说,可能不一定需要Reduce,MapReduce的数据流模型坑内只有Map过程,由Map产生的数据直接写入HDFS。但是对于大多数的任务来说,都是需要Reduce的,而且可能需要多个reduce。

3.MapReduce编程实例——词频统计

首先,MapReduce通过默认组件TextInputFormat将待处理的数据文件(如text1.txt和text2.txt),把每一行的数据都转变为<key,value>键值对。

其次,调用Map()方法,将单词进行切割并进行计数,输出键值对作为Reduce阶段的输入键值对。

最后,调用Reduce()方法将单词汇总、排序后,通过TextOutputFormat组件输出到结果文件中。

在这里插入图片描述

二、MapReduce的工作原理

MapReduce框架要是由Map和Reduce阶段来实现计算的,那么这两个阶段内部是如何协同工作的呢?

1. MapReduc的工作过程

分为五个步骤

  • 分片、格式化数据源
  • 执行MapTask
  • 执行Shuffle过程
  • 执行ReduceTask
  • 写入文件

在这里插入图片描述

1) 分片、格式化数据源

  • 分片操作:分片将源文件划分为大小相等的小数据块(默认是128MB),Hadoop为每一个分片建立一个Map任务,并由该任务运行自定义的map函数,从而处理分片里的每一个记录。
  • 格式化操作:将划分好的分片(split)格式化为键值对<Key,Value>形式的数据,key代表偏移量,value代表每一行内容

2) 执行MapTask

每个map任务都有一个内存缓冲区(缓冲区的大小为100MB),输入的分片数据经过Map任务处理后的中间结果会写入内存缓冲区。

3) 执行Shuffle

Shuffle会将MapTask输出的处理结果分发给ReduceTask,并在分发的过程中,对数据按key进行分区和排序。

4) 执行ReduceTask

输入ReduceTask的数据流是<key,{value list}>形式,用户可以自定义reduce方法进行逻辑处理,最终以<key,value>的形式输出。

5) 写入文件

MapReduce框架会自动把ReduceTask生成的<key,value>传入OutputFormat的write方法,实现文件的写入操作。

2. MapTask工作原理

MapTask作为MapReduce工作流程前半部分,它主要经历5个阶段,分别是Read阶段、Map阶段、Collect阶段、Spill阶段和Combiner阶段。

在这里插入图片描述

1) Read 阶段

通过用户编写的RecordReader,从输入的InputSplit中解析出一个个的key/value

2) Map阶段

将解析出的key/value交给用户编写的map函数处理,并产生一系列的新的key/value

3) Collect阶段

将会生成的key/value分片,写入一个环形的缓冲区中

4) Spill阶段

即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。

5) Combine阶段

当所有数据处理完成后,MapTask会对所有的临时文件进行一次合并,以确保最终只会生成一个数据文件。

3. ReduceTask工作原理

ReduceTask的工作过程主要经历了5个阶段,分别是Copy阶段、Merge阶段、Sort阶段、Reduce阶段和Write阶段。

在这里插入图片描述

1) Copy阶段

Reduce会从各个MapTask上远程复制一片数据,并针对某一片数据,如果其大小超过一定的阈值,则写到磁盘上,否则直接放到内存中。

2) Merge阶段

在远程复制的同时,ReduceTask会启动两个后台进程,分别对内存和磁盘上的文件进行合并,以防止内存或者磁盘文件使用过多。

3) Sort阶段

为了将key相 同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己处理结果进行了局部排序,因此ReduceTask只需对所有数据进行一个归并排序。

4) Reduce阶段

对排序后的键值对调用reduce方法,最后把这些输出的键值对写入到HDFS中

5) Write阶段

reduce将计算结果写的HDFS上

4. Shuffle工作原理

Shuffle是MapReduce的核心,它用来确保每个reducer的输入都是按键排序的。它的性能高低直接决定了整个MapReduce程序的性能高低,map和reduce阶段都涉及到了shuffle机制。

在这里插入图片描述

三、MapReduce编程组件

1.InputFormat组件

主要用于描述输入数据的格式,它提供两个功能,分别是数据切分和为Mapper提供输入数据。

2.Mapper组件

Hadoop提供的Mapper类是实现Map任务的一个抽象基类,该基类提供了一个map()方法。

3.Reducer组件

Map过程输出的键值对,将由Reducer组件进行合并处理,最终的某种形式的结果输出。

4.Partitioner组件

Partitioner组件可以让Map对Key进行分区,从而可以根据不同的key分发到不同的Reduce中去处理,其目的就是将key均匀分布在ReduceTask上

5.Combiner组件

Combiner组件的作用就是对Map阶段的输出的重复数据先做一次合并计算,然后把新的(key,value)作为Reduce阶段的输入。

6.OutputFormat组件

OutputFormat是一个用于描述MapReduce程序输出格式和规范的抽象类。

四、MapReduce运行模式与性能优化策略

1.运行模式

1) 本地运行模式

在当前的开发环境模拟MapReduce执行环境,处理的数据及输出结果在本地操作系统。

2) 集群运行模式

把MapReduce程序打成一个Jar包,提交至Yarn集群上去运行任务。由于Yarn集群负责资源管理和任务调度,程序会被框架分发到集群中的节点上并发的执行,因此处理的数据和输出结果都在HDFS文件系统中。

2.性能优化策略

使用Hadoop进行大数据运算,当数据量极其大时,那么对MapReduce性能的调优重要性不言而喻,尤其是Shuffle过程中的参数配置对作业的总执行时间影响特别大,我们可以从五个方面对MapReduce程序进行性能调优,分别是数据输入、Map阶段、Reduce阶段、Shuffle阶段和其他调优属性方面。

1) 数据输入

在执行MapReduce任务前,将小文件进行合并,大量小文件会产生大量的map任务,增大map任务装载次数,而任务装载较耗时,从而导致MapReduce运行速度较慢。因此采用CombineTextInputFormat来作为输入,解决输入端大量的小文件场景。

2) Map阶段

  • 减少溢写(spill)次数
  • 减少合并(merge)次数
  • 在map之后,不影响业务逻辑前提下,先进行combine处理,减少 I/O

3) Reduce阶段

  • 合理设置map和reduce数
  • 设置map、reduce共存
  • 规避使用reduce
  • 合理设置reduce端的buffer

4) Shuffle阶段

Shuffle阶段的调优就是给Shuffle过程尽量多地提供内存空间,以防止出现内存溢出现象,可以由参数mapred.child.java.opts来设置,任务节点上的内存大小应尽量大。

5) 其他调优属性

MapReduce还有一些基本的资源属性的配置,这些配置的相关参数都位于mapred-default.xml文件中,我们可以合理配置这些属性提高MapReduce性能,例如合理设置MapTask、ReduceTask等参数。

五、本地模式执行MapReduce

单词计数为案例

1. 启动idea,新建一个maven项目

在这里插入图片描述

2. 添加pom依赖

在这里插入图片描述

3. 新建包

在这里插入图片描述

4. 新建mapper类

在这里插入图片描述

输入代码

在这里插入图片描述

5. 新建reducer类,输入代码

在这里插入图片描述

6. 新建一个主类

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

7.运行,查看结果

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

查看结果文件夹

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

8. 添加一个日志输出文件

在这里插入图片描述

六、集群模式执行MapReduce

1. 启动hadoop集群

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

在这里插入图片描述

2. 项目通过本地模式进行调试,确认运行正确

3. 保持mappper和reducer类不变,跟本地模式一致

4. 修改主类

该行注释

在这里插入图片描述

去掉盘符

在这里插入图片描述

5. 准备好用于单词计数的文本文件并上传hadoop集群

在根目录下创建data文件夹。

在这里插入图片描述

将本地文件上传到虚拟机上。

在这里插入图片描述

将虚拟机上的文件上传到集群上。

在这里插入图片描述

在集群上出现了文件。

在这里插入图片描述

6. 项目打成jar包

在这里插入图片描述

7. 把jar包上传的linux虚拟机hadoop001下

在这里插入图片描述

在这里插入图片描述

8. 通过集群模式运行jar包

获取主类的全合格类名

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

9. 查看结果

在这里插入图片描述

七、MapReduce的经典案例一-数据去重

1. 案例分析

数据清洗一个重要的操作就是数据去重,也就是去除重复的数据。

2. 准备好数据文件

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

3. 需求

对这两个文件的额内容进行去重操作,并将最终的结果合并为一个文件。

  • map阶段:将每一行作为key,value都可以设置为null
  • reduce阶段:不需要考虑每一个key有多少个value,把value设置为null就可以自动去重

4. 编写mapper类

在这里插入图片描述

5. 编写reducer类

在这里插入图片描述

6. 编写主类

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

7. 本地模式执行查看结果

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

八、MapReduce的经典案例之二-TopN

1. 案例分析

TopN分析法是指从研究对象中按照某一个指标进行倒序或正序排列,取出排名靠前的N个数据,并对这N个数据进行重点分析,这种方法在大数据分析中经常会用到。

2. 准备好数据文件

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

3. 需求分析

提取上述文本文件中的最大的5个数,并将最终结果汇总到一个文件中

TreeMap

4.新建一个maven项目

在这里插入图片描述

添加依赖

在这里插入图片描述

新建包

在这里插入图片描述

5. 编写Mapper类

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

6. 编写reduce类

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

7. 编写主类

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

8. 运行,查看结果

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

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

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

相关文章

5_虚拟机栈

虚拟机栈概述 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更多的指…

QML教程(一)

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

【文献阅读】能源受限的无人机和移动充电站进行持续监控的稳健规划

标题&#xff1a;Robust Planning for Persistent Surveillance With Energy-Constrained UAVs and Mobile Charging Stations 作者&#xff1a;Xiaoshan Lin, Yasin Yazıcıo˘glu , and Derya Aksaray 来源&#xff1a;IEEE ROBOTICS AND AUTOMATION LETTERS 摘要 本文考虑…

DO 语句

DATA MYCLASS;SET SASHELP.CLASS;IF WEIGHT<120 THEN NOTE Normal;ELSE DO;NOTE Heavy;/* 赋值成缺失值 */WEIGHT.;END; RUN;PROC PRINT; RUN; DATA B;DO k 11 TO 0 BY -3;IF k < 5 THEN i k;ELSE i k - 1;OUTPUT;END; RUN;PROC PRINT; RUN; DO WHILE:只要条件满足&am…

Python异常处理(七)

python学习之旅(七) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是异常 程序运行的过程中出现了错误 定义&#xff1a;在程序运行中,检测到一个错误&#xff0c;程序中止运行并且出现了一些错误的提示,也称作BUG 例如&#xff1a;读取一个不存在的文件f…

[操作系统]进程

目录1.进程的概念2.如何管理进程3.进程的调度4.并行和并发5.进程调度需要使用的属性6.进程之间的通信7.进程和线程的区别操作系统是一个软件,对下要管理好各种硬件设备,对上要给各种软件提供稳定的运行环境.这篇博客主要讲解操作系统如何管理进程。 1.进程的概念 进程就是跑起…

Golang - 时间处理总结

Golang - 时间处理总结1 获取时间对象1.1 获取当前对象对象1.2 根据指定时间返回 time.Time 类型1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作1.3 日期字符串解析成 time.Time 类型解析的时候需要特别注意时区的问题&#xff1a;2 时间对象转时间字符串3 时区4 时间…

严格模式和高阶函数

1、什么是严格模式 JavaScript 除了提供正常模式外&#xff0c;还提供了严格模式&#xff08;strict mode&#xff09;。 ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支…

【C++】-- C++11 - 右值引用和移动语义(上万字详细配图配代码从执行一步步讲解)

目录 左值引用和右值引用 右值引用使用场景和意义 移动语义 传值返回问题 移动构造 移动赋值 总结 解决传值插入问题 完美转发 模板中的&&万能引用 完美转发std::forward 完美转发实际中的使用场景 左值引用和右值引用 其实在C11之前&#xff0c;C没有左右…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道&#xff0c;在一台运行着的现代计算机上会发生很多事情&#xff1a;应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前&#xff0c;不同的进程可…

为什么深度神经网络这么难训练

目录 1、深度网络训练困难的原因&#xff1a; 2、消失的梯度问题 3、不稳定的梯度问题 参考文章&#xff1a;为什么很难训练深度神经网络&#xff1f; - 腾讯云开发者社区-腾讯云 1、深度网络训练困难的原因&#xff1a; 训练速度慢 在深度网络中&#xff0c;不同的层学习…

《UEFI内核导读》UEFI Firmware Storage简介

敬请关注&#xff1a;“固件C字营 UEFI固件一般存储在被称之为“固件仓库”的非易失性存储器中&#xff0c;简称为FD&#xff08;固件设备&#xff09;&#xff0c;当前主流的存储介质是NorFlash它拥有非易失性、XIP以及可二次编程的特性。 固件设备可以分为物理设备和逻辑设备…

linux如何发送查收邮件的详解

一&#xff0c;linux用户发送给linux中的其它用户 1&#xff0c;使用命令 yum install sendmail -y安装sendmail软件 2&#xff0c;使用yum install mailx -y安装 mailx软件 3&#xff0c;使用命令systemctl start sendmail启动sendmail&#xff08;此过程消耗时间&#xff09…

你在项目里遇到的最大困难是什么,如何解决的?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/Tyson0314/Java-…

Weiler-Atherton 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、算法总结 一、算法介绍 Weiler Atherton多边形裁剪算法是一种允许裁剪凹面算法的算法。与 Sutherland-Hodgman 多边形裁剪算法最主要的区别是&#xff0c;该算法能够裁剪凹多边形&#xff0c;并不留下任何残留物。 裁剪示意图&#xff1…

关于微服务,这些你都了解吗-微服务介绍

文章目录一 认识微服务1.1 什么是微服务1.2 微服务的特点1.3 微服务诞生背景1.4 微服务架构的优势二 微服务生态1.1 硬件层1.2 通信层1.3 应用平台层1.4 微服务层三 微服务详解1.1 微服务架构1.2 服务注册和发现1.3 rpc调用和服务监控四 微服务与DDD1.1 什么是DDD1.2 DDD作用1.…

python快速实现某东方视频解密wasm算法

开始之前请大家先去了解一下 wasm这种技术(可以百度搜索一下 WebAssembly是什么?) 现在开始.... 1&#xff0c;先看一张图 首先写一个本地加载wasm的方法 00043706.wasm就是当前网站load的wasm库,如果遇到报错,请联系我&#xff0c;文章最后有qq联系方式 let u {} functio…

C++类和对象2:默认成员函数

我们通过this指针可以看出来&#xff0c;C其实隐藏了非常多的东西&#xff0c;很多事情它会在编译的时候包揽&#xff0c;那么作为最为重要的类和对象&#xff0c;它是不是还隐含了更多我们平常看不到的东西呢&#xff1f; 我们创建一个空类里面啥也不放。 class Text{}; 看上…

2_类加载子系统

目录 概述 类加载器子系统作用 类的加载过程 加载阶段 加载class文件的方式 链接阶段 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 扩展类加载器&#xff08;Extension ClassLoader&#xff09; 应用程序类加载器&#xff08;系统类加…