我正在使用单个节点hadoop作业进行一些数据准备。我工作中的映射器/合并器输出许多键(超过5M或6M),显然作业进展缓慢甚至失败。映射阶段最多可运行120个映射器,并且只有一个reducer(这些是自动确定的,我没有为它们设置任何值)。我想优化工作,以便更有效地进行洗牌/分拣阶段。我将mapreduce.task.io.sort.mb
增加到300米,但工作失败,因为它的值大于映射器堆。然后我将mapred.child.java.opts
设置为-Xmx1024m,但它再次失败,因为它无法初始化输出收集器。这些方案的最佳实践是什么?
答案 0 :(得分:13)
首先,由于您使用的是单节点群集,因此您无法进行太多优化。您将在单个节点群集上拥有有限数量的容器/插槽,并且对于您正在处理的数据量(500万到600万个密钥),您的作业将始终运行缓慢并且可能也会失败。
我将为完全分布式的Hadoop设置回答这个问题。书和#34; Hadoop The Definitive Guide"中有一节(" Shuffle和Sort"),您应该阅读以调整Shuffle和Sort阶段。我的回答主要受本节内容以及我自己调整MapReduce作业的经验的影响。
您可以执行以下操作以实现随机播放和排序效率:
mapreduce.job.reduce.slowstart.completedmaps
确定。在完成一定比例的映射器之前,它不会启动减速器。它默认设置为" 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个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.percent
或mapreduce.reduce.merge.inmem.threshold
时,地图输出将合并并溢出到磁盘。答案 1 :(得分:0)
默认情况下,mapreduce只选择一个减速器,这将是大多数情况的问题。
您可以通过将减速器数设置为更高的值cur.execute("""SELECT feed_id FROM feed_master WHERE url_link = '%s' """ %(source))
或运行job.setNumReduceTasks(24);
您需要了解您的数据以确定准确缩减的数量。 Mapreduce框架根据拆分大小选择映射器的数量,但是应该由开发人员或运营团队明确设置。