Muszę przechowywać i móc wyszukiwać bardzo duże ilości danych szeregów czasowych.
Właściwości danych są następujące:
- liczba serii: około 12.000 (dwanaście tysięcy)
- liczba punktów danych na świecie: około 500 000 000 miesięcznie (pięćset milionów)
- mieszane typy wartości: większość punktów danych to wartości zmiennoprzecinkowe, reszta to łańcuchy
- okres próbkowania: zmienny między seriami, a także w obrębie serii
- znaczniki czasu: precyzja milisekundowa
- okres przechowywania danych: kilka lat, bez rozkładu i próbkowania w dół
- archiwa danych muszą być wbudowane prawie w czasie rzeczywistym, ale rozsądne opóźnienie (~ 1 godzina) jest dopuszczalne
- dane z przeszłości można w razie potrzeby odbudować, ale kosztem
- czasami, ale dość rzadko, niektóre wcześniejsze dane wymagają aktualizacji
Właściwości przewidywanych zapytań:
- większość zapytań dotyczących danych będzie zapytaniami opartymi na znacznikach czasu; od jednego dnia do kilku miesięcy / lat. 90% + to zapytania dotyczące najnowszych danych
Inne wymagania:
- rozwiązanie musi być darmowe, jak w darmowym piwie i najlepiej open source
Moją początkową myślą było użycie PyTables / Pandas z plikami HDF5 do przechowywania backendu zamiast bazy danych SQL.
Pytania :
Zakładając, że PyTables / Pandas jest „najlepszą” trasą, czy lepiej byłoby podzielić dane na kilka plików HDF, z których każdy obejmuje dany okres, czy umieścić wszystko w jednym pliku, który stałby się ogromny?
Czy powinienem wybrać format stały lub tabelowy? Dla mnie ustalony format wygląda OK, jeśli trzymam jeden plik HDF na miesiąc, ponieważ w ten sposób cała seria prawdopodobnie mieści się w pamięci RAM i mogę kroić w pamięci bez potrzeby indeksowania formatu tabeli. Mam rację ?
A jeśli to nie jest najlepsze podejście, jak powinienem ustrukturyzować ten magazyn danych lub jakie technologie powinienem rozważyć? Nie jestem pierwszym, który zajmuje się przechowywaniem dużych zbiorów danych szeregów czasowych, jakie jest ogólne podejście do rozwiązania tego problemu?
Inne podejścia, które rozważałem:
- bazy danych tablic: doskonale nadają się do szeregów czasowych ze stałym okresem próbkowania, ponieważ wystarczy przechowywać czasy rozpoczęcia i zakończenia oraz okres próbkowania tablicy, a następnie tylko wartości w samej tablicy i indeksowanie jest łatwe. Ale ze zmiennymi okresami próbkowania w samych seriach muszę zachować bliższą relację znacznika czasu-> wartość, która moim zdaniem nie jest tak dobrze dopasowana do tablicy DBMS.
- standardowa baza danych SQL z datownikiem, paramID, wartością jako kolumnami, ale ze swej natury żądają dużej ilości dyskowych operacji we / wy dla każdego zapytania
źródło
Odpowiedzi:
Możesz rzucić okiem na węgiel i szept , część projektu grafitowego . Carbon może obsługiwać bardzo duże ilości danych szeregów czasowych. Chociaż teraz, kiedy czytam dokumenty (minęło kilka lat, odkąd ich używałem), to tylko dla danych liczbowych. Powiedziałeś, że masz również ciąg danych, więc może ci się to nie przydać. Chociaż możesz uzyskać wiedzę na temat szybkiego przetwarzania dużych ilości danych.
Aby dać wyobrażenie o tym, jak dobrze się skaluje, kiedy grafit został po raz pierwszy wprowadzony do produkcji w Orbitz, przetwarzał 160 000 wskaźników na minutę .
źródło
InfluxDB to otwarta baza danych napisana w Go. Został napisany specjalnie do obsługi danych szeregów czasowych i opublikowali testy porównawcze pokazujące znacznie lepszą wydajność w porównaniu do Cassandry :
źródło
możesz sprawdzić bazy danych zorientowane na kolumny. Nie jestem pewien, co masz na myśli mówiąc o macierzowych bazach danych, ale dzięki mojemu sugerowanemu podejściu możesz mieć dynamiczną liczbę wartości na przedział czasu. Możesz także mieć wiele wartości dla tego samego znacznika czasu. Co ciekawe, jeśli masz wartości zmierzone w tym samym czasie, możesz zapisać je jako dodatkowe kolumny (np. Czujnik mierzący temperaturę i wilgotność, w cenie giełdowej i wielkości transakcji, ...). Ze względu na charakter zorientowany na kolumny można mieć tabele zawierające 100 kolumn, ale jeśli zapytanie ma dostęp tylko do pięciu kolumn, baza danych odczytuje tylko dane z pięciu kolumn.
Napisałem serię o tworzeniu własnej bazy danych szeregów czasowych, możesz rzucić na to okiem:
źródło