手把手教你使用 Timestream 實現物聯網時序資料儲存和分析!

亞馬遜雲開發者發表於2021-12-23

image.png

image.png

Amazon Timestream 是一種快速、可擴充套件的無伺服器時間序列資料庫服務,適用於物聯網和運營應用程式,使用該服務每天可以輕鬆儲存和分析數萬億個事件,速度提高了 1000 倍,而成本僅為關聯式資料庫的十分之一。通過將近期資料保留在記憶體中,並根據使用者定義的策略將歷史資料移至成本優化的儲存層,Amazon Timestream 為客戶節省了管理時間序列資料生命週期的時間和成本。Amazon Timestream 專門構建的查詢引擎可用於訪問和分析近期資料和歷史資料,而無需在查詢中顯示指定資料是儲存在記憶體中還是成本優化層中。Amazon Timestream 內建了時間序列分析函式,可以實現近乎實時地識別資料的趨勢和模式。Amazon Timestream 是無伺服器服務,可自動縮放以調整容量和效能,因此無需管理底層基礎設施,可以專注於構建應用程式。

本文介紹通過Timestream、Kinesis Stream託管服務和Grafana 和Flink Connector開源軟體實現物聯網(以PM 2.5場景為示例)時序資料實時採集、儲存和分析,其中包含部署架構、環境部署、資料採集、資料儲存和分析,希望當您有類似物聯網時序資料儲存和分析需求的時候,能從中獲得啟發,助力業務發展。

架構

Amazon Timestream 能夠使用內建的分析函式(如平滑、近似和插值)快速分析物聯網應用程式生成的時間序列資料。例如,智慧家居裝置製造商可以使用 Amazon Timestream 從裝置感測器收集運動或溫度資料,進行插值以識別沒有運動的時間範圍,並提醒消費者採取措施(例如減少熱量)以節約能源。

本文物聯網(以PM 2.5場景為示例),實現PM2.5資料實時採集、時序資料儲存和實時分析, 其中架構主要分成三大部分:

實時時序資料採集:通過Python資料採集程式結合Kinesis Stream和Kinesis Data Analytics for Apache Flink connector 模擬實現從PM 2.5監控裝置, 將資料實時採集資料到Timestream。

時序資料儲存:通過Amazon Timestream時序資料庫實現時序資料儲存,設定記憶體和磁性儲存(成本優化層)儲存時長,可以實現近期資料保留在記憶體中,並根據使用者定義的策略將歷史資料移至成本優化的儲存層。

實時時序資料分析:通過Grafana (安裝Timesteam For Grafana外掛)實時訪問Timestream資料,通過Grafana豐富的分析圖表形式,結合Amazon Timestream 內建的時間序列分析函式,可以實現近乎實時地識別物聯網資料的趨勢和模式。

具體的架構圖如下:

部署環境

1.1 建立Cloudformation

請使用自己帳號 (region請選擇 us-east-1)

下載Cloudformation Yaml檔案:

https://bigdata-bingbing.s3-a...

其它都選擇預設, 點選Create Stack button.

Cloud Formation 建立成功

1.2 連線到新建的Ec2堡壘機:

修改證照檔案許可權

chmod 0600 [path to downloaded .pem file]

ssh -i [path to downloaded .pem file] ec2-user@[bastionEndpoint]

執行aws configure:

aws configure

default region name, 輸入:“us-east-1”,其它選擇預設設定。

1.3 連線到EC2堡壘機 安裝相應軟體

設定時區
TZ='Asia/Shanghai'; export TZ

Install python3
sudo yum install -y python3

Install python3 pip
sudo yum install -y python3-pip

pip3 install boto3
sudo pip3 install boto3

pip3 install numpy
sudo pip3 install numpy

install git
sudo yum install -y git

1.4 下載Github Timesteram Sample 程式庫

git clone https://github.com/awslabs/amazon-timestream-tools amazon-timestream-tools

1.5 安裝Grafana Server

連線到EC2堡壘機:
sudo vi /etc/yum.repos.d/grafana.repo

For OSS releases:(拷貝以下內容到grafana.repo)

