本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
您可以從連線的裝置、IT 系統和工業設備收集時間序列資料,並將其寫入 Timestream for Live Analytics。Timestream for Live Analytics 可讓您在時間序列屬於相同資料表時,從單一時間序列和/或單一寫入請求中多個序列的資料點寫入資料點。為了方便起見,Timestream for Live Analytics 為您提供彈性的結構描述,可根據您調用寫入資料庫時指定的度量值的維度名稱和資料類型,自動偵測 Timestream for Live Analytics 資料表的資料欄名稱和資料類型。您也可以將批次資料寫入 Timestream for Live Analytics。
注意
Timestream for Live Analytics 支援讀取的最終一致性語義。這表示當您在將一批資料寫入 Timestream for Live Analytics 後立即查詢資料時,查詢結果可能不會反映最近完成的寫入操作的結果。結果也可能包含一些過時的資料。同樣地,在寫入具有一或多個新維度的時間序列資料時,查詢可能會在短時間內傳回部分欄位子集。如果您在短時間內重複這些查詢請求,結果應會傳回最新的資料。
您可以使用 AWS SDKs、 或透過 AWS CLI、、AWS Lambda、AWS IoT CoreAmazon Managed Service for Apache FlinkAmazon Kinesis、 Amazon MSK和 來寫入資料開放原始碼 Telegraf。
資料類型
Timestream for Live Analytics 支援下列寫入資料類型。
資料類型 | 描述 |
---|---|
BIGINT |
代表 64 位元帶正負號的整數。 |
BOOLEAN |
代表邏輯的兩個真相值,即 true 和 false。 |
DOUBLE |
實作二進位浮點運算 IEEE 標準 754 的 64 位元變數精確度。 注意有 的查詢語言函數 |
VARCHAR |
變數長度字元資料,具有選用的最大長度。上限為 2 KB。 |
MULTI |
多度量記錄的資料類型。此資料類型包含類型 |
TIMESTAMP |
使用奈秒精確時間,以 UTC 表示執行個體的時間,追蹤自 Unix 時間以來的時間。此資料類型目前僅支援多度量記錄 (即在類型 的度量值內
|
無前期結構描述定義
將資料傳送至 Amazon Timestream for Live Analytics 之前,您必須使用 AWS Management Console、Timestream for Live Analytics SDKs 或 Timestream for Live Analytics API 操作建立資料庫和資料表。如需詳細資訊,請參閱 建立 資料庫 和 建立資料表。建立資料表時,您不需要預先定義結構描述。Amazon Timestream for Live Analytics 會根據所傳送資料點的量值和維度自動偵測結構描述,因此您不再需要離線變更結構描述,以適應快速變化的時間序列資料。
寫入資料 (插入 和 upserts)
Amazon Timestream for Live Analytics 中的寫入操作可讓您插入和升級資料。根據預設,Amazon Timestream for Live Analytics 中的寫入會遵循第一個寫入器的語意,其中資料會儲存為僅附加,重複的記錄會遭到拒絕。雖然第一個寫入器的語義符合許多時間序列應用程式的需求,但在某些情況下,應用程式需要以同冪方式更新現有記錄,和/或使用最後一個寫入器寫入資料則會獲得語義,其中具有最高版本的記錄存放在服務中。為了解決這些案例,Amazon Timestream for Live Analytics 提供提升資料的能力。Upsert 是一種操作,可在記錄不存在時將記錄插入系統,或在記錄存在時更新記錄。記錄更新時,會以等冪方式更新。
沒有要刪除的記錄層級操作。但資料表和資料庫可以刪除。
將資料寫入記憶體存放區和磁性存放區
Amazon Timestream for Live Analytics 可讓您直接將資料寫入記憶體存放區和磁性存放區。記憶體存放區已針對高輸送量資料寫入進行最佳化,而磁性存放區已針對延遲到達資料較低的輸送量寫入進行最佳化。
延遲抵達資料是指時間戳記早於目前時間且超出記憶體存放區保留期的資料。您必須透過啟用資料表的磁性存放區寫入,明確啟用將延遲抵達資料寫入至磁性存放區的功能。此外, MagneticStoreRejectedDataLocation
會在建立資料表時定義。若要寫入磁性存放區, 的呼叫者WriteRecords
必須具有在建立資料表MagneticStoreRejectedDataLocation
期間在 中指定的 S3 儲存貯體的S3:PutObject
許可。如需詳細資訊,請參閱 CreateTable、 WriteRecords 和 PutObject。
使用單一測量記錄和多測量記錄寫入資料
Amazon Timestream for Live Analytics 可讓您使用兩種類型的記錄撰寫資料,也就是單一測量記錄和多測量記錄。
單一測量記錄
單一量值記錄可讓您為每個記錄傳送單一量值。使用此格式將資料傳送至 Timestream for Live Analytics 時,Timestream for Live Analytics 會為每個記錄建立一個資料表列。這表示如果裝置發出 4 個指標,且每個指標都是以單一測量記錄傳送,則 Live Analytics 的 Timestream 會在資料表中建立 4 列來存放此資料,而且會針對每一列重複裝置屬性。當您想要從應用程式監控單一指標,或您的應用程式不會同時發出多個指標時,建議使用此格式。
多度量記錄
使用多度量記錄,您可以將多個度量存放在單一資料表資料列中,而不是每個資料表資料列存放一個度量。因此,多測量記錄可讓您將現有資料從關聯式資料庫遷移至 Amazon Timestream for Live Analytics,且變更最少。
您也可以在單一寫入請求中批次處理比單一測量記錄更多的資料。這會增加資料寫入輸送量和效能,並降低資料寫入的成本。這是因為在寫入請求中批次處理更多資料,可讓 Amazon Timestream for Live Analytics 在單一寫入請求中識別更多可重複的資料 (如適用),並僅收取一次重複資料的費用。
多度量記錄
使用多度量記錄,您可以將時間序列資料以更精簡的格式存放在記憶體和磁性存放區中,這有助於降低資料儲存成本。此外,精簡型資料儲存本身有助於撰寫更簡單的查詢以進行資料擷取、改善查詢效能,並降低查詢成本。
此外,多度量記錄也支援 TIMESTAMP 資料類型,用於在時間序列記錄中存放多個時間戳記。多測量記錄中的 TIMESTAMP 屬性支援未來或過去的時間戳記。因此,多度量記錄有助於改善效能、成本和查詢簡單性,並提供儲存不同類型相關度量的更多彈性。
優勢
以下是使用多度量記錄的好處。
-
效能和成本 – 多度量記錄可讓您在單一寫入請求中寫入多個時間序列度量。這會增加寫入輸送量,也降低寫入成本。透過多度量記錄,您可以更精簡的方式存放資料,這有助於降低資料儲存成本。多度量記錄的精簡資料儲存會導致查詢處理的資料較少。這旨在改善整體查詢效能,並協助降低查詢成本。
-
查詢簡單性 – 使用多度量記錄,您不需要在查詢中寫入複雜的通用資料表表達式 (CTEs),即可讀取具有相同時間戳記的多個度量。這是因為量值會以資料欄形式存放在單一資料表列中。因此,多度量記錄可讓您撰寫更簡單的查詢。
-
資料建模彈性 – 您可以使用 TIMESTAMP 資料類型和多測量記錄,將未來的時間戳記寫入 Timestream for Live Analytics。除了記錄中的時間欄位之外,多度量記錄還可以具有 TIMESTAMP 資料類型的多個屬性。在多度量記錄中,TIMESTAMP 屬性可以有未來的時間戳記或過去的時間戳記,並且行為類似於時間欄位,但即時分析的 Timestream 不會在多度量記錄中的 TIMESTAMP 類型值上編製索引。
使用案例
您可以針對任何時間序列應用程式使用多度量記錄,這些應用程式在任何指定時間從同一裝置產生多個度量。以下是一些範例應用程式。
-
影片串流平台,可在指定時間產生數百個指標。
-
產生測量結果的醫療裝置,例如血氧水準、心率和脈衝。
-
工業設備,例如產生指標、溫度和天氣感應器的油裝備。
-
使用一或多個微服務建構的其他應用程式。
範例:監控影片串流應用程式的效能和運作狀態
請考慮在 200 個 EC2 執行個體上執行的影片串流應用程式。您想要使用 Amazon Timestream for Live Analytics 來存放和分析從應用程式發出的指標,以便您可以了解應用程式的效能和運作狀態、快速識別異常狀況、解決問題並探索最佳化機會。
我們將使用單一測量記錄和多測量記錄來建立此案例的模型,然後比較/對比這兩種方法。對於每個方法,我們做出下列假設。
-
每個 EC2 執行個體每秒發出四個量值 (video_startup_time、rebuffering_ratio、Video_playback_failures 和 average_frame_rate) 和四個維度 (device_id、 device_type、os_version 和 region)。
-
您想要將 6 小時的資料存放在記憶體存放區,並將 6 個月的資料存放在磁性存放區。
-
為了識別異常,您已設定每分鐘執行 10 個查詢,以識別過去幾分鐘內的任何異常活動。您也建立了具有八個小工具的儀表板,顯示過去 6 小時的資料,以便您可以有效地監控應用程式。此儀表板由五個使用者隨時存取,每小時自動重新整理。
使用單一量值記錄
資料建模:使用單一量值記錄,我們將為四個量值 (影片啟動時間、重新緩衝比率、影片播放失敗和平均影格率) 中的每一個量值建立一個記錄。每個記錄都會有四個維度 (device_id、 device_type、os_version 和 region) 和時間戳記。
寫入:當您將資料寫入 Amazon Timestream for Live Analytics 時,記錄的建構方式如下。
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 |
average_frame_rate |
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 |
average_frame_rate |
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
工作負載成本:此工作負載的成本估計為每月 373.23 美元,具有單一測量記錄
使用多度量記錄
資料建模:使用多度量記錄,我們將建立一個記錄,其中包含所有四個指標 (影片啟動時間、重新緩衝比率、影片播放失敗和平均影格率)、所有四個維度 (device_id、Device_type、os_version 和區域) 和時間戳記。
寫入:當您將資料寫入 Amazon Timestream for Live Analytics 時,記錄的建構方式如下。
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 | average_frame_rate |
---|---|---|---|---|---|---|---|---|---|
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 美元,其中包含多測量記錄。
注意
在此情況下,使用多度量記錄可減少 2.5 倍的整體估計每月支出,資料寫入成本減少 3.3 倍、儲存成本減少 3.3 倍,而查詢成本減少 1.2 倍。
使用過去或未來的時間戳記寫入資料
Timestream for Live Analytics 提供撰寫資料的能力,其時間戳記位於記憶體存放區保留時段之外,且透過幾個不同的機制。
-
磁性存放區寫入 – 您可以透過磁性存放區寫入,直接將延遲抵達的資料寫入磁性存放區。若要使用磁性存放區寫入,您必須先啟用資料表的磁性存放區寫入。然後,您可以使用與將資料寫入記憶體存放區相同的機制,將資料擷取至資料表。Amazon Timestream for Live Analytics 會根據其時間戳記自動將資料寫入磁性存放區。
注意
與將資料寫入記憶體存放區不同,磁性存放區的write-to-read延遲最長可達 6 小時,其中write-to-read延遲在 1 秒以下的範圍內。
-
用於測量的 TIMESTAMP 資料類型 – 您可以使用 TIMESTAMP 資料類型來存放過去、現在或未來的資料。除了記錄中的時間欄位之外,多度量記錄還可以具有 TIMESTAMP 資料類型的多個屬性。TIMESTAMP 屬性在多度量記錄中,可以有未來的時間戳記或過去的時間戳記,並且行為類似於時間欄位,但即時分析的 Timestream 不會在多度量記錄中的 TIMESTAMP 類型值上編製索引。
注意
TIMESTAMP 資料類型僅支援多度量記錄。
讀取的最終一致性
Timestream for Live Analytics 支援讀取的最終一致性語義。這表示當您在將一批資料寫入 Timestream for Live Analytics 後立即查詢資料時,查詢結果可能不會反映最近完成的寫入操作的結果。如果您在短時間內重複這些查詢請求,結果應會傳回最新的資料。