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

Hadoop 使用Mapreduce映射不总是出现在同一行上的多个唯一值,hadoop,mapreduce,Hadoop,Mapreduce,我在使用Mapreduce时遇到了一个复杂的问题。我试图匹配两个不总是在同一行中同时出现的唯一值。一旦我将这些映射出来,我需要计算该映射的唯一事件总数 我正在处理的日志文件是100GB以上的未压缩文件,数据分为两部分,我需要将它们组合在一起。这些事件分布在许多不同的日志文件中。我认为描述这个问题最简单的方法是显示一个日志样本 [2010/09/23 12:02am] AAAAAAAAAA BBBBBBBBBB Event message type A [2010/09/23 12:0

我在使用Mapreduce时遇到了一个复杂的问题。我试图匹配两个不总是在同一行中同时出现的唯一值。一旦我将这些映射出来,我需要计算该映射的唯一事件总数

我正在处理的日志文件是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 [2010/09/23 12:02am]AAAAAAAAABBBBBBBB事件消息类型A [2010/09/23 12:02am]BBBBBB事件消息类型B [2010/09/23 12:03am]BBBBBB事件消息类型B [2010/09/23 12:09am]bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb [2010/09/23 12:01am]中交DDDD事件消息类型A [2010/09/23 12:05am]DDDD事件消息类型A [2010/09/23 12:06am]DDDD事件消息类型C 第2列和第3列是不匹配的唯一ID。我需要在第4列中列出与第2列和第3列链接的唯一项目的数量。第二列始终至少出现一次。第三列始终存在。第4列可能存在,也可能不存在。我仍然想将第4列作为未知事件计算。唯一值的实际数量达到数百万,总日志行数达到数十亿

上述问题的解决方案应该是

AAAAAAAAAA,BBBBBBBBBB,A 1 AAAAAAAAAA,BBBBBBBBBB,B 2 AAAAAAAAAA,BBBBBBBBBB,Unknown 1 CCCCCCCCCC,DDDDDDDDDD,A 2 CCCCCCCCCC,DDDDDDDDDD,C 1 AAAAAAAA,BBBBBBBB,A 1 AAAAAAAA,BBBBBBBB,B 2 AAAAAAAA,BBBBBBBB,未知1 中交,dddddddd,A 2 中交,中交,中交,中交1 我曾想过在两个单独的mapreduces中分解第2列和第3列,但将这些结果重新组合在一起是很困难的。不确定如何使用最终Mapreduce来组合这些值。第二列将在文件中的所有位置。它可能在凌晨1点出现,然后在晚上11点再次出现


有没有关于如何使用Hadoop mapreduce解决此问题的建议?我使用的是Hadoop流媒体,不懂Java。

我给你的建议是如下所示:

  • 确保所有记录包含所有值
  • 聚合(即计数)
  • 所以你从(你展示的内容的细微变化)开始:

    步骤1将使用“BBBBBBBBBB”作为键,并进行二次排序(and),以确保带有“aaaaaaaa”的记录是到达减速机的“第一个”。 在reducer中,您为所有记录提供与第一个记录相同的“第二列”值(“aaaaaa”)。您不需要进行聚合,只需使记录完整即可。这意味着在没有事件的情况下添加“未知”

    因此,在第一步之后,你会得到如下结果:

       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”示例相同的操作 将整个“aaaaaaaaaaaabbbbbbbb事件消息类型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

    欢迎来到堆栈溢出。一旦找到问题的正确答案,请记住“接受”。这有助于其他贡献者知道您的问题已经解决,并奖励帮助您的人。
       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