Background
センサから取得した時系列データを解析することになった.
普段の研究ではDynamoDB等のNoSQLを利用しているのだけど, 今回のセンサデータはセンサ数が多い上に欠損率が結構高い.
なので,
- 書き込み速度重視
- データの線形補間ができる・やりやすい
- できればローカルで使える
ことを要件として調査した.
補間に関してはDB側で巻いてくれると嬉しいけど, パフォーマンスをみてクライアント側でやるのでもまあいい.
これはそのときのログと, (結果的にInfluxDBを選択したのだけど)その結果をまとめたもの.
調査
今回調べたソフトウェアは以下.
- OpenTSDB 2.3.0
- InfluxDB 1.7
- Prometheus 2.5.0
調査対象はデータベースの中でも時系列データベースと呼ばれるものに絞った.
一般的なRDBはそのインデクスにBTree(もしくはB+Tree)を用いているが, BTreeの挿入コストはO(n) ~ O(log n)程度かかってしまう. もちろん最適化はされているのだろうからコストは抑えられるだろうが, 挿入に限ってはO(1)で行いたい. このあたり勉強しないとなあ
OpenTSDB
- open source time series database
- store trillions of data points(!)
- scales using HBase
分散型の時系列データベース. OpenTSDBでのデータはHBase/Hadoopのクラスタ側で保持する.
PinterestやYahooで使われているとのこと1. Yahooの例では, 200k TSD / s の書き込みを50サーバで行っており, 10億件を超えるデータを保持している.
TSD形式
- metric: 時系列データの属性の名前. RDBでいうテーブル名.
- timestamp
- value: integer / float
- tag(s): { "key": "value" }のペア.
tagについては最低一つつける必要がある(最大8つまでサポートされているが, usually up to 4 or 5 tags とのこと).
時系列DBではvalueが数値しか取れない代わりに, tagsのkeyを組み合わせて集計を行うみたい.
APIはHTTP RestとTelnet Style(!)がある.
補間については, 分散データベースなので物理的な断片化が考慮されており, OpenTSDB側で線形補間・スキップ・ゼロ補間がサポートされている.
Prometheus
- monitoring system & time series database
今回調べるまで存在を知らなかった. 用途を見るとどうもElasticSearch等の用途と似ていて, モニター側に重きを置いているっぽい.
そのためデータは別口からインポートする必要がある.
データについては15日間分の保持がデフォルトのようで, Prometheus単体で利用するのは(データ解析のフェーズにおいても)今回の用途では厳しそう.
InfluxDB
TSD形式
Line Protocolと呼ばれる行データの書式に従う.
以下の書式のように, 配列はスペースなしのカンマ区切りで, tagとmeasurementの区切り, measurementとtimestampの区切りにはスペースをいれる.
measurementが値部分となっていて, こちらもtagと同様カンマ区切りで複数のtag付のmeasurementを持てる.
metrix,<tag_key>=<tag_value>,<tag_key>=<tag_value> <measurement>=<value> <timestamp>
Measurementにはinteger, floatの他にstring, booleanも扱える.
補間については, fill()
を用いてnull, 指定値, 線形補間, 前データ値が利用できる.2
blog によるとwrite performanceがOpenTSDBの9倍.
まとめ
結論としては補間が必要なデータストアにはInfluxDB一択だと思う.
DB | 書き込み | データ量 | 補間 | ローカル |
---|---|---|---|---|
OpenTSDB | ○ | ◎ | ○ | Docker |
InfluxDB | ◎ | ○ | ○ | Docker |
Prometheus | - | x | - | Docker |
Comments