[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

安裝grafana server:
sudo yum install -y grafana

啟動grafana server:

sudo service grafana-server start
sudo service grafana-server status

配置grafana server在作業系統啟動時 自動啟動:

sudo /sbin/chkconfig --add grafana-server

1.6 安裝timestream Plugin

sudo grafana-cli plugins install grafana-timestream-datasource

重啟grafana
sudo service grafana-server restart

1.7 配置Grafana 要訪問Timesteam服務所用的IAM Role

獲取IAM Role Name
image.png
選擇IAM服務, 選擇要修改的role, role name:
timestream-iot-grafanaEC2rolelabview-us-east-1
修改role trust relationship:

將Policy document 全部選中, 替換成以下內容:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid":"",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Sid":"",
      "Effect": "Allow",
      "Principal": {
        "AWS": "[請替換成CloudFormation output中的role arn]"
      },
      "Action": "sts:AssumeRole"
    } 
  ]
}

修改後的trust relationship:
image.png
1.8 登入到Grafana server

第一次登入到Grafana Server:

  1. 開啟瀏覽器,訪問 http://[Grafana server public ip]:3000
  2. 預設的Grafana Server 監聽埠是:3000 
    如何獲取Ec2 Public IP地址, 如下圖所示, 訪問Cloudformation output:
    image.png
  3. 在登陸介面, 輸入 username: admin; password:admin.(輸入使用者名稱和密碼都是admin)
  4. 點選Log In.登陸成功後, 會收到提示修改密碼

1.9 Grafana server中增加 Timestream 資料來源

增加 Timestream 資料來源
image.png

1.10 Grafana server中配置Timestream資料來源

拷貝配置所需要role ARN資訊 (從cloudformation output tab)Default Region: us-east-1

image.png

image.png

IoT資料儲存

2.1 建立 Timestream 資料庫iot

image.png

image.png

2.2 建立 Timestream 表 pm25

image.png

IoT資料匯入

3.1安裝Flink connector to Timestream

安裝java8
sudo yum install -y java-1.8.0-openjdk*
java -version

安裝debug info, otherwise jmap will throw exception

sudo yum  --enablerepo='*-debug*' install -y java-1.8.0-openjdk-debuginfo

Install maven

sudo wget https://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo 
sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo 
sudo yum install -y apache-maven 
mvn --version 

change java version from 1.7 to 1.8
sudo update-alternatives --config java
sudo update-alternatives --config javac
安裝Apache Flink
最新的Apache Flink 版本支援Kinesis Data Analytics是1.8.2.

  1. Create flink folder
    cd
    mkdir flink
    cd flink
  2. 下載Apache Flink version 1.8.2 原始碼:

    wget https://archive.apache.org/dist/flink/flink-1.8.2/flink-1.8.2-src.tgz
  3. 解壓 Apache Flink 原始碼:
    tar -xvf flink-1.8.2-src.tgz
  4. 進入到Apache Flink 原始碼目錄:
    cd flink-1.8.2
  5. Compile and install Apache Flink (這個編譯時間比較長 需要大致20分鐘):

    mvn clean install -Pinclude-kinesis -DskipTests

3.2建立Kinesis Data Stream Timestreampm25Stream

aws kinesis create-stream --stream-name Timestreampm25Stream --shard-count 1

3.3 執行Flink Connector建立Kinesis連線到Timestream:

cd
cd amazon-timestream-tools/integrations/flink_connector
mvn clean compile

資料採集過程中 請持續執行以下命令:

mvn exec:java -Dexec.mainClass="com.amazonaws.services.kinesisanalytics.StreamingJob" -Dexec.args="--InputStreamName 
Timestreampm25Stream --Region us-east-1 --TimestreamDbName iot --TimestreamTableName pm25"

3.4 準備PM2.5演示資料:

連線到EC2堡壘機

  1. 下載5演示資料生成程式:

    cd
    mkdir pm25
    cd pm25
    wget https://bigdata-bingbing.s3-ap-northeast-
  2. 執行5演示資料生成程式 (python程式2個引數 –region default: us-east-1; –stream default: Timestreampm25Stream)
    資料採集過程中 請持續執行以下命令:
    python3 pm25_new_kinisis_test.py

    IoT資料分析

4.1 登陸到Grafana Server 建立儀表板和Panel

image.png

建立Dashboard查詢時 請設定時區為本地瀏覽器時區:

image.png

建立新的Panel:

image.png

