2017-07-20 25 views
0

我正在向kafka記錄頁面訪問和搜索查詢(某種點擊流分析)。我打算定期批量處理它們,比如每小時或每天,然後將彙總結果寫入elasticsearch。每小時或每天都有一個kafka話題是典型的嗎?

如果沒有寫入kafka,而是寫入文件系統,則很容易將記錄器配置爲寫入文件名中帶有時間戳的文件,該文件按照小時/天的間隔自動分隔日誌。

但與卡夫卡,我GOOGLE了足夠多的時間,還沒有找到每小時/每天創建一個新的話題的任何例子。如果不每小時/每天創建一個新話題,我只能想象通過logstash/flume將日誌從kafka移動到文件系統或hdfs。

是否很少直接在kafka上進行批處理(每小時/天)?

+0

我不確定我明白你爲什麼每小時/每天需要一個新話題。爲什麼不將所有日誌發送到單個主題,並進行批處理?每次處理後,主題分區上提交的偏移量都會前移,因此您將不會重新處理相同的日誌。 – vahid

+0

如果所有數據都寫入同一主題,因爲它們可能以不同的順序到達,這意味着數據中的「CreatedTime」可能沒有排序。要確定每一天的界限是很困難的(儘管在我的情況下可能會有輕微的不準確性)。如果寫了不同的主題,我可以很容易地檢查某個主題的上次修改時間是否比當前時間早得多(假設我的批次每天在上午00:10運行)。 – foresightyj

+0

您可以通過一個鍵在邏輯上對主題進行分區(在這種情況下,鍵可以是一天中的小時)。卡夫卡將確保所有具有相同密鑰的消息進入相同的分區,並因此被單個消費者線程佔用。 – Rahul

回答

1

Kafka由LinkedIn開發,它在LinkedIn中的作用是日誌聚合中心。所以卡夫卡非常適合處理這類問題。

我認爲每個事件(事件就像網頁訪問或查詢)應該在Web服務器中用時間戳標記,而不是在日誌發送到Kafka時。更具體地說,當頁面訪問事件發生時,它實際上會向您的Web服務器發出請求,然後您的Web服務器處理該請求並返回響應。同時,您的Web服務器應該使用時間戳記錄此事件,並且此時間戳記是事件唯一正確的時間點。關於如何記錄事件?您可以創建一個log_producer將日誌消息發送到您的Kafka的特定主題,而不僅僅是將其記錄在本地文件中。

關於每小時批處理日誌,您可以創建24個分區,並將日誌「HOUR」作爲分區鍵,然後如果執行批處理,只需要在分區H想要處理的是H。由於您只需處理最新的H小時日誌,因此舊的H'log已由較舊的過程工作處理並保存。

相關問題