翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
writes
接続されたデバイス、IT システム、および産業機器から時系列データを収集し、それを Timestream for Live Analytics に書き込むことができます。Timestream for Live Analytics では、時系列が同じテーブルに属している場合、単一の時系列からのデータポイントや、1 回の書き込みリクエストで多数のシリーズのデータポイントを書き込むことができます。Timestream for Live Analytics には、データベースへの書き込みを呼び出すときに指定したメジャー値のディメンション名とデータ型に基づいて、Timestream for Live Analytics テーブルの列名とデータ型を自動検出する柔軟なスキーマが用意されています。ライブ分析の Timestream にデータのバッチを書き込むこともできます。
注記
Timestream for Live Analytics は、読み取りの結果整合性セマンティクスをサポートします。つまり、データのバッチを Timestream for Live Analytics に書き込んだ直後にデータをクエリすると、クエリ結果に最近完了した書き込みオペレーションの結果が反映されない可能性があります。結果には古いデータが含まれている場合もあります。同様に、1 つ以上の新しいディメンションで時系列データを書き込む際、クエリは列の一部のサブセットを短期間返すことができます。これらのクエリリクエストをしばらくしてから繰り返すと、結果は最新のデータを返します。
データは、AWS SDKs、、または AWS CLI、、、AWS LambdaAWS IoT CoreAmazon Managed Service for Apache FlinkAmazon KinesisAmazon MSK、 を使用して書き込むことができますオープンソース Telegraf。
トピック
データ型
Timestream for Live Analytics では、書き込みに次のデータ型がサポートされています。
データ型 | 説明 |
---|---|
BIGINT |
64 ビット符号付き整数を表します。 |
BOOLEAN |
ロジックの 2 つの真の値、つまり true と false を表します。 |
DOUBLE |
バイナリ浮動小数点算術用の IEEE Standard 754 を実装する 64 ビット可変精度。 注記クエリで使用できるクエリ言語関数は、 |
VARCHAR |
オプションの最大長を持つ可変長の文字データ。最大制限は 2 KB です。 |
MULTI |
複数メジャーレコードのデータ型。このデータ型には、、 |
TIMESTAMP |
UTC でナノ秒の精度時間を使用して、Unix 時間からの時間を追跡するインスタンスを表します。このデータ型は現在、複数メジャーレコード (つまり、タイプ のメジャー値内
から の範囲内でサポートタイムスタンプを書き込み |
事前スキーマ定義なし
Amazon Timestream for Live Analytics にデータを送信する前に、、Timestream for Live Analytics SDKs AWS Management Console、または Timestream for Live Analytics API オペレーションを使用してデータベースとテーブルを作成する必要があります。詳細については、 データベースを作成するおよびテーブルの作成を参照してください。テーブルの作成時に、スキーマを事前に定義する必要はありません。Amazon Timestream for Live Analytics は、送信されるデータポイントの測定値とディメンションに基づいてスキーマを自動的に検出するため、急速に変化する時系列データに合わせてスキーマをオフラインで変更する必要がなくなります。
データの書き込み (挿入とアップサート)
Amazon Timestream for Live Analytics の書き込みオペレーションを使用すると、データを挿入してアップサートできます。デフォルトでは、Amazon Timestream for Live Analytics での書き込みは、最初のライターがセマンティクスを獲得します。セマンティクスでは、データは追加としてのみ保存され、重複レコードは拒否されます。最初のライターがセマンティクスを勝ち取り、多くの時系列アプリケーションの要件を満たしていますが、アプリケーションが冪等な方法で既存のレコードを更新したり、最後のライターがセマンティクスを勝ち取ったデータを書き込んだりする必要があり、バージョンが最も高いレコードがサービスに保存されるシナリオがあります。これらのシナリオに対応するため、Amazon Timestream for Live Analytics ではデータをアップサートできます。Upsert は、レコードが存在しない場合はシステムにレコードを挿入し、存在する場合はレコードを更新するオペレーションです。レコードが更新されると、べき等な方法で更新されます。
削除用のレコードレベルのオペレーションはありません。ただし、テーブルとデータベースは削除できます。
メモリストアとマグネティックストアへのデータの書き込み
Amazon Timestream for Live Analytics では、メモリストアとマグネティックストアにデータを直接書き込む機能を提供しています。メモリストアは高スループットのデータ書き込み用に最適化されており、マグネティックストアは遅延到着データのスループット書き込みを減らすように最適化されています。
遅延受信データとは、現在の時刻より前のタイムスタンプを持ち、メモリストアの保持期間外のデータです。テーブルのマグネティックストア書き込みを有効にすることで、遅延到着データをマグネティックストアに書き込む機能を明示的に有効にする必要があります。また、 MagneticStoreRejectedDataLocation
はテーブルの作成時に定義されます。マグネティックストアに書き込むには、 の呼び出し元に、テーブルの作成MagneticStoreRejectedDataLocation
中に で指定された S3 バケットに対するS3:PutObject
アクセス許可WriteRecords
が必要です。詳細については、CreateTable」、WriteRecords」、PutObject」を参照してください。
単一メジャーレコードと複数メジャーレコードを使用したデータの書き込み
Amazon Timestream for Live Analytics では、単一メジャーレコードと複数メジャーレコードの 2 種類のレコードを使用してデータを書き込むことができます。
単一メジャーレコード
単一メジャーレコードを使用すると、レコードごとに 1 つのメジャーを送信できます。この形式を使用してライブ分析の Timestream にデータを送信すると、ライブ分析の Timestream はレコードごとに 1 つのテーブル行を作成します。つまり、デバイスが 4 つのメトリクスを出力し、各メトリクスが 1 つのメジャーレコードとして送信されると、Timestream for Live Analytics はテーブルに 4 つの行を作成してこのデータを保存し、デバイス属性は行ごとに繰り返されます。この形式は、アプリケーションから 1 つのメトリクスをモニタリングする場合や、アプリケーションが同時に複数のメトリクスを出力しない場合に推奨されます。
複数メジャーレコード
複数メジャーレコードを使用すると、テーブル行ごとに 1 つのメジャーを保存するのではなく、複数のメジャーを 1 つのテーブル行に保存できます。したがって、複数メジャーレコードを使用すると、最小限の変更で既存のデータをリレーショナルデータベースから Amazon Timestream for Live Analytics に移行できます。
また、単一メジャーレコードよりも多くのデータを 1 回の書き込みリクエストでバッチ処理することもできます。これにより、データの書き込みスループットとパフォーマンスが向上し、データ書き込みのコストも削減されます。これは、書き込みリクエストでより多くのデータをバッチ処理することで、Amazon Timestream for Live Analytics は 1 回の書き込みリクエストでより繰り返し可能なデータを識別し (該当する場合)、繰り返しデータに対して 1 回だけ課金できるためです。
複数メジャーレコード
複数メジャーレコードを使用すると、時系列データをメモリとマグネティックストアのよりコンパクトな形式で保存できるため、データストレージコストを削減できます。また、コンパクトなデータストレージは、データ取得のためのより簡単なクエリの書き込みに役立ち、クエリのパフォーマンスを向上させ、クエリのコストを削減します。
さらに、複数メジャーレコードは、時系列レコードに複数のタイムスタンプを保存するための TIMESTAMP データ型もサポートしています。複数メジャーレコードのTIMESTAMP属性は、将来または過去のタイムスタンプをサポートします。したがって、複数メジャーのレコードは、パフォーマンス、コスト、クエリのシンプルさの向上に役立ち、さまざまなタイプの相関メジャーをより柔軟に保存できます。
利点
複数メジャーレコードを使用する利点は次のとおりです。
-
パフォーマンスとコスト — 複数メジャーレコードを使用すると、1 回の書き込みリクエストで複数の時系列メジャーを書き込むことができます。これにより、書き込みスループットが向上し、書き込みのコストも削減されます。複数メジャーレコードを使用すると、データをよりコンパクトな方法で保存できるため、データストレージコストを削減できます。複数メジャーレコードのコンパクトなデータストレージにより、クエリで処理されるデータが少なくなります。これは、全体的なクエリパフォーマンスを向上させ、クエリコストを削減するように設計されています。
-
クエリのシンプルさ — 複数メジャーレコードでは、同じタイムスタンプで複数のメジャーを読み取るために、クエリに複雑な共通テーブル式 (CTEs) を記述する必要はありません。これは、メジャーが 1 つのテーブル行に列として保存されるためです。したがって、複数メジャーレコードを使用すると、より簡単なクエリを記述できます。
-
データモデリングの柔軟性 — TIMESTAMP データ型と複数メジャーレコードを使用して、将来のタイムスタンプを Timestream for Live Analytics に書き込むことができます。複数メジャーレコードには、レコードの時間フィールドに加えて、TIMESTAMP データ型の複数の属性を含めることができます。複数メジャーレコードのTIMESTAMP属性は、将来または過去のタイムスタンプを持つことができ、Timestream for Live Analytics が複数メジャーレコードの TIMESTAMP 型の値に対してインデックスを作成しないことを除いて、時間フィールドのように動作します。
ユースケース
複数測定レコードは、同じデバイスから一度に複数の測定を生成する任意の時系列アプリケーションに使用できます。以下は、アプリケーションの例です。
-
一度に数百のメトリクスを生成する動画ストリーミングプラットフォーム。
-
血圧、血圧、脈などの測定値を生成する医療デバイス。
-
メトリクス、温度、気象センサーを生成する油籠などの産業機器。
-
1 つ以上のマイクロサービスで設計されているその他のアプリケーション。
例: ビデオストリーミングアプリケーションのパフォーマンスとヘルスのモニタリング
200 EC2 インスタンスで実行されているビデオストリーミングアプリケーションについて考えてみましょう。Amazon Timestream for Live Analytics を使用して、アプリケーションから出力されるメトリクスを保存および分析し、アプリケーションのパフォーマンスと正常性を理解し、異常を迅速に特定し、問題を解決し、最適化の機会を発見できるようにします。
このシナリオを単一メジャーレコードと複数メジャーレコードでモデル化し、両方のアプローチを比較/コントラストします。各アプローチについて、以下の仮定を行います。
-
各 EC2 インスタンスは、1 秒あたり 4 つのメジャー (video_startup_time、rebuffering_ratio、video_playback_failures、および average_frame_rate) と 4 つのディメンション (device_id、device_type、os_version、および region) を出力します。
-
6 時間のデータをメモリストアに、6 か月のデータをマグネティックストアに保存したい。
-
異常を特定するには、1 分ごとに実行される 10 個のクエリを設定して、過去数分間の異常なアクティビティを特定します。また、過去 6 時間のデータを表示する 8 つのウィジェットを含むダッシュボードを構築して、アプリケーションを効果的にモニタリングできるようにしました。このダッシュボードには 5 人のユーザーがいつでもアクセスし、1 時間ごとに自動更新されます。
単一メジャーレコードの使用
データモデリング: 単一メジャーレコードでは、4 つのメジャー (動画の起動時間、再バッファリング率、動画再生失敗、平均フレームレート) ごとに 1 つのレコードを作成します。各レコードには、4 つのディメンション (device_id、device_type、os_version、region) とタイムスタンプがあります。
書き込み: ライブ分析用に Amazon Timestream にデータを書き込むと、レコードは次のように構築されます。
public void writeRecords() { System.out.println("Writing records"); // Specify repeated values for all records List<Record> records = new ArrayList<>(); final long time = System.currentTimeMillis(); List<Dimension> dimensions = new ArrayList<>(); final Dimension device_id = new Dimension().withName("device_id").withValue("12345678"); final Dimension device_type = new Dimension().withName("device_type").withValue("iPhone 11"); final Dimension os_version = new Dimension().withName("os_version").withValue("14.8"); final Dimension region = new Dimension().withName("region").withValue("us-east-1"); dimensions.add(device_id); dimensions.add(device_type); dimensions.add(os_version); dimensions.add(region); Record videoStartupTime = new Record() .withDimensions(dimensions) .withMeasureName("video_startup_time") .withMeasureValue("200") .withMeasureValueType(MeasureValueType.BIGINT) .withTime(String.valueOf(time)); Record rebufferingRatio = new Record() .withDimensions(dimensions) .withMeasureName("rebuffering_ratio") .withMeasureValue("0.5") .withMeasureValueType(MeasureValueType.DOUBLE) .withTime(String.valueOf(time)); Record videoPlaybackFailures = new Record() .withDimensions(dimensions) .withMeasureName("video_playback_failures") .withMeasureValue("0") .withMeasureValueType(MeasureValueType.BIGINT) .withTime(String.valueOf(time)); Record averageFrameRate = new Record() .withDimensions(dimensions) .withMeasureName("average_frame_rate") .withMeasureValue("0.5") .withMeasureValueType(MeasureValueType.DOUBLE) .withTime(String.valueOf(time)); records.add(videoStartupTime); records.add(rebufferingRatio); records.add(videoPlaybackFailures); records.add(averageFrameRate); WriteRecordsRequest writeRecordsRequest = new WriteRecordsRequest() .withDatabaseName(DATABASE_NAME) .withTableName(TABLE_NAME) .withRecords(records); try { WriteRecordsResult writeRecordsResult = amazonTimestreamWrite.writeRecords(writeRecordsRequest); System.out.println("WriteRecords Status: " + writeRecordsResult.getSdkHttpMetadata().getHttpStatusCode()); } catch (RejectedRecordsException e) { System.out.println("RejectedRecords: " + e); for (RejectedRecord rejectedRecord : e.getRejectedRecords()) { System.out.println("Rejected Index " + rejectedRecord.getRecordIndex() + ": " + rejectedRecord.getReason()); } System.out.println("Other records were written successfully. "); } catch (Exception e) { System.out.println("Error: " + e); } }
単一メジャーレコードを保存すると、データは論理的に次のように表されます。
[時間] | device_id | device_type | os_version | region | measure_name | measure_value::bigint | measure_value::double |
---|---|---|---|---|---|---|---|
2021-09-07 21:48:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
video_startup_time |
200 |
|
2021-09-07 21:48:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
rebuffering_ratio |
0.5 |
|
2021-09-07 21:48:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
video_playback_failures |
0 |
|
2021-09-07 21:48:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
平均フレームレート |
0.85 |
|
2021-09-07 21:53:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
video_startup_time |
500 |
|
2021-09-07 21:53:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
rebuffering_ratio |
1.5 |
|
2021-09-07 21:53:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
video_playback_failures |
10 |
|
2021-09-07 21:53:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
平均フレームレート |
0.2 |
クエリ: 次のように、過去 15 分間に受信したのと同じタイムスタンプを持つすべてのデータポイントを取得するクエリを記述できます。
with cte_video_startup_time as ( SELECT time, device_id, device_type, os_version, region, measure_value::bigint as video_startup_time FROM table where time >= ago(15m) and measure_name=”video_startup_time”), cte_rebuffering_ratio as ( SELECT time, device_id, device_type, os_version, region, measure_value::double as rebuffering_ratio FROM table where time >= ago(15m) and measure_name=”rebuffering_ratio”), cte_video_playback_failures as ( SELECT time, device_id, device_type, os_version, region, measure_value::bigint as video_playback_failures FROM table where time >= ago(15m) and measure_name=”video_playback_failures”), cte_average_frame_rate as ( SELECT time, device_id, device_type, os_version, region, measure_value::double as average_frame_rate FROM table where time >= ago(15m) and measure_name=”average_frame_rate”) SELECT a.time, a.device_id, a.os_version, a.region, a.video_startup_time, b.rebuffering_ratio, c.video_playback_failures, d.average_frame_rate FROM cte_video_startup_time a, cte_buffering_ratio b, cte_video_playback_failures c, cte_average_frame_rate d WHERE a.time = b.time AND a.device_id = b.device_id AND a.os_version = b.os_version AND a.region=b.region AND a.time = c.time AND a.device_id = c.device_id AND a.os_version = c.os_version AND a.region=c.region AND a.time = d.time AND a.device_id = d.device_id AND a.os_version = d.os_version AND a.region=d.region
ワークロードコスト: このワークロードのコストは、単一メジャーレコードでは 1 か月あたり 373.23 USD と推定されます。
複数メジャーレコードの使用
データモデリング: 複数メジャーレコードでは、4 つのメジャーすべて (ビデオの起動時間、再バッファリング率、ビデオ再生失敗、平均フレームレート)、4 つのディメンションすべて (device_id、device_type、os_version、region)、タイムスタンプを含む 1 つのレコードを作成します。
書き込み: ライブ分析用に Amazon Timestream にデータを書き込むと、レコードは次のように構築されます。
public void writeRecords() { System.out.println("Writing records"); // Specify repeated values for all records List<Record> records = new ArrayList<>(); final long time = System.currentTimeMillis(); List<Dimension> dimensions = new ArrayList<>(); final Dimension device_id = new Dimension().withName("device_id").withValue("12345678"); final Dimension device_type = new Dimension().withName("device_type").withValue("iPhone 11"); final Dimension os_version = new Dimension().withName("os_version").withValue("14.8"); final Dimension region = new Dimension().withName("region").withValue("us-east-1"); dimensions.add(device_id); dimensions.add(device_type); dimensions.add(os_version); dimensions.add(region); Record videoMetrics = new Record() .withDimensions(dimensions) .withMeasureName("video_metrics") .withTime(String.valueOf(time)); .withMeasureValueType(MeasureValueType.MULTI) .withMeasureValues( new MeasureValue() .withName("video_startup_time") .withValue("0") .withValueType(MeasureValueType.BIGINT), new MeasureValue() .withName("rebuffering_ratio") .withValue("0.5") .withType(MeasureValueType.DOUBLE), new MeasureValue() .withName("video_playback_failures") .withValue("0") .withValueType(MeasureValueType.BIGINT), new MeasureValue() .withName("average_frame_rate") .withValue("0.5") .withValueType(MeasureValueType.DOUBLE)) records.add(videoMetrics); WriteRecordsRequest writeRecordsRequest = new WriteRecordsRequest() .withDatabaseName(DATABASE_NAME) .withTableName(TABLE_NAME) .withRecords(records); try { WriteRecordsResult writeRecordsResult = amazonTimestreamWrite.writeRecords(writeRecordsRequest); System.out.println("WriteRecords Status: " + writeRecordsResult.getSdkHttpMetadata().getHttpStatusCode()); } catch (RejectedRecordsException e) { System.out.println("RejectedRecords: " + e); for (RejectedRecord rejectedRecord : e.getRejectedRecords()) { System.out.println("Rejected Index " + rejectedRecord.getRecordIndex() + ": " + rejectedRecord.getReason()); } System.out.println("Other records were written successfully. "); } catch (Exception e) { System.out.println("Error: " + e); } }
複数メジャーレコードを保存すると、データは論理的に次のように表されます。
[時間] | device_id | device_type | os_version | region | measure_name | video_startup_time | rebuffering_ratio | video_ playback_failures | 平均フレームレート |
---|---|---|---|---|---|---|---|---|---|
2021-09-07 21:48:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
video_metrics |
200 |
0.5 |
0 |
0.85 |
2021-09-07 21:53:44 .000000000 |
12345678 |
iPhone 11 |
14.8 |
us-east-1 |
video_metrics |
500 |
1.5 |
10 |
0.2 |
クエリ: 次のように、過去 15 分間に受信したのと同じタイムスタンプを持つすべてのデータポイントを取得するクエリを記述できます。
SELECT time, device_id, device_type, os_version, region, video_startup_time, rebuffering_ratio, video_playback_failures, average_frame_rate FROM table where time >= ago(15m)
ワークロードコスト: ワークロードのコストは、複数メジャーレコードでは 127.43 USD と推定されます。
注記
この場合、複数メジャーレコードを使用すると、全体的な推定月額支出が 2.5 倍削減され、データ書き込みコストが 3.3 倍、ストレージコストが 3.3 倍、クエリコストが 1.2 倍削減されます。
過去または将来に存在するタイムスタンプ付きのデータの書き込み
Timestream for Live Analytics では、いくつかの異なるメカニズムを使用して、メモリストアの保持期間外にあるタイムスタンプを使用してデータを書き込むことができます。
-
マグネティックストアの書き込み — 遅延到着データをマグネティックストアの書き込みを通じてマグネティックストアに直接書き込むことができます。マグネティックストア書き込みを使用するには、まずテーブルのマグネティックストア書き込みを有効にする必要があります。その後、メモリストアへのデータの書き込みに使用したのと同じメカニズムを使用して、テーブルにデータを取り込むことができます。Amazon Timestream for Live Analytics は、タイムスタンプに基づいてデータを自動的にマグネティックストアに書き込みます。
注記
マグネティックストアの write-to-readレイテンシーは、 write-to-readレイテンシーが 1 秒未満のメモリストアにデータを書き込む場合とは異なり、最大 6 時間です。
-
メジャーの TIMESTAMP データ型 – TIMESTAMP データ型を使用して、過去、現在、または将来のデータを保存できます。複数メジャーレコードには、レコードの時間フィールドに加えて、TIMESTAMP データ型の複数の属性を含めることができます。複数メジャーレコードのTIMESTAMP属性は、将来または過去のタイムスタンプを持つことができ、Timestream for Live Analytics が複数メジャーレコードの TIMESTAMP 型の値に対してインデックスを作成しないことを除いて、時間フィールドのように動作します。
注記
TIMESTAMP データ型は、複数メジャーレコードでのみサポートされています。
読み取りの結果整合性
Timestream for Live Analytics は、読み取りの結果整合性セマンティクスをサポートします。つまり、データのバッチを Timestream for Live Analytics に書き込んだ直後にデータをクエリすると、クエリ結果に最近完了した書き込みオペレーションの結果が反映されない可能性があります。これらのクエリリクエストをしばらくしてから繰り返すと、結果は最新のデータを返します。