2013-10-04 92 views
1

EMR新手警報創建用戶日誌:EMR - 從日誌

我們必須包含我們網站的使用數據大日誌。客戶通過其客戶ID進行身份驗證和識別。每當我們嘗試解決客戶問題時,我們都會grep通過所有日誌(使用customer_id作爲搜索條件)並將結果傳送到文件中。然後我們使用結果文件來解決問題。我們正在考慮使用EMR創建每個客戶的日誌文件,因此我們不必按需創建每個客戶的日誌文件。 EMR會爲我們每個小時爲每個客戶做到這一點。

我們正在查看EMR流,併爲地圖步驟生成了一個小紅寶石腳本。現在我們有一個關鍵/值(userid,logdata)的大列表。

然而,我們仍然堅持減少步驟。理想情況下,我希望生成一個包含特定客戶的所有logdata的文件,並將其放入S3存儲桶中。任何人都可以指出我們如何做到這一點? EMR甚至是我們想要使用的技術嗎?

感謝, 諾

回答

0

一種可能是使用的標識減速,規定通過房地產reduce任務提前數。您將獲得固定數量的文件,其中用戶的集合的所有記錄都將生活。要找到正確的文件來搜索特定用戶,請散列該用戶標識以確定正確的文件並在其中進行搜索。

如果你真的想爲每個用戶創建一個文件,你的reducer每次調用時都會生成一個新文件。我很確定有很多s3客戶端庫可用於ruby。

0

看看Splunk。這是一個企業級工具,用於發現大量文本數據中的模式和關係。我們使用它來監控大型網站的Web和應用程序日誌。只需讓Splunk索引所有內容並使用搜索引擎鑽取數據 - 無需進行預處理。

過這個剛跑:Getting Started with Splunk as an Engineer

0

不看你的代碼,沒錯,這就是通常很容易在MapReduce的做;這裏最好的情況是如果你有許多用戶(誰不想這麼做?),並且每個用戶的交互次數有限。

抽象地,輸入數據可能會是這個樣子:

File 1: 
1, 200, "/resource", "{metadata: [1,2,3]}" 

File 2: 
2, 200, "/resource", "{metadata: [4,5,6]}" 
1, 200, "/resource", "{metadata: [7,8,9]}" 

如果這僅僅是一個記錄的用戶,HTTP狀態,路徑/資源,和一些元數據。這裏最好的辦法就是確實只關注你的映射器清理數據,將其轉化爲可以使用的格式,並將用戶ID和其他所有內容(很可能還包括用戶標識)作爲鍵/值對發佈。

我不是非常熟悉的Hadoop流,而是根據文件:By default, the prefix of a line up to the first tab character is the key,所以這可能看起來像:

1\t1, 200, "/resource", "{metadata: [7,8,9]}" 

注意,1是重複的,因爲你可能想使用它的輸出,而不只是作爲洗牌的一部分。這就是從單一的映射器處理File 1File 2處理轉入somethig更像:

1: 
1, 200, "/resource", "{metadata: [1,2,3]}" 
1, 200, "/resource", "{metadata: [7,8,9]}" 

2: 
2, 200, "/resource", "{metadata: [4,5,6]}" 

正如你所看到的,我們已經基本上完成了我們的每用戶grep的!這只是做我們最後的轉變的問題,可能包括一種排序(因爲這基本上是時間序列數據)。這就是爲什麼我早些時候說過,如果你有很多用戶和有限的用戶交互,這對你來說會更好。排序(或通過網絡發送!)每個用戶的MB數量不會特別快(儘管可能仍然比替代方案更快)。

總之,它取決於規模和用例,但通常情況下,這是一個非常適合總體映射/減少的問題。