使用Mapreduce映射多个唯一值并不总是出现在同一行上

时间:2010-09-23 21:23:39

标签: hadoop mapreduce

我遇到了Mapreduce的复杂问题。我试图匹配2个并不总是在同一行中存在的唯一值。一旦我将它们映射出来,我就需要计算该映射的唯一事件总数。

我正在处理的日志文件是100GB +未压缩的,并且数据分为两部分,我需要将它们放在一起。事件分布在许多不同的日志文件中。我认为描述问题的最简单方法是显示日志样本。

[2010/09/23 12:02am]   AAAAAAAAAA   BBBBBBBBBB   Event message type A
[2010/09/23 12:02am]                BBBBBBBBBB   Event message type B
[2010/09/23 12:03am]                BBBBBBBBBB   Event message type B
[2010/09/23 12:09am]                BBBBBBBBBB

[2010/09/23 12:01am]   CCCCCCCCCC   DDDDDDDDDD   Event message type A
[2010/09/23 12:05am]                DDDDDDDDDD   Event message type A
[2010/09/23 12:06am]                DDDDDDDDDD   Event message type C

第2列和第3列是永不匹配的唯一ID。我需要绘制链接到第2列和第3列的第4列中的唯一项目数。第二列始终至少存在一次。第3列始终存在。第四列可能存在也可能不存在。我仍然想把第四列算作未知事件。实际的唯一值数量达到数百万,总记录线数达到数十亿。

上述解决方案应该是。

AAAAAAAAAA,BBBBBBBBBB,A    1
AAAAAAAAAA,BBBBBBBBBB,B    2
AAAAAAAAAA,BBBBBBBBBB,Unknown    1

CCCCCCCCCC,DDDDDDDDDD,A    2
CCCCCCCCCC,DDDDDDDDDD,C    1

我曾考虑在2个单独的mapreduces中分解第2和第3列,但将这些结果重新组合在一起是多毛的。不知道如何将最终的Mapreduce结合起来组合这些值。第二列将遍布文件中的所有位置。它可能会在凌晨1点再次出现在凌晨1点。

有关如何使用Hadoop mapreduce解决此问题的任何建议?我正在使用Hadoop流,不懂Java。

1 个答案:

答案 0 :(得分:2)

我建议你这样做:

  1. 确保所有记录都包含所有值。
  2. 聚合(即计数)。
  3. 所以你开始(你所展示的内容略有不同):

    [2010/09/23 12:01am]                BBBBBBBBBB   Event message type B
    [2010/09/23 12:02am]   AAAAAAAAAA   BBBBBBBBBB   Event message type A
    [2010/09/23 12:03am]                BBBBBBBBBB   Event message type B
    [2010/09/23 12:09am]                BBBBBBBBBB   
    
    [2010/09/23 12:01am]                DDDDDDDDDD   Event message type A
    [2010/09/23 12:05am]   CCCCCCCCCC   DDDDDDDDDD   Event message type A
    [2010/09/23 12:06am]                DDDDDDDDDD   Event message type C
    

    步骤1将使用“BBBBBBBBBB”作为键并进行辅助排序(See the Hadoop examplethe explanation in Tom's book)以确保具有“AAAAAAAAAA”的记录是“第一个”到达减速机。 在reducer中,您为所有记录提供与第一个相同的“第二列”值(“AAAAAAAAAA”)。您不进行聚合,只需完成记录。这意味着如果没有事件,也会添加“未知”。

    所以在第一步之后你会有这样的事情:

       AAAAAAAAAA   BBBBBBBBBB   Event message type B
       AAAAAAAAAA   BBBBBBBBBB   Event message type A
       AAAAAAAAAA   BBBBBBBBBB   Event message type B
       AAAAAAAAAA   BBBBBBBBBB   Unknown
    
       CCCCCCCCCC   DDDDDDDDDD   Event message type A
       CCCCCCCCCC   DDDDDDDDDD   Event message type A
       CCCCCCCCCC   DDDDDDDDDD   Event message type C
    

    然后在第二步中,您基本上与众所周知的“Wordcount”示例相同 将整个“AAAAAAAAAA BBBBBBBBBBB事件消息类型B”作为您的“单词”。

    为您提供所需的输出:

       AAAAAAAAAA   BBBBBBBBBB   Event message type B     2
       AAAAAAAAAA   BBBBBBBBBB   Event message type A     1
       AAAAAAAAAA   BBBBBBBBBB   Unknown                  1
    
       CCCCCCCCCC   DDDDDDDDDD   Event message type A     2
       CCCCCCCCCC   DDDDDDDDDD   Event message type C     1
    

    HTH