選擇要訪問的資料來源,將要查詢分析所執行的SQL語句貼上到新的Panel中:

image.png

4.2 建立時間資料分析儀表版 Dashboard PM2.5 Analysis 1(Save as PM2.5 Analysis 1)

4.2.1 查詢北京各個監控站點PM2.5 平均值
New Panel

SELECT CASE WHEN location = 'fengtai_xiaotun' THEN avg_pm25 ELSE NULL END AS fengtai_xiaotou,
CASE WHEN location = 'fengtai_yungang' THEN avg_pm25 ELSE NULL END AS fengtai_yungang,
CASE WHEN location = 'daxing' THEN avg_pm25 ELSE NULL END AS daxing,
CASE WHEN location = 'wanshou' THEN avg_pm25 ELSE NULL END AS wanshou,
CASE WHEN location = 'gucheng' THEN avg_pm25 ELSE NULL END AS gucheng,
CASE WHEN location = 'tiantan' THEN avg_pm25 ELSE NULL END AS tiantan,
CASE WHEN location = 'yanshan' THEN avg_pm25 ELSE NULL END AS yanshan,
CASE WHEN location = 'miyun' THEN avg_pm25 ELSE NULL END AS miyun,
CASE WHEN location = 'changping' THEN avg_pm25 ELSE NULL END AS changping,
CASE WHEN location = 'aoti' THEN avg_pm25 ELSE NULL END AS aoti,
CASE WHEN location = 'mengtougou' THEN avg_pm25 ELSE NULL END AS mentougou,
CASE WHEN location = 'huairou' THEN avg_pm25 ELSE NULL END AS huairou,
CASE WHEN location = 'haidian' THEN avg_pm25 ELSE NULL END AS haidian,
CASE WHEN location = 'nongzhan' THEN avg_pm25 ELSE NULL END AS nongzhan,
CASE WHEN location = 'tongzhou' THEN avg_pm25 ELSE NULL END AS tongzhou,
CASE WHEN location = 'dingling' THEN avg_pm25 ELSE NULL END AS dingling,
CASE WHEN location = 'yanqing' THEN avg_pm25 ELSE NULL END AS yanqing,
CASE WHEN location = 'guanyuan' THEN avg_pm25 ELSE NULL END AS guanyuan,
CASE WHEN location = 'dongsi' THEN avg_pm25 ELSE NULL END AS dongsi,
CASE WHEN location = 'shunyi' THEN avg_pm25 ELSE NULL END AS shunyi
FROM 
(SELECT location, round(avg(measure_value::bigint),0) as avg_pm25
FROM "iot"."pm25" 
where measure_name='pm2.5' 
and city='Beijing'
and time >= ago(30s)
group by location,bin(time,30s)
order by avg_pm25 desc)

選擇圖形顯示 select Gauge

image.png

Save Panel as Beijing PM2.5 analysis

Edit Panel Title:Beijing PM2.5 analysis

image.png

Save Dashboard PM2.5 analysis 1:

image.png

4.2.2 查詢上海一天內各個監控站點PM2.5 平均值

New Panel

SELECT CASE WHEN location = 'songjiang' THEN avg_pm25 ELSE NULL END AS songjiang,
CASE WHEN location = 'fengxian' THEN avg_pm25 ELSE NULL END AS fengxian, 
CASE WHEN location = 'no 15 factory' THEN avg_pm25 ELSE NULL END AS No15_factory, 
CASE WHEN location = 'xujing' THEN avg_pm25 ELSE NULL END AS xujing,
 CASE WHEN location = 'pujiang' THEN avg_pm25 ELSE NULL END AS pujiang, 
 CASE WHEN location = 'putuo' THEN avg_pm25 ELSE NULL END AS putuo, 
 CASE WHEN location = 'shangshida' THEN avg_pm25 ELSE NULL END AS shangshida,
