我玩弄Hadoop和已设置在Ubuntu一个双节点群集。该字计数示例运行得很好。

现在我想写我自己的MapReduce程序来分析一些日志数据(主要的原因:它看起来简单,我有大量的数据)

在日志HAST每行这个格式

<UUID> <Event> <Timestamp>

其中事件可以被INIT,启动,停止,ERROR和其他一些。我很感兴趣,最重要的是开始之间所经过的时间,并停止同UUID事件。

例如,我的日志中包含如下条目

35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584
[...many other lines...]
35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777

我的电流,线性程序通过文件中读取,记住该启动事件的内存中,并且一旦它找到了相应的端事件写入的经过时间到文件中(与其它事件线目前忽略,ERROR事件无效一个UUID和它将被忽略,太) 1

我想端口这一个的Hadoop / MapReduce的程序。但我不知道怎么办的条目匹配。拆分/符号化的文件很容易,我想,要找到比赛将是一个减少级。但如何将是什么样子? 如何才能找到mathing在MapReduce工作条目?

请记住,我的主要重点是了解Hadopo / MapReduce的;链接到猪和其他Apache的计划是受欢迎的,但我想解决这个一个用纯的Hadoop / MapReduce的。谢谢你。

1) 由于日志从运行的应用程序截取,一些启动事件可能尚未具有对应端的事件和将有最终事件而不startevents,由于日志文件分割

有帮助吗?

解决方案

如果您在发出地图为重点的UUID:emit(<uuid>, <event, timestamp>)您会收到您减少这种UUID的所有事件: key = UUID, values = {<event1, timestamp1>, <event2, timestamp2>}

然后就可以在时间戳的事件进行排序,并决定是否将它们发射到生成的文件或没有。

奖励:您可以使用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);
      ...

其他提示

我想你可以通过使您的地图功能输出的UUID为核心而行,其值为其余做到这一点。然后降低会被传递给具有相同UUID的所有日志条目的集合。当它处理它们可以跟踪它看到的各种事件,并采取相应的行动 - 例如,当它看到一个启动事件可以设置一个局部变量从一开始行提取的时间,然后当它看到一个STOP事件可以从其中提取时间,减去开始时间,并输出差(和做类似地,如果它看到STOP开始之前)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top