我遇到了Mapreduce的一个复杂问题。我试图匹配不总是出现在同一行中的2个唯一值。映射完这些之后,我需要计算该映射的唯一事件总数。

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

[2010/09/23 12:02 am] AAAAAAAAAA BBBBBBBBBB事件消息类型A
[2010/09/23 12:02 am] BBBBBBBBBB事件消息类型B
[2010/09/23 12:03 am] BBBBBBBBBB事件消息类型B
[2010/09/23 12:09 am] BBBBBBBBBBBB

[2010/09/23 12:01 am] CCCCCCCCCC DDDDDDDDDD事件消息类型A
[2010/09/23 12:05 am] DDDDDDDDDD事件消息类型A
[2010/09/23 12:06 am] DDDDDDDDDD事件消息类型C

第2列和第3列是永不匹配的唯一ID。我需要在链接到第二和第三列的第四列中绘制唯一项的数量。第二列始终至少出现一次。第三列始终存在。第四列可能存在也可能不存在。我仍然希望将第4列计为未知事件。唯一值的实际数量达到数百万,而总的日志行达到数十亿。

上面的解决方案应该是。

AAAAAAAAAA,BBBBBBBBBB,A 1
AAAAAAAAAA,BBBBBBBBBB,B 2
AAAAAAAAAA,BBBBBBBBBB,未知1

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

我曾考虑过在2个单独的mapreduce中分解第二和第三列,但是将这些结果重新组合起来是一件很麻烦的事情。不确定如何进行最终的Mapreduce合并这些值。第二列将在文件中的所有位置。它可能出现在凌晨1点,然后在晚上11点再次出现。

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

最佳答案

我对您的建议是执行以下操作:

  • 确保所有记录包含所有值。
  • 汇总(即计数)。

  • 因此,从(显示的内容略有变化)开始:
    [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 BBBBBBBBBB事件消息类型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
    

    高温超导

    10-07 23:39