大数据课程D4——hadoop的MapReduce

news2024/11/17 17:40:59

文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州

 ▲ 本章节目的

⚪ 了解MapReduce的作用和特点;

⚪ 掌握MapReduce的组件;

⚪ 掌握MapReduce的Shuffle;

⚪ 掌握MapReduce的小文件问题;

⚪ 掌握MapReduce的压缩机制;

⚪ 掌握MapReduce的推测执行机制;

⚪ 掌握MapReduce的数据倾斜问题;

一、简介

1. 概述

1. MapReduce是Hadoop提供的一套进行分布式计算机制。

2. MapReduce是Doug Cutting根据Google的论文<The Google MapReduce>来仿照实现的。

3. MapReduce会将整个计算过程拆分为2个阶段:Map阶段和Reduce阶段。在Map阶段,用户需要考虑对数据进行规整和映射;在Reduce阶段,用户需要考虑对数据进行最后的规约。

2. 特点

1. 优点

a. 易于编程:MapReduce提供了相对简单的编程模型。这就保证MapReduce相对易于学习。用户在使用的时候,只需要实现一些接口或者去继承一些类,覆盖需要实现的逻辑,即可实现分布式计算。

b. 具有良好的可扩展性:如果当前集群的性能不够,那么MapReduce能够轻易的通过增加节点数量的方式来提高集群性能。

c. 高容错性:当某一个节点产生故障的时候,MapReduce会自动的将这个节点上的计算任务进行转移而整个过程不需要用户手动参与。

d. 适合于大量数据的计算,尤其是PB级别以上的数据,因此MapReduce更适合于离线计算。

2. 缺点

a. 不适合于实时处理:MapReduce要求处理的数据是静态的,实时的特点在于数据池是动态的。

b. 不擅长流式计算:MapReduce的运行效率相对较低,在处理流式计算的时候,效率更低。

c. 不擅长DAG(有向图)运算:如果希望把上一个MapReduce的运行结果作为下一个MapReduce的输入数据,那么需要手动使用工作流进行调度,而MapReduce本身并没有这种调度功能。

3. 入门案例

1. 案例:统计文件中每一个字符出现的次数(文件:characters.txt)。

2. Hadoop对Windows系统的兼容性不强,所以在Windows中运行Hadoop程序的时候需要添加一些其他的配置 - 配置之后,需要双击winutils.exe,如果出现一个黑色窗口一闪而过,那么没有任何问题;如果双击winutils.exe之后报错,那么将jar目录下的msvcr120.dll文件放到C:\\Windows\\System32目录下,然后再次双击winutils.exe工具,查看是否报错。

3. 配置环境变量:

a. 新建HADOOP_HOME。

 

b. 修改Path。

 

 c. 新建HADOOP_USER_NAME。

4. 如果运行程序的时候,出现了null/bin/winutils.exe错误,那么解决方案:

a. 先检查环境变量是否配置正确。

b. 如果环境变量配置正确,但是运行程序依然报错,那么可以在Driver类中添加代码:System.setProperty("hadoop.home.dir", "Hadoop的解压路径")。

5. 如果运行程序的时候,出现了NativeIO$Windows,那么说明Hadoop和Windows系统兼容性不够强,在运行程序的时候,检查出错,解决方案如下:

a. 先检查环境变量是否配置正确。

b. 如果环境变量配置正确,那么可以将Hadoop解压目录的bin目录下的hadoop.dll文件拷贝到C:\\Windows\\System32目录下,再次运行程序查看结果是否正确。

c. 如果上述两种方案依然不能解决问题,那么需要在当前工程下建好对应的包,然后将jar目录下的NativaIO.java拷贝到这个包下。

6. 练习:

a. 统计一个文件中单词出现的次数(文件:words.txt)。

b. IP去重(文件:ip.txt)。

二、组件

1. Writable - 序列化

 1. 在MapReduce中,要求被处理的数据能够被序列化。MapReduce提供了单独的序列化机制 - MapReduce底层的序列化机制是基于AVRO实现的。为了方便操作,在AVRO的基础上,MapReduce提供了更简单的序列化形式 - 只需要让被序列化的对象对应的类实现Writable接口,覆盖其中的write和readFields方法。

2. MapReduce针对常见类型提供了基本的序列化类。

Java类

MapReduce的序列化类型

Byte

ByteWritable

Short

ShortWritable

Int

IntWritable

Long

LongWritable

Float

FloatWritable

Double

DoubleWritable

Boolean

BooleanWritable

String

Text

Array

ArrayWritable

Map

MapWritable

3. 在MapReduce中,要求被序列化的对象对应的类中必须提供无参构造。

