SPECIALIST

多様な専門性を持つNRIデジタル社員のコラム、インタビューやインサイトをご紹介します。

BACK

空調機シミュレーションにおける Amazon Timestream 活用【前半】

こんにちは、NRIデジタルの島です。
先日、AWSのフルマネージド型サーバーレス時系列データベースである「Amazon Timestream(以下 Timestream)」が東京リージョンでGAされました。
Amazon Timestream is now available in the Asia Pacific (Sydney) and Asia Pacific (Tokyo) AWS regions
実際のユースケースを元にシミュレーションデータを作成し、そのデータ処理および可視化を東京リージョンで試してみたので、その内容を共有したいと思います。今回は【前半】として、Timestreamの概要、Timestream検証構成・構築、データの書き込みについて紹介します。

Timestreamとは

AWSには様々なマネージド型データベースがありますが、その中でTimestreamはフルマネージド型サーバーレス時系列データベースとして時系列データを専門に扱うデータベースになっています。

AWS BlackBeltより引用

AWSのデータベースサービス Timestream(時系列データベース)

Timesteramは様々なデータソースと連携可能で、IoTアプリケーションにおけるエッジデバイスからのセンサーデータ収集や分析、Webのクリックストリーム分析など、時系列データから現状分析したり、未来に起こることを予測したりするようなユースケースの中核となるサービスとなっています。

AWS BlackBeltより引用

時系列データの活用場所

各ユースケースにおけるシステム構成は以下公式ページに記載がありますので、ご参照ください。
Amazon Timestream

アーキテクチャ

Timestreamはサーバレスアーキテクチャを採用しており、利用者がサーバを管理することなく、RDBMSでは処理できないような大量の時系列データを高速に低コストで処理できます。
また、Amazon QuickSightやGrafana等の可視化プロダクトとの連携も容易になっています。

AWS BlackBeltより引用

スケーラブル

コスト

Timestreamにはデータストアとして、「メモリストア」と「マグネティックストア」の2種類のストレージ階層があります。
Storage – Amazon Timestream

これらのデータストアに対する書き込み、クエリに対する容量に応じて課金されます。
コストに関する詳細は以下をご参照ください。
Amazon Timestream pricing

Timestreamの検証

本検証では、以下のような簡単な構成でTimestreamを試してみたいと思います。
Timestreamの検証

※1
可視化ツールにはAmazon Managed Grafana(以下AMG)を使用します。
AMGについては過日以下記事を公開しておりますので、詳細はそちらをご覧ください。
次の監視標準になるか?Amazon Managed Service for Prometheus / Grafana | TECH | NRI Digital

※2
本来はIoTデバイスやKinesis等のデータストリームと連携するユースケースが多いと思いますが、今回は EC2上のTimestream SDKを使用したJavaプログラム(Java v2)からデータ投入を実施しています。
Java v2 – Amazon Timestream

プログラム自体は以下のawslabsのサンプルを参考にすることで簡単に実装出来ました。
GitHub – awslabs/amazon-timestream-tools
※Javaだけでなく、GoやPythonのサンプルもあります。

なお、Telegraf用のAmazon Timestream出力プラグインがGrafana Labsより提供されており、こちらを使用するとサーバのリソース情報などをリアルタイムにTimestreamに流し込める為非常に便利です。興味ある方はお試しいただければと思います。(本記事の検証では未使用)
Telegraf
Telegraf Open Source Server Agent | InfluxDB

Telegraf Timestream出力プラグイン
Amazon Timestream

Timestreamの構築

まずTimestreamデータベース環境をコンソールから構築していきます。

データベースの作成

標準データベースを選択し、データベースを作成します。
※「サンプルデータベース」で作成すると、事前にサンプルデータが投入済みのデータベースが作成されます。

データベースの作成

テーブルの作成

