当前位置:  开发笔记 > 编程语言 > 正文

使用Hadoop/MapReduce查找匹配的行

如何解决《使用Hadoop/MapReduce查找匹配的行》经验,为你挑选了1个好方法。

我正在玩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) 由于日志来自正在运行的应用程序,因此一些启动事件可能还没有相应的结束事件,并且由于日志文件拆分,将会有没有启动事件的结束事件



1> Leonidas..:

如果您将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);
      ...

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有