CASE WHEN location = 'jingan' THEN avg_pm25 ELSE NULL END AS jingan, 
CASE WHEN location = 'xianxia' THEN avg_pm25 ELSE NULL END AS xianxia, 
CASE WHEN location = 'hongkou' THEN avg_pm25 ELSE NULL END AS hongkou, 
CASE WHEN location = 'jiading' THEN avg_pm25 ELSE NULL END AS jiading, 
CASE WHEN location = 'zhangjiang' THEN avg_pm25 ELSE NULL END AS zhangjiang, 
CASE WHEN location = 'miaohang' THEN avg_pm25 ELSE NULL END AS miaohang, 
CASE WHEN location = 'yangpu' THEN avg_pm25 ELSE NULL END AS yangpu, 
CASE WHEN location = 'huinan' THEN avg_pm25 ELSE NULL END AS huinan, 
CASE WHEN location = 'chongming' THEN avg_pm25 ELSE NULL END AS chongming
From(
SELECT location, round(avg(measure_value::bigint),0) as avg_pm25
FROM "iot"."pm25" 
where measure_name='pm2.5' 
and city='Shanghai'
and time >= ago(30s)
group by location,bin(time,30s)
order by avg_pm25 desc)

image.png

Save Panel as Shanghai PM2.5 analysis

Edit Panel Title:Shanghai PM2.5 analysis

Save Dashboard PM2.5 analysis 1

4.2.3查詢廣州各個監控站點PM2.5 平均值

New Panel

SELECT CASE WHEN location = 'panyu' THEN avg_pm25 ELSE NULL END AS panyu,
CASE WHEN location = 'commercial school' THEN avg_pm25 ELSE NULL END AS commercial_school, 
CASE WHEN location = 'No 5 middle school' THEN avg_pm25 ELSE NULL END AS No_5_middle_school,
CASE WHEN location = 'guangzhou monitor station' THEN avg_pm25 ELSE NULL END AS Guangzhou_monitor_station, 
CASE WHEN location = 'nansha street' THEN avg_pm25 ELSE NULL END AS Nansha_street, 
CASE WHEN location = 'No 86 middle school' THEN avg_pm25 ELSE NULL END AS No_86_middle_school, 
CASE WHEN location = 'luhu' THEN avg_pm25 ELSE NULL END AS luhu, 
CASE WHEN location = 'nansha' THEN avg_pm25 ELSE NULL END AS nansha, 
CASE WHEN location = 'tiyu west' THEN avg_pm25 ELSE NULL END AS tiyu_west, 
CASE WHEN location = 'jiulong town' THEN avg_pm25 ELSE NULL END AS jiulong_town, 
CASE WHEN location = 'huangpu' THEN avg_pm25 ELSE NULL END AS Huangpu, 
CASE WHEN location = 'baiyun' THEN avg_pm25 ELSE NULL END AS Baiyun, 
CASE WHEN location = 'maofeng mountain' THEN avg_pm25 ELSE NULL END AS Maofeng_mountain, 
CASE WHEN location = 'chong hua' THEN avg_pm25 ELSE NULL END AS Chonghua, 
CASE WHEN location = 'huadu' THEN avg_pm25 ELSE NULL END AS huadu
from(
    SELECT location, round(avg(measure_value::bigint),0) as avg_pm25
FROM "iot"."pm25" 
where measure_name='pm2.5' 
and city='Guangzhou'
and time >= ago(30s)
group by location,bin(time,30s)
order by avg_pm25 desc)

image.png

Save Panel as Guangzhou PM2.5 analysis

Edit Panel Title:Guangzhou PM2.5 analysis

Save Dashboard PM2.5 analysis 1

4.2.4 查詢深圳各個監控站點PM2.5 平均值

New Panel

SELECT CASE WHEN location = 'huaqiao city' THEN avg_pm25 ELSE NULL END AS Huaqiao_city,
 CASE WHEN location = 'xixiang' THEN avg_pm25 ELSE NULL END AS xixiang,
CASE WHEN location = 'guanlan' THEN avg_pm25 ELSE NULL END AS guanlan,
CASE WHEN location = 'longgang' THEN avg_pm25 ELSE NULL END AS Longgang,
CASE WHEN location = 'honghu' THEN avg_pm25 ELSE NULL END AS Honghu,
CASE WHEN location = 'pingshan' THEN avg_pm25 ELSE NULL END AS Pingshan,
CASE WHEN location = 'henggang' THEN avg_pm25 ELSE NULL END AS Henggang,
CASE WHEN location = 'minzhi' THEN avg_pm25 ELSE NULL END AS Minzhi,
CASE WHEN location = 'lianhua' THEN avg_pm25 ELSE NULL END AS Lianhua,
CASE WHEN location = 'yantian' THEN avg_pm25 ELSE NULL END AS Yantian,
CASE WHEN location = 'nanou' THEN avg_pm25 ELSE NULL END AS Nanou,
CASE WHEN location = 'meisha' THEN avg_pm25 ELSE NULL END AS Meisha
From(
SELECT location, round(avg(measure_value::bigint),0) as avg_pm25
FROM "iot"."pm25" 
where measure_name='pm2.5' 
and city='Shenzhen'
and time >= ago(30s)
group by location,bin(time,30s)
order by avg_pm25 desc)

