Bagaimana cara menyimpan data deret waktu besar secara efisien?

27

Saya perlu menyimpan dan dapat meminta beberapa data deret waktu dalam jumlah yang sangat besar.

Properti data adalah sebagai berikut:

  • jumlah seri: sekitar 12.000 (dua belas ribu)
  • jumlah titik data, secara global: sekitar 500.000.000 per bulan (lima ratus juta)
  • tipe nilai campuran: sebagian besar titik data adalah nilai titik mengambang, sisanya adalah string
  • periode sampling: variabel antara seri dan juga dalam seri
  • cap waktu: presisi milidetik
  • periode penyimpanan data: beberapa tahun, tanpa pembusukan atau downsampling
  • arsip data harus dibangun dalam waktu dekat, tetapi penundaan yang wajar (~ 1 jam) dapat diterima
  • data masa lalu dapat dibangun kembali jika diperlukan, tetapi dengan biaya tinggi
  • kadang-kadang, tetapi sangat jarang, beberapa data masa lalu perlu diperbarui

Properti kueri yang dibayangkan:

  • sebagian besar kueri terhadap data akan menjadi kueri berbasis timestamp; mulai dari satu hari hingga beberapa bulan / tahun. 90% + akan menjadi pertanyaan pada data terbaru

Persyaratan lainnya:

  • solusinya harus gratis seperti dalam bir gratis dan lebih disukai opensource

Pikiran awal saya adalah menggunakan PyTables / Pandaas dengan file HDF5 sebagai menyimpan backend daripada database SQL.

Pertanyaan:

  1. Dengan asumsi PyTables / Pandas adalah rute "terbaik", apakah akan lebih baik untuk membagi data dalam beberapa file HDF, masing-masing mencakup periode waktu tertentu, atau meletakkan semuanya dalam satu file yang kemudian akan menjadi besar?

  2. Haruskah saya memilih format tabel atau tetap? Bagi saya, format tetap terlihat OK jika saya menyimpan satu file HDF per bulan, karena dengan cara ini seluruh rangkaian mungkin sesuai dengan RAM dan saya dapat mengiris dalam memori tanpa perlu indeks format tabel. Apakah saya benar ?

Dan jika itu bukan pendekatan terbaik, bagaimana saya harus menyusun penyimpanan data ini atau teknologi apa yang harus saya pertimbangkan? Saya bukan orang pertama yang menangani penyimpanan set besar data deret waktu, apa pendekatan umum untuk menyelesaikan tantangan ini?


Pendekatan lain yang saya pertimbangkan:

  • database array: mereka sangat cocok untuk deret waktu dengan periode pengambilan sampel konstan, karena Anda hanya perlu menyimpan waktu mulai dan akhir dan periode pengambilan sampel array, dan kemudian hanya nilai-nilai dalam array itu sendiri dan pengindeksan mudah. Tetapi dengan periode pengambilan sampel variabel dalam seri itu sendiri, saya perlu menjaga hubungan nilai timestamp-> lebih dekat, yang dalam pandangan saya tidak cocok untuk array DBMS.
  • database SQL standar dengan timestamp, paramID, nilai sebagai kolom tetapi berdasarkan sifatnya mereka meminta banyak disk I / O untuk setiap permintaan
flyingmig
sumber
Anda harus mempertimbangkan basis data array - en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS . Saya tidak mengatakan bahwa salah satu dari mereka akan menjadi jawaban yang benar, atau bahkan yang terbaik atau bahkan cukup baik, hanya saja mereka harus masuk ke dalam pikiran Anda. Selain entri dalam daftar itu ada sistem kdb ( kx.com ) meskipun jauh dari gratis.
High Performance Mark
Terima kasih atas masukannya. Saya telah mempertimbangkan basis data array tetapi masalah yang saya temukan dengan ini adalah bahwa mereka cocok untuk rangkaian waktu dengan periode pengambilan sampel konstan , karena Anda hanya perlu menyimpan waktu mulai dan berakhir dan periode pengambilan sampel array, dan kemudian hanya nilai dalam array itu sendiri dan pengindeksan mudah. Tetapi dengan periode pengambilan sampel variabel dalam seri itu sendiri, saya perlu menjaga hubungan nilai timestamp-> lebih dekat, yang dalam pandangan saya tidak cocok untuk array DBMS. Dengan mengatakan itu, saya akan dengan senang hati terbukti salah.
Flyingmig
mengedit pertanyaan untuk menambahkan apa yang saya anggap sejauh ini
flyingmig
Pertanyaan: apakah Anda perlu menyimpan semua data? Dapatkah data membusuk dari waktu ke waktu dan / atau adakah tingkat presisi yang dapat diterima untuk seri berbasis float?
J Trana
1
@ moinuddin-quadri Saya akhirnya menggunakan objek DataFrame panda yang didukung oleh file HDF5 bulanan menggunakan format tabel. Sistem telah berjalan selama lebih dari setahun dan telah menunjukkan sangat stabil dan cepat, bahkan tidak menggunakan disk SSD. Saya akan mencoba membuat semua itu sebagai jawaban ketika saya punya waktu. Lain merasa bebas untuk PM saya.
Flyingmig

