21 - Hadoop企业优化策略

1、MapReduce 跑的慢的原因

MapReduce程序效率的瓶颈在于以下量两点(主要):

1.1、计算机的硬件设施

  • 它包括计算机的CPU、内存、磁盘检查、网络等

1.2、软件方面的-I/O操作

  • 数据倾斜
  • MapTask和ReduceTask的数设置的不合理
  • MapTask运行的时间太久,会导致ReduceTask等待的过久
  • 小文件过多,不符合hadoop设计的初衷
  • 大量的不可切片的超大的压缩文件
  • 切片(Spill)的次数过多
  • 合并(Merge)的次数过多等等

2、MapReduce的优化方法

想要优化MapReduce,我们主要从以下六个方面进行考虑:

  • 数据输入阶段
  • Map阶段
  • Reduce阶段
  • I/O传输阶段
  • 数据倾斜
  • 常用的调优参数

2.1、数据输入阶段

在这个阶段出现的问题,主要是因为小文件过多导致的,为此可以通过一下两点解决:

  • 合并小文件。在执行MapReduce任务前将小文件进行合并。因为大量的小文件会产生大量的MapTask,增大了MapTask装载的次数,而任务的装载又是比较耗时的,从而导致了MapReduce运行较慢
  • 采用CombineTextInputFormat类来作为输入,解决输入端大量小文件的输入的问题。它是通过合并小文件来解决的。

2.2、MapTask阶段

主要问题:

  • 溢写次数多降低性能
  • 小文件多
  • MapTask后的输出小文件多

解决办法:

  • 减少溢写(spill)的次数。通过调整mapreduce.task.io.sort.mb和mapreduce.map.sort.spill.percent参数值,增大触发Spill的内存上限,减少Spill次数,从而减少磁盘I/O。
  • 减少合并(merge)次数。通过调整mapreduce.task.io.sort.factor参数,增大merge的文件数目,减少合并的次数,从而缩短MapReduce的处理时间
  • 在map之后,在不影响业务逻辑的前提下,先进行Combine处理,以减少I/O。

2.3、Reduce阶段

  • 设置合理的map和reduce数量。注意:两个都不能设置太少,也不能设置太多,太少会导致Task等待,延长处理时间。太多,会导致Map、Reduce任务间竞争资源,造成处理超时等错误。
  • 设置Map和Reduce共存。通过调整mapreduce.job.reduce.showstart.completedmaps参数,使Map运行到一定程度后,reduce也开始运行,减少了reduce等待的时间。
  • 规避使用reduce。因为在reduce用于连接大量数据集时会产生大量的reduce阶段。
  • 合理的设置reduce端的buffer。默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。也就是说,buffer和reduce是没有直接关联的,中间多次写磁盘到读磁盘的过程,既然操作这样的弊端,那么久可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少I/O开:mapreduce.reduce.input.buffer.percent,默认为0.0.当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用。这样以来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所有要根据作业的运行情况进行调整。

2.4、I/O传输

  • 采用数据压缩的方式来减少网络I/O的传输时间。可以通过安装Snappy和LZO压缩编码器,因为他们两个压缩速度快,综合时间和硬件情况下选择他们两个是最合适的
  • 使用SequenceFile二进制文件(注意,这种方式在现在使用的已经很少了)

2.5、数据倾斜现象

  • 第一个是数据频率倾斜,即某一个区域的数据量要远远大于其它区域。第二个是数据大小倾斜,即部分记录的大小远远大于平均值。

减少数据倾斜的方法:

  • 抽样和范围分区。即通过对原始数据进行抽样得到的结果集来预设分区的边界值。
  • 自定义分区。这个是基于输出键的背景知识进行自定义分区。比如,一个map输出键的单词来源于一本书,且其中某几个专业词汇较多。那么就可以自定义分区将这些专业词汇发送给固定的一部分reduce实例,从而将其它的都发送给剩余的reduce实例。
  • Combiner。即使用Combiner可以大量的减少数据倾斜,在有可能的情况下,Combiner的目的就是聚合并精简数据。
  • 采用map join来尽可能的避免reduce join。

3、常用的调优参数

3.1、和资源相关的参数

以下参数是在用户自己的MapReduceApplication中配置就可以生效(mapred-default.xml)

 应该在yarn启动之前就配置咋服务器的配置文件才能生效(yarn-default.xml)

shuffle性能的优化参数,应该在yarn启动之前就配置好(mapred-default.xml)

3.2、容错相关的配置参数(MR性能优化)

4、hadoop小文件优化方法

4.1、hadoop小文件弊端

        分布式文件系统上的每个文件都要在nn上创建对应的元数据,这个元数据大小约为150byte,这样当小文件比较多的时候,就会产生很多的元数据文件。一方面不仅会占用大量的nn的内存空间,还会让元数据文件过多,导致寻址的时间边长,速度变慢。

        小文件过多,会导致在mapreduce计算时生成大量的切片,需要启用过多的MapTask,每个MapTask处理的数据量小,导致MapTask的处理时间比启动时间还小,从而会浪费资源。

4.2、小文件解决方案

        4.2.1、小文件的优化

                a、在数据采集阶段就尽可能的将小文件或小批量的数据合成大文件再上传Hdfs。
                b、在业务处理之前,在hdfs上使用MapReduce程序对小文件进行合并。
                c、在MapReduce处理时,可采用CombineTextInputFormat来提高效率
                d、开启uber模式,实现jvm重用。

        4.2.2、hadoop archive

                       hadoop archive是一个高效的将小文件放入hdfs块中的问及那存档工具,
                能够将小文件打包成一个HAR文件,从而达到减小NameNode的内存使用。

        4.2.3、sequenceFile

                        SequenceFile是有一系列的二进制KV键值对组成,如果K值为文件名,则V值
                为文件内容,可将将大批小文件合并成一个大文件

        4.2.4、CombineTextInputFormat

                        CombineTextInputFormat多用于将多个小文件在切片的过程中生成一个单
                独的切片或者少量的切片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值