mapReduce知识点总结
mapreduce概述
mapreduce定义:
MapReduce主要用于执行分布式运算任务,并被广泛应用于基于Hadoop的数据分析项目中。
MapReduce的主要功能体现在将用户编写的应用程序代码与系统自带的默认组件成功整合,并形成一个完整的分布式计算框架,在Hadoop集群环境中实现高效的并行处理。
mapreduce优缺点:
优点:
1. MapReduce易于编程
通过简单地实现一些接口即可构建一个分布式系统...可以通过简单的接口实现即可构建这样一个分散式系统,在这种情况下该分散式系统能够部署在众多低成本的个人计算机上运行...这表明它比传统的顺序编程方法更能有效地减少开发工作量
这种简单的串行程序显得非常普通。正是因为这一特性,MapReduce编程迅速得到普及。
2.良好的扩展性
当你的计算资源不足以满足需求时,你可以通过部署更多的设备来提升其处理能力
3.高容错性
其最初的目的就在于让程序能够在经济实惠的个人计算机上实现部署,并且这种设计必须具备极强的容错能力。例如当某台机器发生故障时,该系统会自动将负载转移至剩余正常运行的设备上进行处理。
被分配到另一个节点运行,从而避免该任务失败,同时整个过程将由Hadoop自动完成,无需人工干预.
4.适合PB级以上海量数据的离线处理
可以实现上干台服务器集群并发工作,提供数据处理能力。
缺点:
1.不擅长实时计算
MapReduce无法像MySQL-样,在毫秒或者秒级内返回结果。
2.不擅长流式计算
流式计算处理的对象是实时变化的,而MapReduce处理的对象是一批固定的不变的数据,无法进行动态调整;这是因为MapReduce的设计原理要求其处理的数据源必须保持固定不变
3.不擅长DAG (有向图)计算
多个应用程序之间存在依赖关系,在这种情况下,每一个后续的应用程序的输入都是前一个程序的输出。MapReduce并不是无法完成任务而是通过执行后的结果来进行处理。
的输出结果都会写入到磁盘,会造成大量的磁盘IO ,导致性能非常的低下。
MapReduce核心编程思想
1)分布式的运算程序往往需要分成至少2个阶段。。
2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。。
在第二个阶段中,并行运行的ReduceTask相互之间没有关联;但它们的数据都来源于所有MapTask并行实例产生的输出结果。
MapReduce编程模型仅支持一个Map阶段和一个Reduce阶段。如果用户的业务需求极为复杂,则必须使用多个MapReduce任务来处理,并以顺序方式进行处理。
总结:分析WordCount数据流走向深入理解MapReduce核心思想。。
MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程 :
1 ) MrAppMaster :负责整个程序的过程调度及状态协调。
2 ) MapTask :负责Map阶段的整个数据处理流程。
3 ) ReduceTask :负责Reduce阶段的整 个数据处理流程。
MapReduce编程规范
1. Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2) Mapper的输入数据是KV对的形式( KV的类型可自定义)
(3) Mapper中的业务逻辑写在map0方法中
(4) Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map0方法(MapTak进程)对每一-个K,V>调用一-次
2. Reducer阶段
( 1 )用户自定义的Reduce要继承自己的父类
( 2 ) Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
( 3 ) Reducer的业务逻辑写在reduce0方法中
( 4 ) ReduceTask进程对每- 组相同k的<k,v>组调用一 次reduce0方法
3. Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群, 提交的是
封装了MapReduce程序相关运行参数的job对象
hadoop序列化
序列化概述
什么是序列化
序列化即为将内存中的对象编码为字节序列(或采用其他数据传输协议),便于其在磁盘上实现持久化存储以及在网络传输中使用。
反序列化就是说接收自网络的数据流(或其他常用的数据传输协议)或者其他存储介质上的持久化数据,解析为内存中的对象实例。
为什么要序列化
通常情况下,动态的对象仅存在于内存中,一旦关机或断电后就不再存在。然而这些动态的对象仅限于本地进程,无法在另一台远程计算机上访问相应的数据资源。
列化可以存储"活的”对象,可以将“活的"对象发送到远程计算机。
为什么不用Java的序列化
Java的序列化主要依靠Serializable这一高级序列化工具包,在这种机制下,每个被序列化的对象都会携带多种验证数据(如各种校验信息、Header字段以及继承体系等),这种特性虽然提供了数据完整性保障但会导致在实际应用中难以实现高效的网络传输。
传输。所以, Hadoop自己开发了一套序列化机制 ( Writable )。
Hadoop序列化特点:
(1)紧凑:高效使用存储空间。
(2)快速:读写数据的额外开销小。
(3)可扩展:随着通信协议的升级而可升级
(4)互操作:支持多语言的交互
自定义bean对象实现序列化接口(Writable)
具体实现bean对象序列化步骤如下7步。
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方便后续用。
当需要将自定义的Bean放置到key中进行传输时,则必须实现Comparable接口。这是因为MapReduce框架中的Shuffle过程要求在传递数据前对所有记录的key进行排序作为前提条件
MapReduce开发总结
1.输入数据接口: InputFormat
(1)默认使用的实现类是: TextInputFormat
TextnputFormat的功能逻辑实现了每次读取单行文本内容并将每行的起始偏移位置与该行的内容配对返回
在KeyValueTextnputFormat格式中, 每条记录独立成行, 按照分隔符拆分为键值对形式存储。其中,默认采用换行键(\t)作为分隔符
(4) NlineInputFormat按照指定的行数N来划分切片。
CombineTextInputFormat 可以将多个小文件整合为一个分段数据, 优化处理效率
(6)用户还可以自定义InputFormat.小子下决办小陛6的比火
2.逻辑处理接口: Mapper
用户根据业务需求实现其中三个方法: map() setup() cleanup()
3. Partitioner分区
该类有默认实现了HashPartitioner类,默认实现其逻辑为将key的哈希值及umReduces计算出相应的分区号; 其中, key.hashCode() & Integer.MAX_VALUE % numPartitions用于确定具体的分区。
(2)如果业务.上有特别的需求,可以自定义分区。
4. Comparable排序
当使用自定义类对象作为键进行输出时,则必须实现WritableComparable接口,并重写其compareTo方法。
(2)部分排序:对最终输出的每一 个文件进行内部排序。
(3)全排序:对所有数据进行排序,通常只有一个Reduce.
(4)二次排序:排序的条件有两个。
5. Combiner合并
使用Combiner进行合并能够优化程序执行效率的同时降低IO传输。在操作过程中必须确保原有业务处理不受影响。
6. Reduce端分组:
GroupingComparator是一种基于键值的分组器,在归并操作中对键值进行分类处理。它适用于以下场景:当接收的键值是Bean对象类型时,并且希望根据其中一到多个字段(但所有字段之间存在差异)将相似(但不完全相同的)键值分配到同一个归并操作中时,则可以采用基于键值的排序策略来进行分类处理。
7.逻辑处理接口:
Reducer用户根据业务需求实现其中三三个方法: reduce() setup() cleanup()
8.输出数据接口: OutputFormat
(l)默认实现的类是TextOutputFormat,默认情况下实现了它;其主要功能是对每个KV对进行处理,并将其保存到目标文本文件的一行。
以SequenceFileOutputFormat输出的形式供后续MapReduce任务使用是一种便捷的输出策略。该种方法因其结构简洁明了而具有较高的适用性,在实际应用中能够有效节省存储空间。
(3)用户还可以自定义OutputFormat。
Hadoop数据压缩
压缩技术有助于显著降低底层存储系统(HDFS)读写次数。同时,在运行MR程序时,I/O操作、网络数据传输以及Shuffle操作消耗大量资源。此外,在提升资源利用率的同时,压缩有助于提高整体系统的性能表现。
由于在数据量极大以及工作强度大的情况下进行整合操作会耗费大量时间
考虑到磁盘I/O与网络带宽是Hadoop宝贵的资源,数据压缩有助于降低资源消耗并减少磁盘I/O操作及网络传输.在任意MapReduce阶段均可开启数据压缩功能.
然而,在压缩/解压操作方面虽然计算资源消耗较低 但其带来的性能提升的同时却带来了额外的资源消耗
通过实施数据压缩技术,在Mapper和Reducer运行过程中实施数据压缩,在线减少了磁盘输入输出操作次数,并显著提升了MapReduce程序的工作效率
注意:应用压缩技术降低了磁盘IO的使用频率,然而同时带来了CPU运算负担的增加。然而,合理应用压缩特性有助于提升性能,而过度使用可能导致性能下降。
压缩基本原则:
(1)运算密集型的job,少用压缩
(2)IO密集型的job,多用压缩
压缩方式选择
Gzip压缩
优点: 压缩效率较高,并且压缩解压速度也相当快;Hadoop本身具备良好的兼容性,在应用中能够像处理普通文本一样高效处理Gzip格式文件;大部分Limux系统都自带Gzip命令,并且使用起来非常友好。
缺点:不支持Split。
应用场景:在处理过程中, 当每个文件压缩后的数据量不超过130M时, 我们都可以选择使用Gzip格式进行压缩。
例如说, 每天或每小时产生的日志数据通常会被压缩成一个单独的Gzip文件。
Bzip2压缩
优点:基于Split机制 ;相比Gzip等压缩算法而言,其压缩效率显著提升;无需额外配置即可实现高效的处理流程
缺点:压缩解压速度慢。
应用场景: 适用于对速度要求不高而压缩率需较高的情形;或者输出数据量较大,在处理后需将数据进行压缩存储以节约磁盘空间,并且后续处理过程也需考虑这一点。
在实际应用中较为少见的情形;或者对于单个较大的文本文件希望进行压缩以减少存储空间的同时还需要支持Split功能,并且能够与原有应用程序兼容的情形
Lzo压缩
优势:在保证合理压缩率的同时运行效率也较高;该压缩方案采用Split算法,并广泛应用于Hadoop生态系统;其安装过程非常便捷,在Linux系统下即可配置完成。
该方法存在以下不足之处:相较于Gzip而言,其压缩效率稍有不足; Hadoop本身不内置支持该压缩算法,默认情况下无法直接使用; 在实际应用中,为确保能够实现Split操作,对于Lzo格式的文件还需要做进一步的特殊处理(例如需先构建索引等)
定InputFormat为Lzo格式)。
应用场景: 规模较大的文本文件,在压缩后仍超过200M以上的情况下可以考虑使用;而当单个文件的规模越大时,LZO的优势将愈发显著。
Snappy压缩
优点:高速压缩速度和合理的压缩率。
缺点:不支持Split ;压缩率比Gzip要低; Hadoop本身不支持,需要安装。
应用场景:当MapReduce作业在Map阶段产生的输出数据量较大时,可以选择作为中间数据进行压缩以减少存储和传输负担;同时也可以视作是该MapReduce作业的输出与另一
个MapReduce作业的输入。
Shuffle机制
1)Map方法之后Reduce方法之前这段处理过程叫Shuffle
采用Map方法后,随后将数据输入至分区模块,为各分区预先分配标识,经处理后会被发送至循环缓冲区域.该区域的最大容量设定为100米,当存储量达到80%时会触发溢出处理.在溢出前需先对数据进行组织排列,具体方式是根据键值索引按字典顺序排列,采用快速排序算法来实现这一过程.这种处理会产生大量待处理的溢出块,需对所有待处理的溢出块执行归并操作.但需要注意的是,完成汇总计算后无法进行均值计算.最终将各分块按其对应的分区信息存储于本地磁盘上,供Reduce节点后续读取使用.
在Reduce阶段中, 系统会从Map端对应分区的数据源处提取数据. 在读取过程中, 系统会将数据暂存于内存中. 当内存空间接近限制时, 则会将部分数据转移至磁盘存储. 完成全部数据读取后, 系统将对内存中的数据以及磁盘上的剩余数据进行归并排序处理. 在执行Reduce方法之前, 系统会对处理后的数据进行分组整理.
Yarn资源调度器
Yarn是一个主要资源调度平台。它主要通过为运算任务提供服务器级计算资源来实现系统管理功能,并等价于一个分布式操作系统平台。而MapReduce等任务类应用主要在操作系统的虚拟环境中执行。
工作机制详解
(1)MR程序提交到客户端所在的节点。
(2)YarnRunner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行mrAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MRAppmaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppmaster向RM 申请运行MapTask资源。
(11)RM负责将MapTask任务分配给另外两个NodeManager,并让这两个NodeManager分别接受任务并为每个任务创建相应的容器。
MR向响应任务的两个NodeManager提交执行脚本文件,并由各自启动MapTask以完成数据分区排序的任务。
MrAppMaster在所有MapTask完成后提交容器申请,并启动ReduceTask
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。
资源调度器
先进先出调度器(FIFO)
容量调度器(Capacity Scheduler)
该系统能够支持多个队列,并为每个队列配置一定数量的资源资源量;各队列均遵循先 come, 先 serve(FCFS)调度方式。
为了避免一个用户的作业独占队列中的资源,该调度器会设置限制该用户提交的所有作业占用的队列资源总量.
首先确定每个队列中运行中的任务数量与其应分配到的计算资源数量之间的比例,并挑选出该比例最小且空闲程度最低的那个队列。
此外, 依据作业优先级与提交时间顺序, 在满足用户资源量限制与内存约束条件下完成队列内任务的排序安排, 以确保所有技术都能轻松掌握.
多个队列按照任务优先级排序依次运行,在实际操作中通常会将job11、job21和job31排列在队列前端的位置,并最先开始运行的同时实现并行处理。
公平调度器(Fair Scheduler)
能够支持多个队列和用户群体,并且在每个队列中都可以设置相应的资源量,在同一队列中所有的作业都能够均衡分配该队列的所有资源
任务的推测执行
1.作业完成时间取决于最慢的任务完成时间
一个作业包含若干Map任务以及Reduction任务。由于硬件老化以及软件中的问题导致某些Map或Reduction任务运行缓慢。
2.推测执行机制
识别成为瓶颈的任务(例如某个特定任务的执行速度显著低于平均值),并为此类任务部署一个备用任务以实现同步执行策略。当某个备用任务最先完成时,则使用其结果作为最终输出数据源
3.执行推测任务的前提条件
(1)每个Task只能有一个备份任务
(2)当前Job已完成的Task必须不小于0.05(5%)
(3)开启推测执行参数设置。mapred-site.xml文件中默认是打开的。
4.不能启用推测执行机制情况
(1)任务间存在严重的负载倾斜;
(2)特殊任务,比如任务向数据库中写数据。
Hadoop企业优化
MapReduce 跑的慢的原因
MapReduce程序效率的瓶颈在于两点:
1.计算机性能
CPU、内存、磁盘健康、网络
2.I/O 操作优化
(1)数据倾斜
(2)Map和Reduce数设置不合理
(3)Map运行时间太长,导致Reduce等待过久
(4)小文件过多
(5)大量的不可分块的超大文件
(6)Spill次数过多
(7)Merge次数过多等。
MapReduce优化方法
数据输入
在执行MapReduce(MR)任务之前将所有的小文件进行整合。这不仅增加了每个Map作业的数量,并且会导致生成大量Map作业;同时这还增加了每个 Map 作业的读取时间。
(2)采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景。
Map阶段
(1)降低缓存溢出的发生频率:通过调节影响数据排序和缓存溢出阈值的关键参数设置(如io.sort.mb和sort. spill. percent),能够提升内存管理效率,并有效降低逻辑操作数(lO)的消耗
降低合并(Merge)的次数可以通过优化io.sort.factor参数来实现。通过增加Merge的文件数量和减少Merge的频率来提高效率。
(3)在Map之后,不影响业务逻辑前提下,先进行Combine处理,减少I/O。
Reduce阶段
恰当配置Map与Reduce的数量:两者均不宜过高也不宜过低。若数量不足,则会导致任务等待并延长处理时间;反之,则会引发Map及Reduce任务之间的资源竞争而导致处理超时等问题。
(2) 配置Map与Reduce并存: 优化slowstart.completedMaps参数设置, 当Map运行至一定程度时, 让Reduces也开始工作, 从而缩短Reduces的等待时间
(3 )避免采用Reduce技术:由于Reduce在用于连接数据集时会产生显著的网络开销。
IO传输
通过数据压缩技术,降低网络IO操作的时间消耗。部署Snappy和LZO压缩编码器模块。
2 )使用SequenceFile- =进制文件。
数据倾斜问题
1.数据倾斜现象
该区域的数据量在数据频率上呈现显著性高于其他区域;而大部分记录在数据大小上的数值明显偏离平均值。
2.减少数据倾斜的方法.
方法1 :抽样和范围分区
可以通过对原始数据进行抽样得到的结果集来预设分区边界值。
方法2 :自定义分区
基于输出字段的背景知识进行自定义分区。例如,如果Map输出字段的单词来源于本书.其中有几类专业词汇较多.那么就可以自定义区域将这些专业词汇发送给固定节点.
定的一部分Reduce实例。而将其他的都发送给剩余的R educ e实例。
方法3 : Combine
该系统采用Combine技术能够显著减少数据倾斜现象,在一般情况下该系统的主要目标是实现数据汇总与精简处理
方法4 :采用Map Join ,尽量避免Reduce Join。
让天下没有难学的技术
HDFS小文件优化方法
HDFS小文件弊端
在HDFS系统中,在每个节点创建对应的数据块元数据条目是必要的操作。这些元数据条目通常具有固定大小约150字节。当系统中的小数据块数量较多时,则会产生数量众多的元数据条目。这不仅会导致NameNode节点占用大量内存空间(从而影响系统的扩展性),而且较大的元数据条目还会降低查询效率。
HDFS小文件解决方案
小文件的优化无非以下几种方式:
(1)在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
(2)在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。
(3)在MapReduce处理时,可采用CombineTextInputFormat提高效率。
1. Hadoop Archive
该工具采用高效率的方式将小文件放置于HDFS块中;它可将若干个小文件整合为一个HAR档案;从而降低了NameNode对内存的需求量。
2. Sequence File
Binary sequence files are composed of a series of binary key-value pairs. Specifically, each key represents a file name, and the corresponding value contains the file content. Through this structure, it is possible to aggregate numerous small files into a single large file efficiently.
3. Combine FileInputFormat
CombineFileInputFormat是一种新型的InputFormat,并具有将多个文件整合的能力,并考虑到数据存储的位置
Hadoop参数调优
建议在HDFS配置参数文件中设置多个存储路径。为了确保操作顺利进行,请务必提前准备好相关参数设置。如果不提前准备好相应的存储路径设置,则会导致集群重启以进行修改。
NameNode配置了一个工作线程池,用于管理不同DataNode的并发心跳以及客户端并发进行的元数据操作
dfs.namenode.handler.count = 20 \times \log_2(\text{Cluster Size});例如当集群规模达到10台时 该参数应设定为60
配置日志存储位置dfs.namenode.edits.dir应尽量避免与镜像文件的存放位置dfs.namenode.name.dir重叠,并以最低延迟进行 writes。
4)在服务器节点上,默认情况下YARN可使用的物理内存总量为8192 MB。需要注意的是,在某些情况下(如节点内存资源不足8GB),应减少这个数值以满足需求。然而,请注意YARN无法自动探测到节点的物理内存总量。yarn.nodemanager.resource.memory-mb
5)规定每个作业可申请的最大物理内存容量,默认设置为8192 MB。yarn.scheduler.maximum-allocation-mb