image.png

Save Panel as Shenzhen PM2.5 analysis

Edit Panel Title:Shenzhen PM2.5 analysis

Save Dashboard PM2.5 analysis 1

4.2.5 深圳華僑城時間序列分析(最近5分鐘內PM2.5分析)

New Panel

select location, CREATE_TIME_SERIES(time, measure_value::bigint) as PM25 FROM iot.pm25
where measure_name='pm2.5' 
and location='huaqiao city'
and time >= ago(5m)
GROUP BY location

選擇圖形顯示 select Lines; Select Points:

image.png

Save Panel as Shen Zhen Huaqiao City PM2.5 analysis

Edit Panel Title:深圳華僑城最近5分鐘PM2.5分析

Save Dashboard PM2.5 analysis 1

4.2.6找出過去2小時內深圳華僑城以30秒為間隔的平均PM2.5值 (使用線性插值填充缺失的值)

New Panel

WITH binned_timeseries AS (
    SELECT location, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::bigint), 2) AS avg_PM25
    FROM "iot".pm25
    WHERE measure_name = 'pm2.5'
        AND location='huaqiao city'
        AND time > ago(2h)
    GROUP BY location, BIN(time, 30s)
), interpolated_timeseries AS (
    SELECT location,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(binned_timestamp, avg_PM25),
                SEQUENCE(min(binned_timestamp), max(binned_timestamp), 30s)) AS interpolated_avg_PM25
    FROM binned_timeseries
    GROUP BY location
)
SELECT time, ROUND(value, 2) AS interpolated_avg_PM25
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_PM25)

選擇圖形顯示 select Lines:

image.png

Save Panel as Shen Zhen Huaqiao City PM2.5 analysis 1

Edit Panel Title:過去2小時深圳華僑城平均PM2.5值 (使用線性插值填充缺失值)

Save Dashboard PM2.5 analysis 1

4.2.7 過去5分鐘內所有城市PM2.5平均值排名 (線性插值)

New Panel

SELECT CASE WHEN city = 'Shanghai' THEN inter_avg_PM25 ELSE NULL END AS Shanghai,
CASE WHEN city = 'Beijing' THEN inter_avg_PM25 ELSE NULL END AS Beijing,
CASE WHEN city = 'Guangzhou' THEN inter_avg_PM25 ELSE NULL END AS Guangzhou,
CASE WHEN city = 'Shenzhen' THEN inter_avg_PM25 ELSE NULL END AS Shenzhen,
CASE WHEN city = 'Hangzhou' THEN inter_avg_PM25 ELSE NULL END AS Hangzhou,
CASE WHEN city = 'Nanjing' THEN inter_avg_PM25 ELSE NULL END AS Nanjing,
CASE WHEN city = 'Chengdu' THEN inter_avg_PM25 ELSE NULL END AS Chengdu,
CASE WHEN city = 'Chongqing' THEN inter_avg_PM25 ELSE NULL END AS Chongqing,
CASE WHEN city = 'Tianjin' THEN inter_avg_PM25 ELSE NULL END AS Tianjin,
CASE WHEN city = 'Shenyang' THEN inter_avg_PM25 ELSE NULL END AS Shenyang,
CASE WHEN city = 'Sanya' THEN inter_avg_PM25 ELSE NULL END AS Sanya,
CASE WHEN city = 'Lasa' THEN inter_avg_PM25 ELSE NULL END AS Lasa
from(
WITH binned_timeseries AS (
    SELECT city,location, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::bigint), 2) AS avg_PM25
    FROM "iot".pm25
    WHERE measure_name = 'pm2.5'
        AND time > ago(5m)
    GROUP BY city,location, BIN(time, 30s)
), interpolated_timeseries AS (
    SELECT city,location,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(binned_timestamp, avg_PM25),
                SEQUENCE(min(binned_timestamp), max(binned_timestamp), 30s)) AS interpolated_avg_PM25
    FROM binned_timeseries
    GROUP BY city,location
), all_location_interpolated as (
SELECT city,location,time, ROUND(value, 2) AS interpolated_avg_PM25
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_PM25))
select city,avg(interpolated_avg_PM25) AS inter_avg_PM25
from all_location_interpolated
group by city
order by avg(interpolated_avg_PM25) desc)