作成したデータベース上にテーブルを作成します。
テーブル作成時に各データストアの保持期間を設定します。
※もともとはマグネティックストアへの直接書き込みは出来ませんでしたが、現在は書き込みを有効にすることで書き込み可能となりました。

テーブルを作成

今回はメモリストアを「1日」、マグネティックストアを「10年」として設定し、マグネティックストレージへの書き込みを有効化しています。

これで準備は完了です。
数秒でTimestreamのデータベースが構築できました。

データの書き込み

作成したデータベースのテーブルにデータを書き込んでいきます。
※過去1日分はメモリストアへ、それより以前のデータはマグネティックストアに書き込まれます。

本検証でTimestreamへ書き込むデータは空調(エアコン)のデータを想定し、以下のようにディメンション、メジャーメントを定義しました。

ディメンション

「設置場所種別、空調種別、空調」の3つのディメンションとしました。

設置場所種別(Location) 空調種別(Type) 空調(Conditioner)
会議室 室外機 1F会議室
会議室 室外機 1F北会議室
会議室 室外機 1F南会議室


メジャーメント

取得する「メジャーメント(空調の統計情報)、間隔(エッジ(今回はJavaプログラム)から集計されて送信される間隔)、データ範囲」は以下としました。

メジャーメント 種別 間隔 データ範囲
現在温度(℃) 瞬時値 5分 23-30℃
設定温度(℃) 瞬時値 5分 23-30℃
消費電力(w) 累積値 60分 30-300w

※空調(エアコン)のデータを想定しておりますが、投入するJavaプログラムは上記範囲内のランダムな値を設定しているだけです。その為現実的な値ではないのでご了承ください。

Timestreamは「シングルメジャーレコード」と「マルチメジャーレコード」の2つのデータモデルをサポートしています。
Data modeling – Amazon Timestream

上記ディメンションとメジャーメントにて数ヶ月分のデータを「シングルメジャーレコード」と「マルチメジャーレコード」の2パターンで書き込みます。

なお、AWSより書き込みのベストプラクティスが公開されてますので、ご参考にしていただければと思います。
Data ingestion – Amazon Timestream
Cost optimization – Amazon Timestream

実行サマリは以下となりました。

データタイプ ディメンション メジャーメント 件数 結果
シングルメジャーレコード 3 3 3,669,552 およそ25分
マルチメジャーレコード 3 3 1,230,591 およそ10分

シングルメジャーレコード

数ヶ月分のデータで300〜400万レコード、書き込み時間はおよそ「25分」となりました。

書き込み後テーブル
※1レコード1メジャーメントで登録されている。

書き込み後テーブル

Javaプログラムの実行ログ
※ベストプラクティスに倣い、100件毎にバッチでバルクインサート。

・・・
2022-08-24 14:41:33.004 [main] INFO CoeTimestreamClient  - Processed 3667900 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.040 [main] INFO CoeTimestreamClient  - Processed 3668000 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.086 [main] INFO CoeTimestreamClient  - Processed 3668100 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.123 [main] INFO CoeTimestreamClient  - Processed 3668200 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.159 [main] INFO CoeTimestreamClient  - Processed 3668300 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.203 [main] INFO CoeTimestreamClient  - Processed 3668400 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.252 [main] INFO CoeTimestreamClient  - Processed 3668500 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.300 [main] INFO CoeTimestreamClient  - Processed 3668600 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.336 [main] INFO CoeTimestreamClient  - Processed 3668700 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.374 [main] INFO CoeTimestreamClient  - Processed 3668800 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.419 [main] INFO CoeTimestreamClient  - Processed 3668900 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.454 [main] INFO CoeTimestreamClient  - Processed 3669000 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.492 [main] INFO CoeTimestreamClient  - Processed 3669100 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.537 [main] INFO CoeTimestreamClient  - Processed 3669200 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.572 [main] INFO CoeTimestreamClient  - Processed 3669300 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.611 [main] INFO CoeTimestreamClient  - Processed 3669400 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.657 [main] INFO CoeTimestreamClient  - Processed 3669500 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.701 [main] INFO CoeTimestreamClient  - Processed 3669552 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 14:41:33.701 [main] INFO CoeSingleMeasureClient  - end register data... (CoeSingleMeasureClient.java:122)
2022-08-24 14:41:33.703 [main] DEBUG LatencyMonitorAop  - jp.co.nrid.coe.timestreams.client.service.impl.CoeSingleMeasureClient bulkWriteRecords   method latency: 1456167 ms. (LatencyMonitorAop.java:25)

