使用 Hadoop/MapReduce 查找匹配行
Posted
技术标签:
【中文标题】使用 Hadoop/MapReduce 查找匹配行【英文标题】:Finding matching lines with Hadoop/MapReduce 【发布时间】:2010-02-05 21:22:16 【问题描述】:我正在使用 Hadoop,并在 Ubuntu 上建立了一个两节点集群。 WordCount 示例运行良好。
现在我想编写自己的 MapReduce 程序来分析一些日志数据(主要原因:看起来很简单,我有很多数据)
日志中的每一行都有这种格式
<UUID> <Event> <Timestamp>
其中事件可以是 INIT、START、STOP、ERROR 和其他一些。我最感兴趣的是同一 UUID 的 START 和 STOP 事件之间经过的时间。
例如,我的日志包含这样的条目
35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584
[...many other lines...]
35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777
我当前的线性程序读取文件,记住内存中的开始事件,并在找到相应的结束事件后将经过的时间写入文件(当前忽略具有其他事件的行,错误事件使 UUID 无效它也会被忽略)1
我想将此移植到 Hadoop/MapReduce 程序。但我不确定如何匹配条目。拆分/标记文件很容易,我想找到匹配项将是一个 Reduce-Class。但那会是什么样子呢? 如何在 MapReduce 作业中查找数学条目?
请记住,我的主要重点是了解 Hadopo/MapReduce;欢迎链接到 Pig 和其他 Apache 程序,但我想用纯 Hadoop/MapReduce 解决这个问题。谢谢。
1)由于日志是从正在运行的应用程序中获取的,由于日志文件拆分,一些启动事件可能还没有对应的结束事件,并且会有没有启动事件的结束事件
【问题讨论】:
【参考方案1】:如果您在 map 中发出 UUID 作为键:emit(<uuid>, <event, timestamp>)
,您将在您的 reduce 中收到此 UUID 的所有事件:
key = UUID, values = <event1, timestamp1>, <event2, timestamp2>
然后您可以根据时间戳对事件进行排序,并决定是否将它们发送到结果文件中。
奖励:您可以使用job.setSortComparatorClass();
设置您自己的排序类,这样您的条目就会在reduce 中按照它们的时间戳排序:
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);
...
【讨论】:
当然,这是有道理的。我没有找到匹配项,而是按关键字对它们进行分组。这也可以让我分析未来的其他事件。谢谢【参考方案2】:我认为你可以通过让你的地图函数输出 UUID 作为它的键和该行的其余部分作为它的值来做到这一点。然后,reduce 函数将传递具有相同 UUID 的所有日志条目的集合。当它处理它们时,它可以跟踪它看到的各种事件并采取相应的行动 - 例如,当它看到一个 START 事件时,它可以将一个局部变量设置为从起始行提取的时间,然后当它看到一个 STOP事件它可以从中提取时间,减去开始时间,并输出差值(如果它在开始之前看到停止,则执行类似操作)。
【讨论】:
以上是关于使用 Hadoop/MapReduce 查找匹配行的主要内容,如果未能解决你的问题,请参考以下文章