2010-06-20 54 views
1

我有要求使用map reduce一個接一個地解析Apache訪問日誌和tomcat日誌。很少的字段正在從tomcat日誌中提取,並從Apache日誌中提取。我需要根據時間戳合併/映射提取的字段,並將這些映射字段導出到傳統的關係數據庫(例如MySQL)中。將分析後的日誌數據存儲在hadoop中並將其導出到關係數據庫中

我可以使用正則表達式或豬解析和提取信息。我面臨的挑戰是如何將提取的信息從兩個日誌映射到單個聚合格式或文件以及如何將這些數據導出到MYSQL。

幾種方法我想到的

1)收件地圖的輸出從兩個解析Apache訪問日誌和Tomcat日誌減少到單獨的文件,併合並這些到一個文件中(同樣基於時間戳)。將這些數據導出到MySQL。

2)使用HBase的或配置單元以表的格式的數據存儲在Hadoop和導出到MySQL

3)直接寫圖的輸出用JDBC減少到MySQL。

哪種方法最可行,還請建議您知道的其他解決方案。

回答

2

讓更小,更簡單的MR作業和鏈接在一起比創建大型複雜作業幾乎總是可取的。我認爲你最好的選擇是像#1一樣。換句話說:

  1. 將Apache httpd日誌處理爲統一格式。
  2. 進程Tomcat登錄到一個統一的格式。
  3. 使用任何有意義的邏輯加入1和2的輸出,將結果寫入相同的格式。
  4. 將生成的數據集導出到數據庫。

您可以在同一步驟中執行連接和轉換(1和2)。使用地圖進行變形並進行縮減邊連接。

它聽起來不像你需要/想要隨機存取的開銷,所以我不會看HBase。這並不是它的強項(儘管你可以通過隨時查看HBase中的每條記錄的時間戳,查看它是否存在,合併記錄,或者只是插入,如果它不存在,但是這比較慢)。 Hive可以很方便地存儲這兩種格式的「統一」結果,但您仍然必須將記錄轉換爲該格式。

絕對不想讓reducer直接寫入MySQL。這有效地在數據庫上創建了DDOS攻擊。考慮一個由10個節點組成的集羣,每個節點運行5個reducer,你將有50個併發寫入者到同一個表中。隨着羣集的增長,您將非常快速地超過max連接並扼殺RDBMS。

所有這一切說,問自己是否有道理把這麼多的數據到數據庫中,如果你正在考慮全面的日誌記錄。這一數據量恰恰是Hadoop本身用於長期存儲和處理的情況。如果你計算這些數據的總量,無論如何,把它扔進MySQL。

希望這會有所幫助。

+0

謝謝埃裏克 我正在使用基於文件的方法在數據庫中合併數據的輕微更改,而不是在mapreduce中執行它。來自兩個日誌的解析數據將被存儲到兩個單獨的登臺表中,並將這些登臺表連接起來以獲取最終的彙總數據,這些數據將存儲在決賽桌中。 對於將這麼多數據放入數據庫是否合理的問題,解析後的數據將被彙總爲與日誌文件記錄相比非常少的過濾的有用數據。將數據存儲到關係數據庫中的原因是允許傳統應用程序訪問該數據 – 2010-07-11 03:33:21

相關問題