在mapreduce中怎样解决数据倾斜

在mapreduce中怎样解决数据倾斜,第1张

触发shuffle的常见算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。要解决数据倾斜的问题,首先要巧掘姿定位数据倾斜发生在什么地散模方,首先是哪孝绝个stage,直接在Web UI上看就可以,然后查看运行耗时的task

MapReduce优化方法主要从六个方面旁禅考虑: 数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。

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

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

(3)Shuffle性能优化的关键参数,应在YARN启动之前就配置好(mapred-default.xml)

1)HDFS参数调优hdfs-site.xml

dfs.namenode.handler.count=20×〖指滑log〗_e^(Cluster Size),比如集群规模为8台时,此参数设置为41

2)YARN参数调优yarn-site.xml

3)集群资源分配参数(项目中遇到的问题)

集群有30台机器,跑mr任务的时候发现5个map任务全都分配到了同一台机器上,这个可能是由于什么原因导致的吗?

解决方案:yarn.scheduler.fair.assignmultiple 这个参数 默认是开的,需要关掉

https://blog.csdn.net/leone911/article/details/51605172

优化

1)Map阶段

(1)增大环形缓冲区大小。由100m扩大到200m

(2)增大环形缓冲区溢写的比例。由80%扩大到90%

(3)减少对溢写文件的merge次数。(10个文件,一次20个merge)

(4)不影响实际业务的前提下,采用Combiner提前合并,减少 I/O。

2)Reduce阶段

(1)合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间;太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。

(2)设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。

(3)规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。

(4)增加每个Reduce去Map中拿数据的并行数

(5)集群性能可以的前提下,增大Reduce端存储数据内存的大小。

3)IO传输

采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。

压缩:

(1)map输入端主要考虑数据量大小和切片,支持切片的有Bzip2、LZO。注意:LZO要想支持切片必须创建索引;

(2)map输出端主要考虑速度,速度快的snappy、LZO;

(3)reduce输出端主要看具体需求,例如作为下一个mr输入需要考虑切片,永久保存考虑压缩率比较大的gzip。

4)整体

(1)NodeManager默唯启腊认内存8G,需要根据服务器实际配置灵活调整,例如128G内存,配置为100G内存左右,yarn.nodemanager.resource.memory-mb。

(2)单任务默认内存8G,需要根据该任务的数据量灵活调整,例如128m数据,配置1G内存,yarn.scheduler.maximum-allocation-mb。

(3)mapreduce.map.memory.mb :控制分配给MapTask内存上限,如果超过会kill掉进程(报:Container is running beyond physical memory limits. Current usage:565MB of512MB physical memory used;Killing Container)。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加MapTask内存,最大可以增加到4-5g。

(4)mapreduce.reduce.memory.mb:控制分配给ReduceTask内存上限。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加ReduceTask内存大小为4-5g。

(5)mapreduce.map.java.opts:控制MapTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)

(6)mapreduce.reduce.java.opts:控制ReduceTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)

(7)可以增加MapTask的CPU核数,增加ReduceTask的CPU核数

(8)增加每个Container的CPU核数和内存大小

(9)在hdfs-site.xml文件中配置多目录(多磁盘)

(10)NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据 *** 作。dfs.namenode.handler.count=20 * log2 (Cluster Size),比如集群规模为10台时,此参数设置为60。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12433062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存