2017-09-14 116 views
5

Scenariusz: mam usługę, która rejestruje zdarzenia, jak w tym przykładzie csv:sprowadzają się do wydarzeń odstępach czasowych

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

wydarzeń, które na przykład Peter nosi Zielony pojawi się bardzo często z rzędu.

Mam dwa cele:

  1. przechowuje dane jak najmniejsza
  2. Zachowaj wszystkie istotne dane z

ze środkami: Muszę wiedzieć, w którym czas przęsła osoba była w jakim kolorze. Np:

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

W tym formacie, mogę odpowiedzieć na pytania: Który kolor był Peter noszenia w czasie TimeStamp02? (Można bezpiecznie założyć, że każda osoba ma ten sam kolor pomiędzy dwoma rejestrowane zdarzenia dla tego samego koloru).

główne pytanie: Czy mogę korzystać z już istniejących technologii, aby to osiągnąć? To znaczy. Mogę dostarczyć mu ciągły strumień wydarzeń i wyodrębnia i przechowuje odpowiednie dane?


Dokładniej, muszę zaimplementować taki algorytm (pseudokod). Metoda OnNewEvent jest wywoływana dla każdej linii przykładu CSV. Gdzie parametr event zawiera już dane z linii jako zmienne składowe.

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

Powinno być możliwe, aby to zrobić z logstash, ale problemem jest to, że będziesz musiał zrobić żądania elasticsearch dla każdej linii, aby pobrać najnowszy wpis, który sprawi, że proces bardzo powolny. Dlatego nie uważam, że logstash jest odpowiednim narzędziem do tego. – baudsp

+0

Jakie są ilości danych i jak szybko należy reagować w przypadku wystąpienia nowego zdarzenia? Czy jest OK, jeśli niektóre wydarzenia zostaną utracone? – ffeast

+0

Reakcja na zdarzenia może być powolna. Na przykład. Dopuszczalne jest 1-dniowe opóźnienie. Tak więc jedna z codziennych pracy crona może być opcją. Wydarzenia nie mogą zostać utracone, to jest krytyczne dla misji. – fex

Odpowiedz

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/

Aerospike: http://bytepadding.com/aerospike/

+0

oba łącza są zepsute – ffeast

+0

Przykro mi, kolego, hakerzy dobrze się bawili, tylko naprawili witrynę. Zapraszam do przejrzenia przykładów. i powiedz mi, jeśli potrzebujesz więcej wyjaśnień – KrazyGautam

0

Jednym ze sposobów, aby to zrobić jest użycie HiveMQ. HiveMQ jest technologią kolejkowania komunikatów opartą na MQTT. Ciekawe, że możesz napisać niestandardowe wtyczki do przetwarzania przychodzących wiadomości. Aby uzyskać najnowszy wpis zdarzenia dla osoby, tablica hash w wtyczce HiveMQ działałaby dobrze. Jeśli liczba różnych osób jest bardzo duża, rozważyłbym użycie pamięci podręcznej takiej jak Redis do buforowania ostatniego wydarzenia dla każdej osoby.

You service publikuje zdarzenia do HiveMQ. Wtyczka HiveMQ przetwarza przychodzące zdarzenia i aktualizuje bazę danych.

HiveMQ Plugin

Redis