4. 在MapReduce中,要求被序列化的对象的属性值不能为null。

5. 案例:统计一个人花费的上行流量和下行流量(文件:flow.txt)。

2. Partitioner - 分区

1. 在MapReduce中,分区用于将数据按照指定的条件来进行分隔,本质上就是对数据进行分类。

2. 在MapReduce中,如果不指定,那么默认使用的是HashPartitioner。

3. 实际过程中,如果需要指定自己的分类条件,那么需要自定义分区。

4. 案例:分地区统计每一个人花费的总流量(文件:flow.txt)。

5. 在MapReduce中,需要对分区进行编号,编号从0开始依次网上递增。

6. 在MapReduce中,如果不指定,那么默认只有1个ReduceTask,每一个ReduceTask会对应一个结果文件。也因此,如果设置了Partitioner,那么需要给定对应数量的ReduceTask - 分区数决定了ReduceTask的数量。

3. WritableComparable - 排序

1. 在MapReduce中,会自动的对放在键的位置上的元素进行排序,因此要求放在键的位置上的元素对应的类必须实现Comparable。考虑到MapReduce要求被传输的数据能够被序列化,因此放在键的位置上的元素对应的类要考虑实现 - WritableComparable。

2. 案例:对结果文件中的数据按照下行流量来进行排序(目录:serial_flow)。

3. 在MapReduce中,如果需要对多字段进行排序,那么称之为二次排序。

4. 案例:先按照月份进行升序排序;如果是同一个月中,按照利润进行降序排序(文件:profit.txt)。

4. Combiner - 合并

1. 可以在Driver类中通过job.setCombinerClass(XXXReducer.class);来设置Combiner类。

2. Combiner实际上是在不改变计算结果前提的下来减少Reducer的输入数据量。

3. 在实际过程中,如果添加Combiner,那么可以有效的提高MapReduce的执行效率,缩短MapReduce的执行时间。但是需要注意的是,并不是所有的场景都适合于使用Combiner。可以传递运算的场景,建议使用Combiner,例如求和、求积、最值、去重等;但是不能传递的运算,不能使用Combiner,例如求平均值。

5. InputFormat - 输入格式

1. InputFormat发生在MapTask之前。数据由InputFormat来负责进行切分和读取,然后将读取到的数据交给MapTask处理,所以InputFormat读取出来的数据是什么类型,MapTask接收的数据就是什么类型。

2. 作用:

a. 用于对文件进行切片处理

b. 提供输入流用于读取数据

3. 在MapReduce中,如果不指定,那么默认使用是TextInputFormat,而TextInputFormat继承了FileInputFormat。默认情况下,FileInputFormat负责对文件进行切片处理;TextInputFormat负责提供输入流来读取数据。

4. FileInputFormat在对文件进行切片过程中的注意问题:

a. 切片最小是1个字节大小,最大是Long.MAX_VALUE。

b. 如果是一个空文件,则整个文件作为一个切片来进行处理。

c. 在MapReduce中,文件存在可切与不可切的问题。大多数情况下,默认文件是可切的;但是如果是压缩文件,则不一定可切。

d. 如果文件不可切,无论文件多大,都作为一个切片来进行处理。

e. 在MapReduce中,如果不指定,Split和Block等大。

f. 如果需要调小Split,那么需要调小maxSize;如果需要调大Split,那么需要调大minSize。

 

g. 在切片过程中,需要注意阈值SPLIT_SLOP=1.1。

5. TextInputFormat在读取数据过程中需要注意的问题:

a. TextInputFormat在对文件进行处理之前,会先判断文件是否可切:先获取文件的压缩编码,然后判断压缩编码是否为空。如果压缩编码为空,则说明该文件不是压缩文件,那么默认可切;如果压缩编码不为空,则说明该文件是一个压缩文件,会判断这是否是一个可切的压缩文件。

b. 在MapReduce中,默认只有BZip2(.bz2)压缩文件可切。

c. 从第二个MapTask开始,会从当前切片的第二行开始处理,处理到下一个切片的第一行;第一个MapTask要多处理一行数据;最后一个MapTask要少处理一行数据。这样做的目的是为了保证数据的完整性。

 6. 自定义输入格式:定义一个类继承InputFormat,但是考虑到切片过程相对复杂,所以可以考虑定义一个类继承FileInputFormat,而在FileInputFormat中已经覆盖了切片过程,只需要考虑如何实现读取过程即可(文件:score.txt)。

7. 多源输入:在MapReduce中,允许同时指定多个文件作为输入源,而且这多个文件可以放在不同的路径下。这多个文件的数据格式可以不同,可以为每一个文件单独指定输入格式。

