2010-02-05 54 views
4

我在玩Hadoop並在Ubuntu上設置了兩個節點集羣。 WordCount示例運行得很好。查找與Hadoop/MapReduce的匹配行

現在,我想我自己寫的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 

我目前,線性規劃,通過文件讀取,記得開始的事件中,存儲記錄,一旦發現寫經過的時間到一個文件相應的結束事件(當前忽略其他事件的行,ERROR事件使UUID無效,並且它也將被忽略)

我想將其移植到Hadoop/MapReduce程序。但我不知道如何做匹配的條目。分割/標記文件很容易,我猜想找到匹配項將是一個Reduce-Class。但是,這將如何? 如何在MapReduce作業中找到mathing條目?

請記住,我的主要重點是瞭解Hadopo/MapReduce;歡迎使用Pig和其他Apache程序的鏈接,但我想用純Hadoop/MapReduce來解決這個問題。謝謝。

1)由於日誌從運行的應用程序採取一些啓動事件可能還沒有相應的結束事件會有最終事件,而startevents,由於日誌文分裂

回答

8

如果您發出在地圖中關鍵的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); 
     ... 
+1

當然,這是有道理的。我沒有找到匹配,而是通過密鑰進行分組。這也可以讓我分析未來的其他事件。謝謝 – phisch

3

我想你可以通過使你的map函數輸出UUID作爲它的關鍵字和其餘的行作爲它的值來實現這一點。然後,reduce函數將傳遞具有相同UUID的所有日誌條目的集合。當它處理它們時,它可以跟蹤它看到的各種事件並相應採取行動 - 例如,當它看到一個START事件時,它可以將一個局部變量設置爲從起始行提取的時間,然後當它看到一個STOP它可以從中提取時間,減去開始時間並輸出差異(如果在開始之前看到停止,則執行類似操作)。