一、概述
优化前我们需要知道hadoop适合干什么活,适合什么场景,在工作中,我们要知道业务是怎样的,能才结合平台资源达到最有优化。除了这些我们当然还要知道mapreduce的执行过程,比如从文件的读取,map处理,shuffle过程,reduce处理,文件的输出或者存储。在工作中,往往平台的参数都是固定的,不可能为了某一个作业去修改整个平台的参数,所以在作业的执行过程中,需要对作业进行单独的设定,这样既不会对其他作业产生影响,也能很好的提高作业的性能,提高优化的灵活性。
现在回顾下hadoop的优势(适用场景):
1、可构建在廉价机器上,设备成本相对低
2、高容错性,HDFS将数据自动保存多个副本,副本丢失后,自动恢复,防止数据丢失或损坏
3、适合批处理,HDFS适合一次写入、多次查询(读取)的情况,适合在已有的数据进行多次分析,稳定性好
4、适合存储大文件,其中的大表示可以存储单个大文件,因为是分块存储,以及表示存储大量的数据
二、小文件优化
从概述中我们知道,很明显hadoop适合大文件的处理和存储,那为什么不适合小文件呢?
1、从存储方面来说:hadoop的存储每个文件都会在NameNode上记录元数据,如果同样大小的文件,文件很小的话,就会产生很多文件,造成NameNode的压力。
2、从读取方面来说:同样大小的文件分为很多小文件的话,会增加磁盘寻址次数,降低性能
3、从计算方面来说:我们知道一个map默认处理一个分片或者一个小文件,如果map的启动时间都比数据处理的时间还要长,那么就会造成性能低,而且在map端溢写磁盘的时候每一个map最终会产生reduce数量个数的中间结果,如果map数量特别多,就会造成临时文件很多,而且在reduce拉取数据的时候增加磁盘的IO。
好,我们明白小文件造成的弊端之后,那我们应该怎么处理这些小文件呢?
1、从源头干掉,也就是在hdfs上我们不存储小文件,也就是数据上传hdfs的时候我们就合并小文件
2、在FileInputFormat读取入数据的时候我们使用实现类CombineFileInputFormat读取数据,在读取数据的时候进行合并。
回到顶部
三、数据倾斜问题优化
我们都知道mapreduce是一个并行处理,那么处理的时间肯定是作业中所有任务最慢的那个了,可谓木桶效应?为什么会这样呢?
1、数据倾斜,每个reduce处理的数据量不是同一个级别的,所有导致有些已经跑完了,而有些跑的很慢。
2、还有可能就是某些作业所在的NodeManager有问题或者container有问题,导致作业执行缓慢。
那么为什么会产生数据倾斜呢?
数据本身就不平衡,所以在默认的hashpartition时造成分区数据不一致问题,还有就是代码设计不合理等。
那如何解决数据倾斜的问题呢?
1、既然默认的是hash算法进行分区,那我们自定义分区,修改分区实现逻辑,结合业务特点,使得每个分区数据基本平衡
2、既然有默认的分区算法,那么我们可以修改分区的键,让其符合hash分区,并且使得最后的分区平衡,比如在key前加随机数n-key。
3、既然reduce处理慢,我们可以增加reduce的内存和vcore呀,这样挺高性能就快了,虽然没从根本上解决问题,但是还有效果
4、既然一个reduce处理慢,那我们可以增加reduce的个数来分摊一些压力呀,也不能根本解决问题,还是有一定的效果。
那么如果不是数据倾斜带来的问题,而是节点服务有问题造成某些map和reduce执行缓慢呢?
那么我们可以使用推测执行呀,你跑的慢,我们可以找个其他的节点重启一样的任务竞争,谁快谁为准。推测执行时以空间换时间的优化。会带来集群资源的浪费,会给集群增加压力,所以我司集群的推测执行都是关闭的。其实在作业执行的时候可以偷偷开启的呀
运行时间:启动一个MapReduce任务,map阶段和reduce阶段都会有并行的task共同处理任务,这些task都需要开jvm,然后初始化,而这些jvm很花费空间的,如果运行一个20-30s的任务需要进行开启,初始化,停止jvm操作很是浪费,所以我们应该尽量吧数据量控制在能让每个task运行1分钟以上。
1.如何能够让Map执行效率最高
尽量减少环形缓冲区flush的次数(减少IO 的使用)
1、调大环形缓冲区的大小,将100M调更大。
2、调大环形缓冲区阈值大的大小。
3、对Map输出的数据进行压缩。(数据在压缩和解压的过程中会消耗CPU)
2.如何能够让Reduce执行效率最高
尽量减少环形缓冲区flush的次数
1尽量将所有的数据写入内存,在内存中进行计算。
3.集群调优核心思路
在网络带宽、磁盘IO是瓶颈的前提下:
能不使用io 和网络,就不使用。在必须使用的情况下,能少用IO 网络就少用,
所有的能够减少网络开销的、减少IO使用的可选项,都可以作为集群调优的可选项。(软件层面(操作系统----集群层面),硬件层面,网络层面)
数据倾斜:可以通过对原始数据进行抽样得到结果集来预设分区。