6. OutputFormat - 输出格式

1. OutputFormat发生在ReduceTask之后,接收ReduceTask产生的数据,然后将结果按照指定格式来写出。

2. 作用:

a. 校验输出路径,例如检查输出路径不存在。

b. 提供输出流用于将数据写出。

3. 在MapReduce中,如果不指定,默认使用的是TextOutputFormat。 TextOutputFroamt继承了FileOutputFormat。其中,FileOutputFormat负责对输出路径进行校验,TextOutputFormat则是对数据进行写出。

4. 在MapReduce中,也支持自定义输出格式以及多源数据,但是注意,实际开发中自定义输出格式以及多源输出用的非常少。

三、Shuffle

1. Map端的Shuffle

1. 当MapTask调用map方法处理数据之后,会将处理结果进行写出,写出到MapTask自带的缓冲区中。每一个MapTask都会自带一个缓冲区,本质上是一个环形的字节数组,维系在内存中,默认大小是100M。

2. 数据在缓冲区中会进行分区、排序,如果指定了combiner,那么还会进行合并。这次排序是将完全杂乱没有规律的数据整理成有序的数据,所以使用的是快速排序。

3. 当缓冲区使用达到指定阈值(默认是0.8,即缓冲区使用达到80%)的时候,会进行spill(溢写),产生一个溢写文件。因为数据在缓冲区已经分区且排序,所以产生的单个溢写文件中的数据是分好区且排好序的。

4. 溢写之后,MapTask产生的数据会继续写到缓冲区中,如果再次达到条件,会再次进行溢写。每一个溢写都会产生一个新的溢写文件。多个溢写文件之间的数据是局部有序但整体无序的。

5. 当所有数据都处理完成之后,那么MapTask会将所有的溢写文件进行合并(merge),合并成一个大的结果文件final out。在merge的时候,如果有数据依然在缓冲区中,那么会将缓冲区中的数据直接merge到final out中。

6. 在merge过程中,数据会再次进行分区且排序,因此final out中的数据是分好区且排好序的。如果溢写文件个数达到3个及以上,并且指定了Combiner,那么在merge过程中还会进行combine。这次排序是将局部有序的数据整理成整体有序的状态,所以采用的是归并排序。

7. 注意问题:

a. 缓冲区设置为环形的目的减少重复寻址的次数。

b. 设置阈值的目的是为了降低阻塞的几率。

c. 溢写过程不一定会产生。

d. 原始数据的大小并不能决定溢写次数。

e. 溢写文件的大小受序列化因素的影响。

 2. Reduce端的Shuffle

1. 当ReduceTask达到启动阈值(默认是0.05,即当有5%的MapTask结束)的时候,就会启动来抓取数据。 

2. ReduceTask启动之后,会在当前服务器上来启动多个(默认是5个)fetch线程来抓取数据。

3. fetch线程启动之后,会通过HTTP请求中的get请求来获取数据,在发送请求的时候会携带分区号作为参数。

4. fetch线程会将抓取来的数据临时存储到本地磁盘上,形成一个个的小文件。

5. 当所有的fetch抓取完数据之后,ReduceTask会将这些小文件进行merge,合并成一个大文件。在merge过程中,会对数据再次进行排序。这次排序是将局部有序的数据整理成整体有序的状态,所以采用的是归并排序。

6. merge完成之后,ReduceTask会将相同的键对应的值分到一组去,形成一个(伪)迭代器(本质上是一个基于迭代模式实现的流),这个过程称之为分组(group)。

7. 分组之后,每一个键调用一次reduce方法。

3. MapReduce执行流程 

 4. Shuffle优化

1. 适当的增大缓冲区。实际过程中,可以缓冲区设置为250M~400M之间。

2. 增加Combiner,但是不是所有场景都适合于使用Combiner。

3. 可以考虑对结果进行压缩传输。如果网络条件比较差,那么可以考虑将final out文件压缩之后再传递给ReduceTask,但是ReduceTask手到数据之后需要进行解压,所以这种方案是在网络传输和压缩解压之间的一种取舍。

4. 适当的考虑fetch线程的数量。

四、扩展

1. 小文件问题

1. 在大数据环境下,希望所处理的文件都是大文件,但是在生产环境中,依然不可避免的会产生很多小文件。

2. 小文件的危害:

a. 存储:每一个小文件在HDFS上都会对应一条元数据。如果有大量的小文件,那么在HDFS中就会产生大量的元数据。元数据过多,就会占用大量的内存,还会导致查询效率变低。

