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

时间:2015-12-09 18:43:28

标签: hadoop mapreduce hadoop2

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

2 个答案:

答案 0 :(得分:13)

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

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

您可以执行以下操作以实现随机播放和排序效率:

  • 组合器:使用组合器将减少传输到每个减速器的数据量,因为组合器合并了映射器端的输出。
  • 减速机数量:选择最佳减速机数量。如果数据量很大,那么一个减速器不是一个好主意。此外,将减速器的数量设置为较大的数字并不是一个好主意,因为减速器的数量也决定了映射器侧的分区数量。请查看此处的链接:https://github.com/paulhoule/infovore/wiki/Choosing-the-number-of-reducers
  • 何时开始减速机:;您可以在启动reduce任务时进行控制。这由YARN中的配置mapreduce.job.reduce.slowstart.completedmaps确定。在完成一定比例的映射器之前,它不会启动减速器。它默认设置为" 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的线程数。点击此处的链接:how to tune 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个mapper输出并且此值设置为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.percentmapreduce.reduce.merge.inmem.threshold时,地图输出将合并并溢出到磁盘。

答案 1 :(得分:0)

默认情况下,mapreduce只选择一个减速器,这将是大多数情况的问题。

您可以通过将减速器数设置为更高的值cur.execute("""SELECT feed_id FROM feed_master WHERE url_link = '%s' """ %(source))

来更改代码

或运行job.setNumReduceTasks(24);

您需要了解您的数据以确定准确缩减的数量。 Mapreduce框架根据拆分大小选择映射器的数量,但是应该由开发人员或运营团队明确设置。