使用 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(&lt;uuid&gt;, &lt;event, timestamp&gt;),您将在您的 reduce 中收到此 UUID 的所有事件: key = UUID, values = &lt;event1, timestamp1&gt;, &lt;event2, timestamp2&gt;

然后您可以根据时间戳对事件进行排序,并决定是否将它们发送到结果文件中。

奖励:您可以使用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 查找匹配行的主要内容,如果未能解决你的问题,请参考以下文章

如何获取hadoop mapreduce job运行信息

Hadoop MapReduce输出最大化

Hadoop运行模式

Hadoop MapReduce 新旧 mapred 与 mapreduce API

Hadoop MapReduce输入输出类型

hadoop MapReduce 读取配置参数