b. 计算:每一个小文件都会对应一个切片,每一个切片会对应一个MapTask(线程)。如果有大量的小文件,就会产生大量的切片,就会导致产生大量的MapTask。如果MapTask过多,那么就会致使服务器的线程的承载压力变大,致使服务器产生卡顿甚至崩溃。

3. 到目前为止,市面上针对小文件的处理手段无非两种:合并和打包。

4. Hadoop针对小文件提供了原生的打包手段:Hadoop Archive,将指定小文件打成一个har包。

2. 压缩机制

1. MapReduce支持对数据进行压缩:可以对MapTask产生的中间结果(final out)进行压缩,也支持对ReduceTask的输出结果进行压缩。

2. 在MapReduce中,默认支持的压缩格式有:Default,BZip2,GZip,Lz4,Spappy,ZStandard,其中比较常用的是BZip2。

3. 推测执行机制

1. 推测执行机制本质上是MapReduce针对慢任务的一种优化。慢任务指的是其他任务都正常执行完,但是其中几个任务依然没有结束,那么这几个任务就称之为慢任务。

2. 一旦出现了慢任务,那么MapReduce会将这个任务拷贝一份放到其他节点上,两个节点同时执行相同的任务,谁先执行完,那么它的结果就作为最终结果;另外一个没有执行完的任务就会被kill掉。

3. 慢任务出现的场景:

a. 任务分配不均匀。

b. 节点性能不一致。

c. 数据倾斜。

3. 在实际生产过程中,因为数据倾斜导致慢任务出现的机率更高,此时推测执行机制并没有效果反而会占用更多的集群资源,所以此时一般会考虑关闭推测执行机制。

4. 推测执行机制配置(放在mapred-site.xml文件中):

<property>

<name>mapreduce.map.speculative</name>

<value>true</value>

</property>

<property>

<name>mapreduce.reduce.speculative</name>

<value>true</value>

</property>

4. 数据倾斜

1. 数据倾斜指的是任务之间处理的数据量不均等。例如统计视频网站上各个视频的播放量,那么此时处理热门视频的任务索要处理的数据量就会比其他的任务要多,此时就产生了数据倾斜。

2. Map端的数据倾斜的产生条件:多源输入、文件不可切、文件大小不均等。一般认为Map端的倾斜无法解决。

3. 实际开发中,有90%的数据倾斜发生在了Reduce端,直接原因就是因为是对数据进行分类,本质原因是因为数据本身就有倾斜的特性,可以考虑使用二阶段聚合的方式来处理Reduce端的数据倾斜。

5. join

1. 如果在处理数据的时候,需要同时处理多个文件,且文件相互关联,此时可以考虑将主要处理的文件放在输入路径中,将其他关联文件缓存中,需要的时候再从缓存中将文件取出来处理。

2. 案例:统计每一天卖了多少钱。

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

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

相关文章

Vue项目引入图片的两种场景和三种方式

场景一&#xff1a;public目录下的图片 public目录 public目录下的图片引入方式&#xff1a; Bash <!--/images/图片名称&#xff0c;这种属于绝对路径&#xff0c;/指向public目录 --> <img src"/images/image.png"> 场景二&#xff1a;在src目录…

【Spring】更简单的读取和存储对象,五大类注解

经过前面的学习&#xff0c;我们已经可以实现基本的 Spring 读取和存储对象的操作了&#xff0c;但在操作的过程中我们发现读取和存储对象并没有想象中的那么 “简单”&#xff0c;所以接下来我们要学习更加简单的操作 Bean 对象的方法 在 Spring 中想要更简单的存储和读取对象…

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…

YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)

YOLOv5&#xff1a;使用7.0版本训练自己的实例分割模型&#xff08;车辆、行人、路标、车道线等实例分割&#xff09; 前言前提条件相关介绍使用YOLOv5-7.0版本训练自己的实例分割模型YOLOv5项目官方源地址下载yolov5-7.0版源码解压目录结构 准备实例分割数据集在./data目录下&…

使用python库uvicorn替代Nginx发布Vue3项目

目录 一、Vue3项目打包 二、将打包文件放到python项目 三、配置uvicorn服务 四、启动服务 【SpringBoot版传送门&#xff1a;使用SpringBoot替代Nginx发布Vue3项目_苍穹之跃的博客-CSDN博客】 一、Vue3项目打包 &#xff08;博主vue版本&#xff1a;3.2.44&#xff09; 由…

论文精读之BERT

目录 1.摘要&#xff08;Abstract&#xff09; 2.引言&#xff08;Introduction&#xff09;&#xff1a; 3.结论&#xff08;Conlusion&#xff09;&#xff1a; 4.BERT模型算法: 5.总结 1.摘要&#xff08;Abstract&#xff09; 与别的文章的区别是什么:BERT是用来设计去…

