0


MapReduce任务优化 阿里云平台ODPS Join方法等等详细解析

MR程序效率低的瓶颈在于两点

1 计算机性能CPU,内存,磁盘健康,网络

2 I/O操作优化 - 数据倾斜

  • Map和Reduce设置不合理
  • Map运行时间太长,导致Reduce等待过久
  • 小文件过多
  • 鹅不可分块的超大文件
  • Spill次数过多
  • Merge次数过多

1 . MR优化方法

数据输入

  • 合并小文件 : 在执行MR任务前件讲小文件进行合并,大量的小文件会产生大量的Map任务,增大Map任务装载次数,而任务的装载比较耗时,容而降低MR运行速度
  • 采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景

Map阶段

  • 介绍溢写次数 : 通过调整io.sort.mb以及sort.spill.percent参数值,增大出发Spill内存上限,减少Spill次数,从而减少磁盘的IO
  • 减少合并 : 通过调整io.sort.factor参数,增大Merge的文件数目,减少Merge次数,从而缩短MR处理时间
  • 在Map之后,不影响业务逻辑的前提下,先进行combine处理,减少IO

Reduce阶段

  • 合理设置Map和Reduce数 : 两个都不能设置太少,也不能设置太多.太少会导致MapTask等待,延长处理时间;太多会导致Map,Reduce之间竞争资源,造成处理超时等错误
  • 设置Map,Redece并存 : 调整slowstart.completemaps参数,使得Map运行到一定程度后,Reduce也开始运行,减少Reduce等待时间
  • 规避时间使用Reduce : 因为Reduce在用于连接数据集的试试会产生大量的网络消耗
  • 合理设置Reduce端的Buffer : 默认情况下,数据达到一个阈值的时候,Buffer中的数据就会写入磁盘,然后Reducer会从磁盘中获得所有的数据.也就是说,Buffer和Reducer是没有直接关联的,中间多次写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得Buffer中的一部分数据可以直接输送到Reducer,从而减少IO开销.mapreduce.reduce.input.buffer.percent,默认为0.0 当值大于0的时候,会保留指定比例的内存读Buffer中的数据直接拿给Reducer使用.这样一来,设置Buffer需要内存,读取数据需要内存,Reducer计算也要内存,所以要根据最特的运行情况进行调整

2 . 阿里云平台ODPS常见性能优化方法

Map长尾 : Map端读取数据由于带下分布不均匀,会导致一些Map Instance读取和处理的数据特别多,造成Map长尾;主要是由于

  • 上游文件大小分布特别不均匀,并且小文件特别多,采取小文件解决的思路
  • Map端进行聚合时,出现热点值,对热点值进行单独处理.

Reduce长尾 : 主要是keyy的分布不均匀所导致,主要场景:

  • Join阶段中有一些表的NULL值特别多
  • 对同一个表不同列队进行Count distant,可以采用group by或者过滤掉特殊值的方法
  • 出现热点值
  • 进行多次distant,导致Reduce的输入数据膨胀 解法 : 对热点值进行单独处理

Join长尾 : 主要场景为

  • JOIN的某路数据量比较小,可以处理成MapJoin
  • Join的每路输入都很大,且长尾时由于空值所造成的,可以将长值处理成随机值
  • Join的每路输入都很大,且长尾时由于全市热点值所造成的,可以将热点值与非热点值进行分别处理,在UNION ALL,其中热点值因为数量不多,可以采用MapJoin

动态分区优化 : 动态分区带来的小文件过多的问题进行小文件合并
开窗函数的优化 : 某个维度的TopN的计算,通用的方法是使用Row_Number排序,然后取TopN.但是容易造成数据倾斜 : 解法 两次RowNumber实现一次RowNumber的效果,避免数据倾斜

3 . HDFS小文件优化方法

HDFS小文件弊端 : HDFS上每一个文件都要在NameNode上建立一个索引,这个索引大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会占用大量的NameNode内存空间,另一方面就是索引文件过大是的索引速度变慢.

解法 :

  1. 使用Hadoop Archive,能高效的把小文件放入HDFS块中的文件存档工具,他能讲多个小文件打包成一个HAR文件,这样就减少了NameNode的内存使用
  2. Sequence File 由一系列的二进制kv组成,如果k为文件名,v为文件内容,则可以将大批小文件合并成一个大文件
  3. CombineFileInputFormat是一种新的InputFormat,用于将多个文件合并成一个单独的Spilt,另外他会考虑数据的存储位置
  4. 开启JVM重用,对于大量小文件的Job,可以开启JVM重用会减少45%的运行时间.JVM重用原理 : 一个Map运行在一个JVM上,开启重用的话,该Map在JVM上运行完毕的话,JVM会继续运行其他Map.具体设置 : mapreduce.job.jvm.numtasks值在10-20之间

4 . Join的多种应用下的优化

Reduce Join

Map端的主要工作 : 为来自不同表或者文件的kv对打标签,以区分不同来源的记录,然后用连接字段作为k,其余部分和新加的作为v,最后进行输出

Reduce端的主要工作 : 在Reduce端以连接字段作为k的分组已经完成,我们只需要将在每一个分组中将那些来源不文件的记录分开,最后进行合并.

Map Join

适用场景 : 适用于一张表十分小,一张表很大

解法 : 采用DistributedCache (1) 在mapper的setup阶段,把文件读取到缓存集合中 (2) 在驱动函数中加载缓存

Semi Join

试用场景 : 适用于大表和小表

解法 : 采用DistributedCache (1) 在mapper的setup阶段,讲其中一个文件的JoinKey抽取出来存放到文件中,把文件读取到缓存集合中 (2) 在驱动函数中加载缓存,针对缓冲的key进行join,如果命中在得到相应的存储位置获取数据,执行真实的join操作

5 . Hadoop数据压缩

这个这个很简单 不太想赘述,几种压缩格式 deflate gzip bzip2 LZO Snappy
压缩速率 : S > G >L>B
支持切片 : B L
压缩率 : B>G>L>S
特殊 : L S 两个hadoop本身不支持要自行安装并且L需要建立索引


本文转载自: https://blog.csdn.net/qq_59662745/article/details/125547712
版权归原作者 Jessica925 所有, 如有侵权,请联系我们删除。

“MapReduce任务优化 阿里云平台ODPS Join方法等等详细解析”的评论:

还没有评论