我正在使用单节点hadoop作业做一些数据准备。我工作中的mapper/combiner输出了许多键(超过5m或6m),显然工作进展缓慢甚至失败。Map阶段最多运行120个mapper,只有一个reducer(它们是自动确定的,我没有为它们设置任何值)。我想优化作业,以便更有效地进行洗牌/排序阶段。我增加了 mapreduce.task.io.sort.mb
但作业失败,因为它的值大于Map器堆。然后我设置 mapred.child.java.opts
到-xmx1024m,但它再次失败,因为它无法初始化输出采集器。这些场景的最佳实践是什么?
2条答案
按热度按时间lpwwtiir1#
默认情况下,mapreduce只选择一个reducer,这将是大多数场景的问题。
您可以通过将还原数设置为更高的值来更改代码
job.setNumReduceTasks(24);
或者跑hadoop jar <jarfilename> <class> -Dmapreduce.job.reduces=24 <parameters>
您需要了解您的数据,以准确地确定减少的数量。mapreduce框架根据拆分大小选择Map器的数量,但reduce应该由开发人员或操作团队显式设置。xj3cbfub2#
首先,由于您使用的是单节点集群,因此没有多少优化可以做。在一个节点集群上,容器/插槽的数量是有限的,对于正在处理的数据量(500万到600万个密钥),您的作业总是运行缓慢,而且可能会失败。
我将为一个完全分布式的hadoop设置回答这个问题。在“hadoop最终指南”一书中有一节(“shuffle和sort”),您应该阅读该节来调整shuffle和sort阶段。我的回答主要受本节内容的影响,也受我自己调整mapreduce作业的经验的影响。
您可以执行以下操作以实现无序排列和排序效率:
合并器:使用合并器将减少传输到每个简化器的数据量,因为合并器合并Map器端的输出。
减速器数量:选择最佳减速器数量。如果数据量很大,那么一个缩减器不是一个好主意。另外,将reducer的数量设置为一个高的数字也不是一个好主意,因为reducer的数量还决定了Map器端的分区数量。请看以下链接:https://github.com/paulhoule/infovore/wiki/choosing-the-number-of-reducers
何时启动减速器:;您可以控制reduce任务何时启动。这是由配置决定的
mapreduce.job.reduce.slowstart.completedmaps
在Yarn中。在完成一定比例的Map程序之前,它不会启动减速器。默认设置为“0.05”(这意味着5%的Map器完成后还原器开始工作)。如果减速器提前启动,则大多数减速器处于闲置状态,直到所有Map器完成。此外,减速器可能会占用插槽,否则Map器可能会使用这些插槽进行处理。通过控制这一点,您可以最佳地使用Map器/还原器插槽,并改进洗牌过程中花费的时间。压缩Map器输出:建议压缩Map器输出(由配置决定:
mapreduce.map.output.compress
),以便将较少的数据写入磁盘并传输到还原器。tune config“mapreduce.task.io.sort.mb”:增加Map程序在排序期间使用的缓冲区大小。这将减少磁盘溢出的次数。
tune config“mapreduce.reduce.input.buffer.percent”:如果reduce任务的内存需求较少,那么可以将该值设置为较高的百分比。这意味着,在reduce阶段(在shuffle阶段之后)使用更多的堆来保留map输出,从而减少溢出到磁盘的次数。
tune config“mapreduce.reduce.shuffle.parallelcopies”:用于将map输出复制到reducer的线程数。请检查此处的链接:如何优化mapred.reduce.parallel.copies?
以下是其他配置参数,可以对这些参数进行调整,以提高随机播放和排序阶段的性能(请参阅此处对这些配置的描述:https://hadoop.apache.org/docs/r2.4.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml):
mapreduce.map.sort.spill.percent
:确定Map程序使用的内存缓冲区的阈值。当达到此阈值时,缓冲区的内容将溢出到磁盘。所以这个值决定了磁盘溢出的数量mapreduce.task.io.sort.factor
:排序期间一次合并的最小流数。因此,在reducer端,如果有50个mapper输出,并且将该值设置为10,那么将有5轮合并(平均10个文件用于合并轮)。mapreduce.shuffle.max.threads
:将Map输出复制到减速器的工作线程数。mapreduce.reduce.shuffle.input.buffer.percent
:在reducer中的shuffle阶段,应该使用多少堆来存储map输出。此设置确定Map器输出在溢出到磁盘之前可以保存在内存中的量。mapreduce.reduce.shuffle.merge.percent
:启动合并和溢出到磁盘进程的阈值mapreduce.reduce.merge.inmem.threshold
:启动合并进程所需的Map输出数。什么时候mapreduce.reduce.shuffle.merge.percent
或者mapreduce.reduce.merge.inmem.threshold
则Map输出被合并并溢出到磁盘。