2013-02-28 35 views
0

我在每行输入中有记录,每个记录有大约10个字段。首先,我将记录按三个字段分组(field1, field2, field3),因此一个映射器/缩减器负责一个唯一组(基于三个字段)。在每个组中,我根据另一个整数字段timestamp对记录进行排序,并通过添加另一个字段来标记具有相同标记aTag的组中的每个记录。Hadoop map-reduce:分组时的记录顺序

比方说,在映射#1,我标记排序的组作为aTag和映射器#2,我标记另一组具有相同标签aTag(不同的组,因为我最初分组基于三个字段的记录) 。

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

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

回答

2

看来你试图在本地内存中实现MapReduce的排序步骤,但是它完全忽略了你所做的并且重新排序了每个组中的项目。解决这个问题的正确方法是在键上指定一个比较器,以便在每个分区中这样就可以根据比较函数对reducer进行合并输入。这意味着,

  1. 你不必做整理自己
  2. 你没有一台机器试图理清一个非常大的群体上运行内存不足。

看起来你的情况下,你想要添加timestamp到一组键上,告诉它在前三个键上进行分区,并告诉它在时间戳上排序。

有关详细信息,请参阅下面的图,Where is Sort used in MapReduce phase and why?

enter image description here

+0

由于@Andrew。其实我正在用猪脚发动工作。我通过使用每个构造的嵌套对基于三个字段的记录再次排序来解决问题。 'B =标签A组; C = foreach B排序A按字段1,字段2,字段3排序; flat flat(sorted); }' – sachin2182 2013-03-03 06:11:22