Acwing.285 没有上司的舞会(动态规划)

题目 Ural大学有N名职员&#xff0c;编号为1~N。 他们的关系就像—棵以校长为根的树&#xff0c;父节点就是子节点的直接上司。每个职员有一个快乐指数&#xff0c;用整数H给出&#xff0c;其中1≤i≤N。 现在要召开一场周年庆宴会&#xff0c;不过&#xff0c;没有职员愿意和…

js通过下标获取对象值

var a {1: a,2: b,3: c,4: d}var keys Object.keys(a)var values Object.values(a)console.log(keys , values)# 建议使用 console.log(Object.keys(a)[2] : Object.values(a)[2])#无意义 console.log(Object.keys(a)[3] : a[Object.keys(a)[3]])

下级平台级联视频汇聚融合平台EasyCVR,层级显示不正确的原因排查

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…

CAN转EtherNet/IP网关can协议是什么意思

你是否曾经遇到过不同的总线协议难以互相通信的问题&#xff1f;远创智控的YC-EIP-CAN网关为你解决了这个烦恼&#xff01; 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备&#xff0c;它能够将各种CAN总线和ETHERNET/IP网络连接起来&#xff0c;解决不同总线协议之间的通信…

C语言队列实现参考示例

C语言队列实现参考示例 目录 C语言队列实现参考示例前言1 代码实现1.1 实现方案1.2 代码编写 结束语 前言 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;…

Java 多线程练习

目录 1.定时器操作&#xff08;实现电脑定时关机&#xff09;。 2. 每个月的月末(02:00:00) 执行一次代码 3. 模拟售票 4. 用15个线程实现&#xff0c;求123456789 之间放-和为100的表达式&#xff08;11个结果&#xff09;&#xff0c;如果一个线程求出结果&#xff0c; 立…

【LeetCode】383. 赎金信

题目&#xff1a;383. 赎金信 由于此题只含有小写字母,并且magazine里面的字母不可重复使用. 故首先用一个长度为26的整形数组记录magazine里字母出现的次数。 再用这个整形数组跟ransomeNote进行遍历比较&#xff0c;当数组中出现-1时&#xff0c;说明false,否则true. 代码&am…

大数据Flink(五十二):Flink中的批和流以及性能比较

文章目录 Flink中的批和流以及性能比较 ​​​​​​​​​​​​​​一、Flink中的批和流

python与深度学习(九):CNN和cifar10

目录 1. 说明2. cifar10实战2.1 导入相关库2.2 加载数据2.3 数据预处理2.4 数据处理2.5 构建网络模型2.6 模型编译2.7 模型训练2.8 模型保存2.9 模型评价2.10 模型测试2.11 模型训练结果的可视化 3. cifar10的CNN模型可视化结果图4. 完整代码5. 改进后的代码和结果 1. 说明 本…

史上最强,Python自动化测试框架整理,搭建框架看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是测试框架呢…

明星代言注意事项:确保代言活动成功的关键要素

对于商家而言&#xff0c;聘请明星代言自己的品牌产品&#xff0c;无非就是为了利用明星的人气为品牌加持热度&#xff0c;吸引明星粉丝和消费者的关注&#xff0c;增加产品转化&#xff0c;塑造品牌形象。明星代言是一项重要的市场营销策略&#xff0c;但同时也需要注意一些关…

美化与保护合二为一:3个功能厉害的水印app

每个人都有自己珍视的照片回忆&#xff0c;但在互联网上共享这些照片时&#xff0c;担心他人未经允许使用它们是很常见的。幸运的是&#xff0c;现在有了加水印软件&#xff0c;我们可以以有效的方式保护我们的珍贵照片。通过在图片上添加个性化的水印&#xff0c;你可以在不影…

textarea文本高亮选中

最近在实现原文/译文句段高亮对比显示&#xff0c;和有道翻译类似&#xff0c;如下图所示&#xff1a; 最初的解决方案是采用富文本编辑器&#xff0c;把所有句段信息都用HTML标签包裹&#xff0c;操作空间比较大&#xff0c;页面上需要的功能几乎都可以实现&#xff0c;但是由…

串口通讯接口类型:TTL、RS232和RS485(电平标准)

串口通讯接口类型&#xff1a;TTL、RS232和RS485 在串口通信中&#xff0c;常用的接口类型包括TTL、RS-232和RS-485&#xff0c;TTL、RS-232、RS422、RS-485是指的电平标准(电信号)。 通信协议规定了数据传输的规则和格式&#xff0c;包括数据的起始位、停止位、数据位数、校…