我遇到了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 example和the 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
高温超导