我正在玩Hadoop并在Ubuntu上设置了一个双节点集群.WordCount示例运行得很好.
现在我想编写自己的MapReduce程序来分析一些日志数据(主要原因:它看起来很简单,而且我有足够的数据)
日志中的每一行都有这种格式
事件可以是INIT,START,STOP,ERROR等.我最感兴趣的是同一个UUID的START和STOP事件之间经过的时间.
例如,我的日志包含这些条目
35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584 [...many other lines...] 35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777
我当前的线性程序读取文件,记住内存中的启动事件,并在找到相应的结束事件后将经过的时间写入文件(其他事件的行当前被忽略,ERROR事件使UUID失效,它将也被忽略了)1
我想将其移植到Hadoop/MapReduce程序.但我不知道如何匹配条目.拆分/标记文件很容易,我想找到匹配将是Reduce-Class.但那会是什么样子?如何在MapReduce作业中找到mathing条目?
请记住,我的主要关注点是了解Hadopo/MapReduce; 欢迎链接到Pig和其他Apache程序,但我想用纯Hadoop/MapReduce来解决这个问题.谢谢.
1) 由于日志来自正在运行的应用程序,因此一些启动事件可能还没有相应的结束事件,并且由于日志文件拆分,将会有没有启动事件的结束事件
如果您将map中的UUID作为键发出:emit(
您将在reduce中收到此UUID的所有事件:
key = UUID, values = {
然后,您可以按时间戳对事件进行排序,并决定是否将它们发送到结果文件中.
额外奖励:您可以job.setSortComparatorClass();
用来设置自己的排序类,这样您就可以在减少的时间戳中对您的条目进行排序:
public static class BNLSortComparator extends Text.Comparator { public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { String sb1, sb2; try { sb1 = Text.decode(b1, s1, l1); ...