Jawaban:

5

Anda mungkin ingin melihat karbon dan berbisik , bagian dari proyek grafit . Karbon dapat menangani jumlah data deret waktu yang sangat besar. Padahal, sekarang saya membaca dokumen (sudah beberapa tahun sejak saya menggunakannya), itu hanya untuk data numerik. Anda bilang Anda juga memiliki data string sehingga Anda mungkin tidak menemukan ini berguna. Padahal, Anda mungkin dapat memperoleh beberapa kebijaksanaan tentang bagaimana mereka dapat memproses data dalam jumlah besar dengan cepat.

Untuk memberi Anda gambaran tentang seberapa baik skala itu, ketika grafit pertama kali diproduksi di Orbitz, ia menangani 160.000 metrik per menit .

Bryan Oakley
sumber
Terima kasih atas sarannya, tetapi dari pemahaman saya, bisikan tidak cocok karena ketepatannya adalah yang kedua ketika saya membutuhkan ketepatan milidetik dan seperti yang Anda tunjukkan, saya memiliki data string juga yang tidak dapat disimpan di sana.
Flyingmig
1
@flyingmig Jangan menulis bisikan begitu cepat. Stempel waktu adalah nilai Unix-epoch. Dan "data string" yang Anda jelaskan dalam pertanyaan terdengar lebih seperti enum, dan itu biasanya disimpan sebagai nilai integer kecil.
Ross Patterson
Sears menggunakan Carbon / Graphite / Ceres untuk menyimpan 4M + titik data unik per menit. Itu tidak sempurna, dan itu membutuhkan pengelompokan grafit dan SSD, tetapi itu berfungsi. Semua solusi lain di luar sana tidak dapat diskalakan ke tingkat ini, yang kami temukan, tetapi jika Anda memiliki ide, jangan ragu untuk berpadu.
Kevin J. Rice
3

InfluxDB adalah database sumber terbuka yang ditulis dalam Go. Ini telah ditulis terutama untuk menangani data deret waktu, dan mereka menerbitkan tolok ukur yang menunjukkan kinerja yang jauh lebih baik vs Cassandra :

InfluxDB mengungguli Cassandra dalam ketiga tes dengan 4,5x throughput penulisan lebih besar, sementara menggunakan ruang disk 10,8x lebih sedikit, dan memberikan waktu respons hingga 168x lebih cepat untuk kueri yang diuji.

Dan Dascalescu
sumber
2

Anda mungkin ingin checkout database berorientasi kolom. Saya tidak yakin apa yang Anda maksud dengan database array tetapi dengan pendekatan yang saya sarankan Anda dapat memiliki jumlah nilai dinamis per kerangka waktu. Anda juga dapat memiliki beberapa nilai untuk cap waktu yang sama. Bagian yang menarik adalah bahwa jika Anda memiliki nilai yang diukur pada stempel waktu yang sama Anda dapat menyimpannya sebagai kolom tambahan (misalnya sensor yang mengukur suhu dan kelembaban, dalam harga perdagangan saham dan ukuran perdagangan, ...). Karena sifatnya yang berorientasi kolom, Anda dapat memiliki tabel dengan 100 kolom, tetapi jika kueri Anda hanya mengakses lima kolom, basis data hanya akan membaca data dari lima kolom.

Saya menulis seri tentang membuat basis data time series Anda sendiri, Anda mungkin ingin melihatnya:

hellomichibye
sumber