HHH*_*HHH 6 hadoop mapreduce hadoop2
我正在使用单节点hadoop作业进行一些数据准备.我工作中的映射器/合并器输出许多键(超过5M或6M),显然作业进展缓慢甚至失败.映射阶段最多可运行120个映射器,并且只有一个reducer(这些是自动确定的,我没有为它们设置任何值).我想优化工作,以便更有效地进行洗牌/分拣阶段.我增加到mapreduce.task.io.sort.mb300米,但工作失败,因为它的值大于映射器堆.然后我设置mapred.child.java.opts为-Xmx1024m,但它再次失败,因为它无法初始化输出收集器.这些方案的最佳实践是什么?
Man*_*lur 14
首先,由于您使用的是单节点群集,因此您无法进行太多优化.您将在单个节点群集上拥有有限数量的容器/插槽,并且对于您正在处理的数据量(500万到600万个密钥),您的作业将始终运行缓慢并且也可能会失败.
我将为完全分布式的Hadoop设置回答这个问题."Hadoop The Definitive Guide"一书中有一节("Shuffle and Sort"),您应该阅读该节以调整Shuffle和Sort阶段.我的答案主要受本节内容以及我自己调整MapReduce作业的经验的影响.
您可以执行以下操作以实现Shuffle和Sort效率:
mapreduce.job.reduce.slowstart.completedmapsYARN中的配置决定.在完成一定比例的映射器之前,它不会启动减速器.它默认设置为"0.05"(这意味着减速器在5%的映射器完成后启动).如果减速器提前启动,那么大多数减速器都处于空闲状态,直到所有映射器都完成.而且,减速器可能消耗时隙,否则这些时隙可由映射器用于处理.通过控制它,您可以最佳地使用mapper/reducers插槽并改善随机播放期间所花费的时间.mapreduce.map.output.compress,以便将较少的数据写入磁盘并转移到reducer.以下是可以调整以改善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到达时,地图输出将合并并溢出到磁盘.默认情况下,mapreduce 仅选择一个减速器,这将是大多数情况下的问题。
您可以通过将减速器数量设置为更高的值来更改代码job.setNumReduceTasks(24);
或运行hadoop jar <jarfilename> <class> -Dmapreduce.job.reduces=24 <parameters>
您需要了解数据才能准确确定归约数量。Mapreduce 框架根据分割大小选择映射器的数量,但减少应该由开发人员或运营团队明确设置。