如何在hadoop作业中优化洗牌/排序阶段

qyyhg6bp  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(375)

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

lpwwtiir

lpwwtiir1#

默认情况下,mapreduce只选择一个reducer,这将是大多数场景的问题。
您可以通过将还原数设置为更高的值来更改代码 job.setNumReduceTasks(24); 或者跑 hadoop jar <jarfilename> <class> -Dmapreduce.job.reduces=24 <parameters> 您需要了解您的数据,以准确地确定减少的数量。mapreduce框架根据拆分大小选择Map器的数量,但reduce应该由开发人员或操作团队显式设置。

xj3cbfub

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输出被合并并溢出到磁盘。

相关问题