書き込みレイテンシ以下の通り、30ms台といったところでした。(1件あたり0.3〜0.4ms)

書き込み後レイテンシ

マルチメジャーレコード

1レコードに3つのメジャーメントをフラットに登録する為、シングルメジャーの場合と比較し件数が1/3程度になっており、書き込み完了もおよそ「10分」に短縮されました。
シングルメジャーレコードよりも効率的に書き込みすることができ、コスト効率も良さそうです。

書き込み後テーブル
※1レコード3メジャーメントが登録されている。

書き込み後テーブル

Javaプログラムの実行ログ
※ベストプラクティスに倣い、100件毎にバッチでバルクインサート。

・・・
2022-08-24 17:52:14.146 [main] INFO CoeTimestreamClient  - Processed 1228700 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.184 [main] INFO CoeTimestreamClient  - Processed 1228800 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.224 [main] INFO CoeTimestreamClient  - Processed 1228900 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.260 [main] INFO CoeTimestreamClient  - Processed 1229000 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.310 [main] INFO CoeTimestreamClient  - Processed 1229100 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.361 [main] INFO CoeTimestreamClient  - Processed 1229200 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.403 [main] INFO CoeTimestreamClient  - Processed 1229300 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.451 [main] INFO CoeTimestreamClient  - Processed 1229400 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.499 [main] INFO CoeTimestreamClient  - Processed 1229500 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.541 [main] INFO CoeTimestreamClient  - Processed 1229600 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.590 [main] INFO CoeTimestreamClient  - Processed 1229700 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.638 [main] INFO CoeTimestreamClient  - Processed 1229800 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.675 [main] INFO CoeTimestreamClient  - Processed 1229900 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.722 [main] INFO CoeTimestreamClient  - Processed 1230000 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.785 [main] INFO CoeTimestreamClient  - Processed 1230100 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.829 [main] INFO CoeTimestreamClient  - Processed 1230200 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.868 [main] INFO CoeTimestreamClient  - Processed 1230300 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.917 [main] INFO CoeTimestreamClient  - Processed 1230400 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:14.966 [main] INFO CoeTimestreamClient  - Processed 1230500 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:15.017 [main] INFO CoeTimestreamClient  - Processed 1230591 records. WriteRecords Status: 200 (CoeTimestreamClient.java:126)
2022-08-24 17:52:15.017 [main] INFO CoeMultiMeasureClient  - end register data... (CoeMultiMeasureClient.java:88)
2022-08-24 17:52:15.019 [main] DEBUG LatencyMonitorAop  - jp.co.nrid.coe.timestreams.client.service.impl.CoeMultiMeasureClient bulkWriteRecords   method latency: 552238 ms. (LatencyMonitorAop.java:25)

1レコードサイズが増えてるので若干書き込みレイテンシが増えてますが、大きくは変わらない印象でした。(1件あたり0.3〜0.4ms)

書き込み後レイテンシ2

※記載した通りの書き込み性能結果でしたが、別日に実施したところ本結果より早かったり、逆に遅かったりすることもありました。実行するタイミングによって多少前後すると思いますので上記結果はあくまで参考値としてください。需要により確保可能なリソースやサーバ台数等が多少変わってくるのでは?と推測しております。

次回の記事では、Timestreamの書き込み可視化、Timestreamの機能(補間関数・スケジュールドクエリ)、考察について紹介したいと思います。