当前位置:  开发笔记 > 运维 > 正文

如何在hadoop工作中优化改组/排序阶段

如何解决《如何在hadoop工作中优化改组/排序阶段》经验,为你挑选了1个好方法。

我正在使用单节点hadoop作业进行一些数据准备.我工作中的映射器/合并器输出许多键(超过5M或6M),显然作业进展缓慢甚至失败.映射阶段最多可运行120个映射器,并且只有一个reducer(这些是自动确定的,我没有为它们设置任何值).我想优化工作,以便更有效地进行洗牌/分拣阶段.我增加到mapreduce.task.io.sort.mb300米,但工作失败,因为它的值大于映射器堆.然后我设置mapred.child.java.opts为-Xmx1024m,但它再次失败,因为它无法初始化输出收集器.这些方案的最佳实践是什么?



1> Manjunath Ba..:

首先,由于您使用的是单节点群集,因此您无法进行太多优化.您将在单个节点群集上拥有有限数量的容器/插槽,并且对于您正在处理的数据量(500万到600万个密钥),您的作业将始终运行缓慢并且也可能会失败.

我将为完全分布式的Hadoop设置回答这个问题."Hadoop The Definitive Guide"一书中有一节("Shuffle and Sort"),您应该阅读该节以调整Shuffle和Sort阶段.我的答案主要受本节内容以及我自己调整MapReduce作业的经验的影响.

您可以执行以下操作以实现Shuffle和Sort效率:

组合器:使用组合器将减少传输到每个减速器的数据量,因为组合器合并了映射器端的输出.

减速器数量:选择最佳减速器数量.如果数据量很大,那么一个减速器不是一个好主意.此外,将减速器的数量设置为较大的数字并不是一个好主意,因为减速器的数量也决定了映射器侧的分区数量.请看这里的链接:https://github.com/paulhoule/infovore/wiki/Choosing-the-number-of-reducers

何时开始减速机: ; 您可以在启动reduce任务时进行控制.这由mapreduce.job.reduce.slowstart.completedmapsYARN中的配置决定.在完成一定比例的映射器之前,它不会启动减速器.它默认设置为"0.05"(这意味着减速器在5%的映射器完成后启动).如果减速器提前启动,那么大多数减速器都处于空闲状态,直到所有映射器都完成.而且,减速器可能消耗时隙,否则这些时隙可由映射器用于处理.通过控制它,您可以最佳地使用mapper/reducers插槽并改善随机播放期间所花费的时间.

压缩映射器输出:建议压缩映射器输出(由配置确定:) mapreduce.map.output.compress,以便将较少的数据写入磁盘并转移到reducer.

调整配置"mapreduce.task.io.sort.mb":增加映射器在排序期间使用的缓冲区大小.这将减少磁盘溢出的次数.

调整配置"mapreduce.reduce.input.buffer.percent":如果您的reduce任务具有较少的内存要求,则可以将此值设置为较高的百分比.这意味着,在减少阶段(在混洗阶段之后)使用更高量的堆来保留映射输出,从而减少了到磁盘的溢出次数.

调整配置"mapreduce.reduce.shuffle.parallelcopies":用于将地图输出复制到reducer的线程数.检查链接:如何调整mapred.reduce.parallel.copies?

以下是可以调整以改善Shuffle和Sort阶段性能的其他配置参数(请参阅这些配置的说明:https://hadoop.apache.org/docs/r2.4.1/hadoop-mapreduce-client/hadoop -mapreduce-client-core/mapred-default.xml):

mapreduce.map.sort.spill.percent:确定映射器使用的内存缓冲区的阈值.达到此阈值时,缓冲区的内容将溢出到磁盘.因此,此值确定磁盘溢出的数量

mapreduce.task.io.sort.factor:排序期间一次合并的最小流数.因此,在reducer端,如果有50个映射器输出并且此值设置为10,那么将有5轮合并(平均10个文件用于合并轮次).

mapreduce.shuffle.max.threads:用于将映射输出复制到reducer的工作线程数.

mapreduce.reduce.shuffle.input.buffer.percent:在reducer的shuffle阶段,应该使用多少堆来存储地图输出.此设置确定在映射到磁盘之前可以保留在内存中的映射器输出量.

mapreduce.reduce.shuffle.merge.percent:启动合并和溢出到磁盘的过程的阈值

mapreduce.reduce.merge.inmem.threshold:启动合并过程所需的映射输出数.当到达mapreduce.reduce.shuffle.merge.percent或者mapreduce.reduce.merge.inmem.threshold到达时,地图输出将合并并溢出到磁盘.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有