• facebook
  • twitter
  • rss

走行情報の生成とNodeの関係

走行情報の生成

SmartDriveでは車両データを取得しサーバで様々なデータ解析を行っていますが、その解析処理の中の1つに走行情報の生成があります。走行情報とは毎秒ごとに取得した車両データを用いて出発地点から目的地点までの道のりや距離、走行時間、平均速度、急加速・急ブレーキ・アイドリングの回数等を算出したものになります。

いつ出発し、いつ到着したかがデータから分かればその期間にアップロードされたデータを用いてバッチ処理的に解析処理を実行することも可能ですが、データのみからはその判定を行なうことが出来ないため、数十秒ごとにサーバへアップロードされるデータを逐次的に処理し、過去のデータと繋ぎ合わせてゆくというアプローチをとっています。

こうすることで、ほぼリアルタイムに近い状態で走行情報がサーバで生成されてゆくことになります。

走行情報の解析処理の特徴

・秒間で取得した車両データが数十秒ごとにサーバにアップロードされ
・アップロードされたデータを逐次的に処理して過去にアップロードされた車両データと繋ぎ合わせてゆく
・解析計算などのCPUを大量に使う処理はそれほど多くない

Nodeの利用

データ解析処理を行なう場合の言語としてはPythonやRなどを利用するケースが多いと思いますが、SmartDriveでは走行データの解析処理にNodeを用いています。

Nodeはイベンド駆動型のシングルスレッドで処理されるため、少ないメモリで同時に処理を実行することに向いています。また、ノンブロッキングI/Oで動作するのでCPUを効率的に使用出来ます。

上でも述べましたが、走行データの解析処理は蓄積された大量のデータを解析するというものではなく、それぞれの車両からアップロードされた細かいデータを同時に且つ逐次的に処理するというものなので、Nodeの特性が適しています。

一方で注意しなくてはならない点もあります。一般的なNodeを利用する際の注意点としては、たとえば以下のようなものが挙げられます。

Nodeを利用する際の注意点

・Node特性からCPUパワーが必要な処理には不向きで、たとえば1つのデータの処理にCPUパワーの多くをとられるような場合、シングルスレッドで動作している関係から全体の処理のパフォーマンスが低下する危険性があります。
・CPUブロックをするような実装をしないように気を付ける必要があります。
・いわゆるcallback hellが発生しやすく、コードの可読性が落ちます。

これらの問題に対して、走行情報の解析処理ではpm2モジュールを利用してクラスタリング構成でNodeを動かし、効率的にCPUを使用できるようにしています。 また、callback hellに対してはPromiseベースのモジュールであるbluebirdを利用して可読性をあげるようにしています。yieldも一部のソースで利用し始めていたりします。

一般的にはNodeを使ってデータ処理をすることはあまりないケースだと思いますが、扱うデータの特性や処理の内容などからSmartDriveでは走行情報の生成にNodeを利用しているというお話でした。

次回は、これらの解析処理をどのようなサーバ構成で行っているかなどをお話させて頂きたいと思います。

関連記事