選擇Panel圖形型別:

image.png

image.png

Save Panel as all city analysis 1

Edit Panel Title:過去5分鐘所有城市PM2.5平均值

Save Dashboard PM2.5 analysis 1

4.2.8 過去5分鐘內 PM2.5最高的十個採集點(線性插值)

New Panel

WITH binned_timeseries AS (
    SELECT city,location, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::bigint), 2) AS avg_PM25
    FROM "iot".pm25
    WHERE measure_name = 'pm2.5'
        AND time > ago(5m)
    GROUP BY city,location, BIN(time, 30s)
), interpolated_timeseries AS (
    SELECT city,location,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(binned_timestamp, avg_PM25),
                SEQUENCE(min(binned_timestamp), max(binned_timestamp), 30s)) 
                AS interpolated_avg_PM25
    FROM binned_timeseries
    GROUP BY city,location
), interpolated_cross_join as (
SELECT city,location,time, ROUND(value, 2) AS interpolated_avg_PM25
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_PM25))
select city,location, avg(interpolated_avg_PM25) as avg_PM25_loc
from interpolated_cross_join
group by city,location
order by avg_PM25_loc desc
limit 10

選擇Table

image.png

Save Panel as all city analysis 2

Edit Panel Title:過去5分鐘內 PM2.5最高的十個採集點(線性插值)

Save Dashboard PM2.5 analysis 1

4.2.9 過去5分鐘內 PM2.5最低的十個採集點(線性插值)

New Panel

WITH binned_timeseries AS (
    SELECT city,location, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::bigint), 2) AS avg_PM25
    FROM "iot".pm25
    WHERE measure_name = 'pm2.5'
        AND time > ago(5m)
    GROUP BY city,location, BIN(time, 30s)
), interpolated_timeseries AS (
    SELECT city,location,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(binned_timestamp, avg_PM25),
                SEQUENCE(min(binned_timestamp), max(binned_timestamp), 30s)) 
                AS interpolated_avg_PM25
    FROM binned_timeseries
    GROUP BY city,location
), interpolated_cross_join as (
SELECT city,location,time, ROUND(value, 2) AS interpolated_avg_PM25
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_PM25))
select city,location, avg(interpolated_avg_PM25) as avg_PM25_loc
from interpolated_cross_join
group by city,location
order by avg_PM25_loc asc
limit 10

選擇Table

image.png

Save Panel as all city analysis 3

Edit Panel Title:過去5分鐘內 PM2.5最低的十個採集點(線性插值)

Save Dashboard PM2.5 analysis 1

設定儀表板 每5秒鐘重新整理一次:

image.png

image.png

本blog著重介紹通過Timestream、Kinesis Stream託管服務和Grafana實現物聯網(以PM 2.5場景為示例)時序資料實時採集、儲存和分析,其中包含部署架構、環境部署、資料採集、資料儲存和分析,希望當您有類似物聯網時序資料儲存和分析需求的時候,有所啟發,實現海量物聯網時序資料高效管理、挖掘物聯網資料中蘊含的規律、模式和價值,助力業務發展。

附錄:
《Amazon Timestream開發人員指南》
https://docs.aws.amazon.com/z...
《Amazon Timestream開發程式示例》
https://github.com/awslabs/am...
《Amazon Timestream與Grafana整合示例》
https://docs.aws.amazon.com/z...

本篇作者:劉冰冰

image.png
亞馬遜雲科技資料庫解決方案架構師,負責基於亞馬遜雲科技的資料庫解決方案的諮詢與架構設計,同時致力於大資料方面的研究和推廣。在加入亞馬遜雲科技之前曾在Oracle工作多年,在資料庫雲規劃、設計運維調優、DR解決方案、大資料和數倉以及企業應用等方面有豐富的經驗。

相關文章