2017-09-14 77 views
5

場景: 我有記錄的事件一樣在這個CSV如服務:歸結事件的時間間隔

#TimeStamp, Name, ColorOfPullover 
TimeStamp01, Peter, Green 
TimeStamp02, Bob, Blue 
TimeStamp03, Peter, Green 
TimeStamp04, Peter, Red 
TimeStamp05, Peter, Green 

事件例如彼得穿着綠色將連續發生。

我有兩個目標:

  1. 保持數據儘可能小
  2. 保留所有相關數據

相關辦法:我想知道,在這種時間跨度一個人穿着什麼顏色。 E.g:

#StartTime, EndTime, Name, ColorOfPullover 
TimeStamp01, TimeStamp03, Peter, Green 
TimeStamp02, TimeStamp02, Bob, Blue 
TimeStamp03, TimeStamp03, Peter, Green 
TimeStamp04, TimeStamp04, Peter, Red 
TimeStamp05, TimeStamp05, Peter, Green 

在此格式下,我可以回答這樣的問題:哪種顏色彼得穿着在時間TimeStamp02? (我可以安全地假定,每個人穿在之間的兩個記錄了相同顏色的事件相同的顏色。)

主要問題: 我可以使用已經存在的技術來實現這一目標?即我可以提供連續的事件並提取並存儲相關數據?


準確地說,我需要實現一個像這樣的算法(僞代碼)。針對CSV示例的每一行都調用OnNewEvent方法。其中參數event已經包含來自該行的數據作爲成員變量。

def OnNewEvent(even) 
    entry = Database.getLatestEntryFor(event.personName) 
    if (entry.pulloverColor == event.pulloverColor) 
     entry.setIntervalEndDate(event.date) 
     Database.store(entry) 
    else 
     newEntry = new Entry 
     newEntry.setIntervalStartDate(event.date) 
     newEntry.setIntervalEndDate(event.date) 
     newEntry.setPulloverColor(event.pulloverColor)) 
     newEntry.setName(event.personName) 
     Database.createNewEntry(newEntry) 
    end 
end 
+0

它應該是可能的logstash做到這一點,但問題是,你必須做一個elasticsearch要求每行檢索最新的條目,這將使過程非常緩慢。這就是爲什麼我不認爲logstash是正確的工具。 – baudsp

+0

什麼是數據量,以及發生新事件時需要多快反應?如果有些事件丟失了,可以嗎? – ffeast

+0

對事件的反應可能會很慢。例如。 1天延遲是可以接受的。所以,一天一個定時任務可能是一個選擇。 事件不會丟失,這是關鍵任務。 – fex

回答

0
This is typical scenario of any streaming architecture. 

There are multiple existing technologies which work in tandem to get what you want. 


1. NoSql Database (Hbase, Aerospike, Cassandra) 
2. streaming jobs Like Spark streaming(micro batch), Storm 
3. Run mapreduce in micro batch to insert into NoSql Database. 
4. Kafka Distriuted queue 

The end to end flow. 

Data -> streaming framework -> NoSql Database. 
OR 
Data -> Kafka -> streaming framework -> NoSql Database. 


IN NoSql database there are two ways to model your data. 
1. Key by "Name" and for every event for that given key, insert into Database. 
    While fetching u get back all events corresponding to that key. 

2. Key by "name", every time a event for key is there, do a UPSERT into a existing blob(Object saved as binary), Inside the blob you maintain the time range and color seen. 

Code sample to read and write to Hbase and Aerospike 

HBASE:http://bytepadding.com/hbase/

塞式:http://bytepadding.com/aerospike/

+0

這兩個鏈接都打破了 – ffeast

+0

對不起隊友,黑客們很開心,只是把網站修好了。隨時查看例子。並告訴我,如果你需要更多的澄清 – KrazyGautam

0

一種方式做到這一點是使用HiveMQ。 HiveMQ是基於MQTT的消息隊列技術。關於它的好處是你可以編寫自定義插件來處理傳入的消息。要獲取某人的最新條目,HiveMQ插件中的哈希表可以正常工作。如果不同人數很多,我會考慮使用像Redis這樣的緩存緩存每個人的最新事件。

您的服務將活動發佈到HiveMQ。 HiveMQ插件處理傳入事件,並更新您的數據庫。

HiveMQ Plugin

Redis