Amazon Timestreamsのバッチロードを試してみる
なにをするのか
2023.03.02のアップデート「Amazon Timestream がデータのバッチロードをサポート」を試してみる。
具体的には
Timestreams、バッチロード、それぞれに5分間動画があるので、これをやってみる。
- Introduction to Amazon Timestream - Demo - YouTube
- Using batch load to ingest data into Amazon Timestream in bulk | Amazon Web Services - YouTube
英語だけど、自動生成字幕(英語)の自動翻訳字幕(日本語)があるからなんとかなるでしょう。
まず「Introduction to Amazon Timestream - Demo - YouTube」を見ながら、Amazon Timestreamを触ってみる。
データベースの作成
- AWSコンソールで「Amazon Timestream」を開く。
- 「データベースの作成」をクリックする。
- データベースの設定で以下を指定する。
- 「設定を選択」は「サンプルデータベース」。
- 「名前」は
devops。 - 「サンプルデータを含むテーブル」は「DevOps」にチェック、「IoT」はチェックを外す。
- 「時系列レコードのタイプ」は「単一メジャーレコード」。
- 上記を指定したら「データベースを作成」をクリック。
作成したデータベース、テーブルの確認
- データベースが作成されるとデータベース一覧画面に遷移する。それ以外の画面になっているときは、Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、データベースを選択。
- 名前
devopsをクリック。データベースの詳細画面に遷移する。 - 下部の「テーブル」タブを開き、テーブル名
DevOpsをクリック。テーブルの詳細画面に遷移する。 - 以下を確認する。
- 「メモリストアの保持期間」がどうなっているか … 1日。
- 「マグネティックストアの保持期間」がどうなっているか … 5年。
- 「マグネティックストアの書き込み」がどうなっているか … 無効化済み。
SQLの実行
クエリエディタでテーブルの定義を確認し、SQLを実行してみる。
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、クエリエディタを選択。
- クエリエディタ画面で、テーブルのスキーマを確認する。以下を実施。
- 「Choose a database to query.」は
devopsを選択。 - 「Tables」の
DevOps右の:メニューから「スキーマを表示」を選択。 - 「テーブルの詳細」タブで「スキーマを表示」して、タイムスタンプ、ディメンジョン(データのグルーピングや絞込み用フィールド)がなにになっているか、確認する。
- 「テーブルの詳細」タブで「メジャーを表示」して記録する測定値がなにになっているか、確認する。
- 「Choose a database to query.」は
- クエリエディタ画面で、SQLを実行する。
- 上部「Query 1」のテキストボックスに、以下のSQLを入力(コピー&ペースト)する。
SELECT * FROM devops.DevOps ORDER BY time DESC LIMIT 10 - 「実行」をクリックする。
- 「返された行」を確認する。
- 上部「Query 1」のテキストボックスに、以下のSQLを入力(コピー&ペースト)する。
データの追加
次項の準備として、データを追加する。主として「How to use it - amazon-timestream-tools/sample_apps/python at mainline · awslabs/amazon-timestream-tools · GitHub」の手順に従い、以下を行う。
- 「GitHub - awslabs/amazon-timestream-tools: Tools and utilities to enable loading data and building applications with Amazon Timestream.」をCloneするか、Download Zipして展開する。
- 展開されたフォルダの
sample_apps\pythonをカレントディレクトリとしてコマンドプロンプトを開く。 - 以下のコマンドを実行する。
pip3 install -r requirements.txt --upgrade - 以下のコマンドを実行する。
<PROFILE_NAME>は使用するAWSプロファイル名を指定する。set AWS_PROFILE=<PROFILE_NAME> - 以下のコマンドを実行する。
python3 SampleApplication.py --csv_file_path ../data/sample.csv - スクリプトの完了を待って、次項に進む。
Timestreamの提供する高度なサポートの実行
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、クエリエディタを選択。
- 平均を試用する。クエリエディタ画面で以下を実施。
- クエリエディタで「サンプルクエリ」タブに移動する。
- 「説明」が「過去 2 時間のフリート全体の平均 CPU 使用率と比較して、CPU 使用率が 10% 以上高い EC2 ホストを特定します。」のクエリをクリック。
- 「実行」をクリック。
- 「クエリ結果」の先頭行はもっとも平均CPU使用率が高かったホストになる。
hostnameの値を控えておく。
- 補完を試用する。クエリエディタ画面で以下を実施。
- クエリエディタで「サンプルクエリ」タブに移動する。
- 「説明」が「過去 2 時間に特定の EC2 ホストの 30 秒間隔でビニングされた平均 CPU 使用率を算出し、線形補間を使用して欠落値を補完します。」のクエリをクリック。
- クエリの内容で、2行目や8行目では
BIN()関数が使われていることを確認する。これは指定された時間(ここでは30秒)間隔で集計するように指定している。 - クエリの内容で、11行目では
INTERPOLATE_LINEAR()関数が使われていることを確認する。これは時系列値(タイムシリーズ)に欠落があった場合に、線形補完する。 - 6行目
AND hostname = 'host-Hovjv'のhost-Hovjvを上で控えておいたhostnameの値で上書きする。 - 「実行」をクリック。
クリーンアップ
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、テーブルを選択。
- テーブル
DevOpsを削除。 - テーブル
host_metricsを削除。 - Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、データベースを選択。
- データベース
devopsを削除。
メモ。
「時系列レコードのタイプ」は「単一メジャーレコード」。
2020年10月1日に投稿されている「Introduction to Amazon Timestream - Demo - YouTube」ではこの「時系列レコードのタイプ」という設定項目は存在しない。2020年12月の「[AWS BLACK BELT ONLINE SEMINAR] Amazon Timestream」でも、1レコードに1測定値(measure)と説明されている。
各レコードは名前(measure_name)と値(measure_value)から構成される単一の測定値を含む。
([AWS BLACK BELT ONLINE SEMINAR] Amazon Timestream スライド46)
ただし2021年に、以下のアップデートがかかっている。
このリリースで、Amazon Timestream は複数測定レコードにも対応しています。これは、より早いデータの書き込み、効率のよいデータストレージ、パフォーマンスデータへのアクセスが可能な使いやすいデータモデリングの新機能です。複数測定レコードを利用すれば、お客様は複数の時系列の測定値を単一のテーブルの行に保存できます。各測定値を一行ごとに保存する必要はありません。
(Amazon Timestream がスケジュールされたクエリ、複数測定レコード、マグネティックストレージ書き込みを介して高速でコスト効率の高い時系列データ処理を提供)
今回の試用では、デモ動画作成時の挙動に近づけるため、「時系列レコードのタイプ」は「単一メジャーレコード」を選択すると判断した。
メモ。
「マグネティックストアの書き込み」がどうなっているか … 無効化済み。
これも2021年の、複数測定レコードと合わせてリリースされたアップデート。
到着遅延データをマグネティックストアに書き込めるようになりました。このため、データストレージ費用をさらに最適化できます。到着遅延データとは、タイムスタンプが過去の時刻になっているデータです。テーブルのプロパティを有効にするだけで、Amazon Timestream の既存の書き込み API を使用して、到着遅延データをマグネティックストアに送信できます。
今回の「メモリストアの保持期間:1日」「マグネティックストアの保持期間:5年」のテーブルに、例えば2日前のタイムスタンプのデータを挿入しようとした場合、2020年12月の「[AWS BLACK BELT ONLINE SEMINAR] Amazon Timestream」では挿入できないと説明されている。
データ挿入注意点①
インメモリ階層の保持期間外のデータを挿入することが出来ない。
([AWS BLACK BELT ONLINE SEMINAR] Amazon Timestream スライド72)
これだと、例えば一週間遅れのデータ挿入まで許容したい時には「メモリストアの保持期間:7日」とする必要がある。ただしメモリストアの料金(執筆時点でのオハイオリージョンの価格)は0.036USD/GB時間で、マグネティックストアの料金0.03USD/GB月に比べて864倍も高いので、コスト面から言えばそんなイレギュラーケースのためにメモリストアの保持期間を長くするのもつらい。そこで出てきたアップデートかな。
今回の試用では、デモ動画作成時の挙動に近づけるため、「マグネティックストアの書き込み」は「無効化済み」のままでよいと判断した。
メモ。
(データベースの)「名前」は
devops。
デモ動画では getting_started_demo としているが、後で実行するサンプルクエリはデータベース名 devops を想定している。そこで今回は devops にした方が試用がスムーズだと判断した。
「Using batch load to ingest data into Amazon Timestream in bulk | Amazon Web Services - YouTube」を見ながら、データのバッチロードを触ってみる。
CSVファイルの準備
- 「コンソールでのバッチロードの使用 - Amazon Timestream」先頭部からサンプルCSVをダウンロードし、展開。
-
batch-load-sample-file.csvの内容を確認する。-
memory_utilizationとcpu_utilizationの二つの計測値を持つCSVファイルになっている。
-
-
batch-load-sample-file.csv先頭行のタイムスタンプを、1日以内の値に修正する。ここでは以下のようにした。-
batch-load-sample-file.csvをExcelで開く。 - 列Bの前に列を挿入し、先頭行の値は
timeにする。 - B2セルに以下の数式を入力する。現在日時のUNIXTIME秒を計算してミリ秒に変換し、A列の値とA列の最大値の差分を減算している。
=((NOW()-25569)*86400-32400)*1000-(MAX(A$2:A$100)-A2) - B2セルをコピーし、B3~B100セルを範囲選択してペースト。
- B列をコピーし、B列に「値として貼り付け」。
- B列を右クリックし「セルの書式変更」で、「ユーザー定義」の「0」を選択。
- A列を削除。
- 「保存」して閉じる。
-
CSVファイルのアップロード
- AWSコンソールでAmazon S3を開く。
- 「バケットを作成」をクリック。
- 「バケットの作成」画面で以下を指定。
- 「バケット名」は任意の名前。世界中でユニークであることが必要なので
yourname-20230319-2153のように名前と年月日時分を組合わせるなどするとよい。 - 「AWSリージョン」は作業中のリージョン。通常は「アジアパシフィック(東京)ap-northeast-1」。
- 上記を指定したら、他はデフォルトのまま、「バケットを作成」をクリック。
- 「バケット名」は任意の名前。世界中でユニークであることが必要なので
- バケットから、作成されたバケット名(
yourname-20230319-2153など)をクリック。 - バケットの詳細画面に遷移し、オブジェクトタブが表示される。CSVファイルをアップロードする。
- 「アップロード」をクリック。
- 「アップロード」画面が表示される。
batch-load-sample-file.csvをドラッグアンドドロップし、「アップロード」をクリック。 - 「アップロード:ステータス」が表示されたら「閉じる」をクリック。
Timestreamデータベースとテーブルを作成
- AWSコンソールでAmazon Timestreamを開く。
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、「データベース」を選択。
- 「データベースを作成」をクリック。
- 「データベースを作成」画面で、「名前」に
devopsを指定し、「データベースを作成」をクリック。 - Timestreamの画面左のメニューから、「テーブル」を選択。
- 「テーブルを作成」をクリック。
- 「テーブルを作成」画面で、以下を指定。
- 「データベース名」は
devopsを指定。 - 「テーブル名」は
metricsを指定。 - 上記を指定したら、他はデフォルトのまま、「テーブルを作成」をクリック。
- 「データベース名」は
バッチロードタスクを作成
- AWSコンソールでAmazon Timestreamを開く。
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、「バッチロードタスク」を選択。
- 「バッチロードタスクを作成」をクリック。
- 「バッチロードタスクの設定を行う」ステップで、以下を指定。
- 「ターゲットデータベース」は
devopsを指定。 - 「ターゲットテーブル」は
metricsを指定。 - 「データソース」は「S3を参照」をクリックし、アップロードしたCSVファイルを選択。
- 「データモデルマッピング」では以下を指定。
- マッピング入力方式は「ビジュアルビルダー(推奨)」。
- 「ビジュアルビルダー」部で「データソース列をロード」をクリック。
- ソース列名
timeの行で、Timestream属性タイプにTIMESTAMPを指定。 - ソース列名
measure_nameの行で、Timestream属性タイプにMEASURE_NAMEを指定。 - ソース列名
regionocationhostnameの行で、Timestream属性タイプにDIMENSIONを指定。 - ソース列名
memory_utilizationcpu_utilizationの行で、Timestream属性タイプにMULTIを指定。データ型にDOUBLEを指定。
- 「エラーログS3の場所」は「S3を参照」をクリックし、バケット一覧で作成したバケットのラジオボタンを選択した状態で、「選択」をクリック。
- 上記を指定したら、他はデフォルトのまま、「次へ」をクリック。
- 「ターゲットデータベース」は
- 「レビューして作成」ステップで、「バッチロードタスクを作成」をクリック。
- 作成されたバッチロードタスクの「タスクID」をクリック。
- バッチロードタスクの詳細が表示される。以下を確認する。
- スタータスが「完了済み」になる(データサイズに応じた時間経過後)。
- 進捗報告部で、処理されたレコード数、取り込まれたレコード数、失敗などが確認できる。
- データモデルマッピング部で、マッピングのJSONテキストが確認できる(これは次回以降のバッチロードタスクに役立てられる)。
データの確認
クエリエディタでテーブルの定義を確認し、SQLを実行してみる。
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、クエリエディタを選択。
- クエリエディタ画面で、データを確認する。以下を実施。
- 「Choose a database to query.」は devops を選択。
- 「Tables」の
metrics右の:メニューから「スキーマを表示」を選択。スキーマを確認する。 - 上部「Query 1」のテキストボックスに、以下のSQLをコピー&ペーストして、「実行」をクリックする。
SELECT COUNT(*) FROM devops.metrics - 「クエリ結果」の「返された行」を確認する。テーブル内のレコード件数が返される。
- 上部「Query 1」のテキストボックスに、以下のSQLをコピー&ペーストして、「実行」をクリックする。
SELECT * FROM devops.metrics ORDER BY time DESC LIMIT 10 - 「クエリ結果」の「返された行」を確認する。テーブル内の時系列データの最新10件が返される。
クリーンアップ
- AWSコンソールでAmazon Timestreamを開く。
- Timestreamの画面左のメニュー(閉じられている場合ハンバーガーメニューを展開)から、テーブルを選択。
- テーブル
metricsを削除。 - Timestreamの画面左のメニューから、データベースを選択。
- データベース
devopsを削除。 - AWSコンソールでAmazon S3を開く。
- バケットを空にする。
- 一覧で、今回作成したバケット(
yourname-20230319-2153など)左をラジオボタンを選択した状態で、「空にする」をクリック。 - バケットを空にする。
- 「バケットを空にする:ステータス」が表示されたら「終了」をクリック。
- 一覧で、今回作成したバケット(
- バケットを削除する。
- 一覧で、今回作成したバケット(
yourname-20230319-2153など)左をラジオボタンを選択した状態で、「削除」をクリック。 - バケットを削除する。
- 一覧で、今回作成したバケット(
メモ。ExcelでUNIXTIME秒を計算するには、以下。
(NOW()-25569)*86400-32400
-
25569… 1970年1月1日0時0分0秒のシリアル値。Excelでセルに1970/1/1を入力後、書式を数値に変換すると確認できる。 -
86400… 一日の秒数=24×60×60。 -
32400… 日本時間から世界標準時に戻すためのオフセット。9時間分の秒数=9×60×60。