Hadoop 最后一项任务需要很长时间才能完成

Hadoop 最后一项任务需要很长时间才能完成,hadoop,mapreduce,Hadoop,Mapreduce,我有一个集群设置,它有8个节点,我正在用mapreduce解析一个20GB的文本文件。通常,我的目的是通过映射器获取每一行,并使用一个键发送,该键是输入文件行中的一列。当reducer得到它时,它将根据键值写入不同的目录。如果我举一个例子: 输入文件: test;1234;A;24;49;100 test2;222;B;29;22;22 test2;0099;C;29;22;22 因此,这些行将如下所示: /output/A-r-0001 /output/B-r-0001 /outpu

我有一个集群设置,它有8个节点,我正在用mapreduce解析一个20GB的文本文件。通常,我的目的是通过映射器获取每一行,并使用一个键发送,该键是输入文件行中的一列。当reducer得到它时,它将根据键值写入不同的目录。如果我举一个例子: 输入文件:

test;1234;A;24;49;100

test2;222;B;29;22;22

test2;0099;C;29;22;22
因此,这些行将如下所示:

/output/A-r-0001

/output/B-r-0001

/output/C-r-0001
我在reducer中使用MultipleOutputs对象,如果我使用一个小文件,一切都可以。但当我使用20GB文件时,152个映射器和8个还原器正在初始化。在mapper端,一切都完成得很快,但有一个减速器仍在继续。7个减速器最多完成18分钟,但最后一个减速器需要3小时。 首先,我怀疑减速机的输入比其他减速机的输入大,但事实并非如此。一个减速器的输入是慢减速器的三倍,并在17分钟内完成

我还尝试将reducer的数量增加到14个,但结果是又增加了2个慢速reduce任务

我查阅了大量文档,不知道为什么会发生这种情况。你们能帮我吗

已编辑

问题是由于我的数据集中的某些损坏数据造成的。我在mapper端对输入数据进行了一些严格的检查,现在一切正常


谢谢大家。

我看到在处理扭曲数据时经常发生这种情况,所以我最好的猜测是您的数据集是扭曲的,这意味着您的
映射器将发出许多具有相同键的记录,这些记录将进入同一个减缩器,该减缩器将过载,因为它有很多值要通过

这个问题没有简单的解决方案,这实际上取决于您工作的业务逻辑,您可以在
Reducer
中进行检查,并说如果您的值超过N,则忽略N之后的所有值


我还发现了一些文档,这些文档应该可以使在Hadoop环境中管理扭曲数据变得更容易,如前所述,但我自己还没有尝试过。

感谢您的解释。我知道我的数据集没有均匀分布的键值对。下面是我使用14个还原器和152个映射器进行的测试之一

完成17分27秒的任务

文件系统计数器

文件字节读取1002340978

文件字节写入10023501262

HDFS_字节_写入6771300416

Map-Reduce框架

减少输入组5

合并输出记录0

减少洗牌字节6927570032

将输出记录减少到0

泄露记录28749620

合并输入记录0

减少输入记录19936319

完成14小时17分钟54秒的任务:

文件系统计数器

文件字节读取2880550534

文件字节写入2880600816

HDFS_字节_写入2806219222

Map-Reduce框架

减少输入组5

合并输出记录0

减少混洗字节数2870910074

将输出记录减少到0

泄漏记录8259030

合并输入记录0

减少输入记录8259030

花了这么多时间的那一个要通过的记录更少


除此之外,一段时间后,相同的任务将从不同的节点初始化。我猜hadoop认为这个任务很慢,并初始化了另一个任务。但这毫无帮助

这是慢速减速器和快速减速器的计数器

任务_201403261540_0006_r_000019运行非常慢,任务_201403261540_0006_r_000000完成得非常快

很明显,我的一个减速机得到了大量的钥匙。 我们需要优化我们的自定义分区器


运行此减速机的机器是否薄弱或不健康?您能否发布快速运行的减速机与运行3小时的减速机的计数器统计信息?是的,机器很好,因为它并不总是发生在该节点上。我也有同样的情况。每个减速机使用的记录数量有多少。