0

我在每行输入中都有一条记录,每条记录大约有 10 个字段。首先,我将记录按三个字段分组,(field1, field2, field3)因此一个映射器/还原器负责一个唯一组(基于三个字段)。在每个组中,我根据另一个整数字段对记录进行排序,并通过添加另一个字段timestamp将组中的每个记录标记为相同的标签。aTag

假设在 mapper#1 中,我将一个排序组标记为aTag,在 mapper#2 中,我用相同的 tag 标记另一个组(一个不同的组,因为我最初根据三个字段对记录进行分组)aTag

现在,如果我根据标签字段对记录进行分组(即,在不同的映射器中对组进行分组),我注意到每个组内的顺序不再保留。我期待由于每个映射器都有一个所有记录都具有相同标签的组,因此按标签名称进行分组应该只涉及从其他映射器获取相关组并将它们连接起来而无需重新排序每个单独的组。

是因为我试图以 gzip 格式存储记录,因此它试图重新排序记录以获得更好的压缩吗?另外我想知道如何在按标签名称分组后保留订单。

4

1 回答 1

2

似乎您正在尝试自己在本地内存中实现 MapReduce 的排序步骤,但随后它完全忽略了您所做的并重新排序每个组中的项目。解决此问题的正确方法是在键上指定一个比较器,以便在每个分区内,以便归约器的合并输入根据该比较函数。这意味着

  1. 您不必自己进行排序
  2. 您不会在一台机器上尝试对一个非常大的组进行排序时内存不足。

在您的情况下,您似乎想要添加timestamp到键集中,告诉它对前三个键进行分区,并告诉它对时间戳进行排序。

更多信息见下图,MapReduce阶段Sort在哪里使用,为什么?

在此处输入图像描述

于 2013-02-28T21:49:39.997 回答