Hadoop map reduce:分组时记录的顺序

Hadoop map reduce:分组时记录的顺序,hadoop,mapreduce,Hadoop,Mapreduce,我在每行输入中都有一条记录,每条记录大约有10个字段。首先,我通过三个字段将记录分组(field1、field2、field3),因此一个映射器/还原器负责一个唯一的组(基于三个字段)。在每个组中,我根据另一个整型字段timestamp对记录进行排序,并通过添加另一个字段,使用相同的标签aTag标记组中的每个记录 假设在mapper#1中,我将一个排序的组标记为aTag,在mapper#2中,我将另一个组(一个不同的组,因为我最初根据三个字段对记录进行分组)标记为相同的标记aTag 现在,如果我

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

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

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


这是因为我试图以gzip格式存储记录,因此它试图重新排序记录以便更好地压缩吗?另外,我想知道如何在按标记名分组后保持顺序

似乎您正试图在本地内存中自己实现MapReduce的排序步骤,但它完全忽略了您所做的操作,并对每个组中的项目重新排序。解决这个问题的正确方法是在键上指定一个比较器,这样在每个分区内,还原程序的合并输入就根据这个比较函数。这意味着

  • 你不必自己排序
  • 在一台机器上对一个非常大的组进行排序时,不会耗尽内存
  • 在您的情况下,您似乎希望将
    timestamp
    添加到一组键中,告诉它在前三个键上分区,并告诉它在时间戳上排序

    有关更多信息,请参见下图,以及


    谢谢@Andrew。事实上,我正在用猪脚本启动作业。我解决了这个问题,再次根据三个字段对记录进行排序,每个构造使用嵌套<代码>B=A组(按标签);C=foreach B{sorted=按字段1、字段2、字段3对A排序;生成展平(排序);}