文章目录

  • 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. 运行,查看结果

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. 运行,查看结果


Hadoop高手之路5-MapRreduce相关推荐

  1. Hadoop高手之路1—Hadoop简介

    文章目录 初识Hadoop 1.大数据概述 1.1什么是大数据 1.2大数据的特征 1.3研究大数据的意义 2.大数据的应用场景 2.1医疗行业的应用 2.2金融行业的应用 2.3零售行业的应用 3. ...

  2. Hadoop高手之路4-HDFS

    文章目录 一.HDFS的简介 1. HDFS的演变 1) 传统的文件系统 2) 分布式 3) hdfs 2. HDFS的概念 1) NameNode(名称节点) 2) DataNode(数据节点) 3 ...

  3. 王家林 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程...

    这一讲主要深入使用HDFS命令行工具操作Hadoop分布式集群,主要是通过实验的配置hdfs-site.xml文件的心跳来测试replication具体的工作和流程. 通过HDFS的心跳来测试repl ...

  4. 王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第五讲Hadoop图文训练课程:解决典型Hadoop分布式集群环境搭建问题

    王家林的"云计算分布式大数据Hadoop实战高手之路---从零开始"的第五讲Hadoop图文训练课程:解决典型Hadoop分布式集群环境搭建问题 参考文章: (1)王家林的&quo ...

  5. Hbase高手之路 -- 第五章 -- HBase的Java API编程

    Hbase高手之路 – 第五章 – HBase的Java API编程 一. 需求与数据集 某自来水公司,需要存储大量的缴费明细数据,以下截取了缴费明细的一部分内容: 因为缴费明细的数据记录非常庞大,该 ...

  6. Hbase高手之路 -- 第二章 -- HBase集群的搭建

    Hbase高手之路 – 第二章 – HBase集群的搭建 一. 下载并安装 1. 下载安装包 2. 上传服务器 3. 解压 tar -zxvf hbase-2.4.10-bin.tar.gz -C . ...

  7. HBase高手之路1-Hbase简介

    文章目录 HBase高手之路1-Hbase简介 一.什么是HBase 1. HBase简介 2. HBase的发展过程 二.HBase特点 1. 海量存储 2. 列式存储 3. 极易扩展 4. 高并发 ...

  8. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  9. 安卓高手之路 图形系统(4 Measure的算法)

    安卓高手之路 图形系统(4 Measure的算法) - 修补C++ - ITeye技术网站 Java代码   /** * Does the hard part of measureChildren:  ...

最新文章

  1. 通过Auto Layout深入了解SizeClasses的好处和使用
  2. WinCE 和Win Mobile的关系
  3. 《The Age of Surge》作者访谈
  4. pytorch笔记:Dataloader
  5. ios 1 cocoa
  6. 姓名性别电话邮箱html表单,HTML form标签语法、属性、规范和示例详细说明-立地货...
  7. threejs- z-fighting 问题
  8. java 16进制整数,Java将整数转换为十六进制整数
  9. C++语言基础 —— STL —— 算法 —— 排列组合算法
  10. donotage标记、MTU及MTU不匹配问题、OSPF邻居状态记录
  11. GP学习(三)—How to run a geoprocessing tool
  12. 读取 Excel 之 Epplus
  13. Hadoop技术内幕:深入解析YARN架构设计与实现原理pdf
  14. Enterprise Library Policy Injection Application Block 之二: PIAB设计和实现原理
  15. 【DVRP】基于matlab蚁群算法求解带距离的VRP问题【含Matlab源码 1040期】
  16. 介绍几款最好使用的模拟器怎么下载。
  17. 行政区划分与省直辖县级市
  18. Python之通过API获取数据库数据及图片
  19. 芯动力——硬件加速设计方法——学习笔记(1)
  20. java offset什么意思_java – “offset或count可能接近-1 1”这是什么意思

热门文章

  1. Go函数及与函数相关机制 【Go语言圣经笔记】
  2. oracle 度分秒转小数点,角度的度分秒与小数点格式互相转换
  3. 层次分析法【AHP】
  4. 【强化学习论文合集】十三.2018机器人与自动化国际会议论文(ICRA2018)
  5. [办公自动化]如何选择投影仪的吊装距离
  6. Docker 查看镜像信息
  7. Everything使用指南
  8. golang:go+liteIDE在windows环境配置(详细配置+出现问题解决说明)
  9. 使用python解决数独问题
  10. html纵向表头,HTML table固定表头