我在每行输入中都有一条记录,每条记录大约有10个字段。首先,我按三个字段(field1, field2, field3)
对记录进行分组,因此一个映射器/缩减器负责一个唯一的组(基于三个字段)。在每个组中,我根据另一个整数字段timestamp
对记录进行排序,并通过添加另一个字段来标记组中具有相同标记aTag
的每个记录。
让我们说在mapper#1中,我将一个已排序的组标记为aTag
,在mapper#2中,我标记另一个组(另一个组,因为我最初根据这三个字段对记录进行分组)相同的标记aTag
。
现在,如果我根据标记字段对记录进行分组(即,将组分组在不同的映射器中),我注意到每个组内的排序不再保留。我期待由于每个映射器都有一个包含所有记录具有相同标记的组,因此按标记名称进行分组应该只涉及从其他映射器获取相关组,并且只需连接它们而不重新排序每个组。
是因为我试图以gzip格式存储记录,因此它会尝试重新排序记录以获得更好的压缩效果吗?此外,我想知道如何在按标签名称分组后保留订单。
答案 0 :(得分:2)
您似乎正在尝试在本地内存中实现MapReduce的排序步骤,但它完全忽略了您所做的操作,并且无论如何都要重新排序每个组中的项目。解决这个问题的正确方法是在键上指定一个比较器,以便在每个分区内,以便合并到reducer的输入是根据该比较函数。这意味着
在您的情况下,您似乎想要将timestamp
添加到该组密钥,告诉它对前三个密钥进行分区,并告诉它对时间戳进行排序。
有关详细信息,请参阅下图和Where is Sort used in MapReduce phase and why?