方案總覽
方案概述
泛時序數據廣泛應用于車聯網、工業物聯網、金融交易、股票分析等多個業務場景。隨著業務規模的增長,數據量急劇增加,如何高效獲取和分析這些數據成為業務洞察和決策的關鍵挑戰。以車聯網場景為例,傳統的數據處理通常涉及多個數據組件的整合,運維難度高、數據存儲及開發成本高。Lindorm作為阿里云自研的云原生多模數據庫,不僅具備低成本存儲、彈性高可用的特點,還集數據存儲和分析功能于一體,支持存儲車輛行駛軌跡、車輛狀態、精準定位等車聯網關鍵數據,并提供實時或批量數據處理能力。
本方案以車輛網場景為例,引導您使用云原生多模數據庫 Lindorm的多種引擎,實現泛時序數據的高并發實時查詢和寫入,幫助您高效構建車機數據上報、物流軌跡跟蹤、實時定位調度等場景服務。
方案架構
方案優勢
一體化:一體化操作,開發效率高,多種數據一個入口,統一SQL操作。相比于傳統的多個產品支撐一個場景的方案,架構更加簡單,易于開發。
低成本:低成本存儲,支持百PB級存儲,支持自適應壓縮和表級別的冷熱分離,您可以根據數據處理需求自由選擇行存儲或列存儲,最多可節省約50%的成本。
高性能:高并發讀寫,支持千萬級并發和毫秒級延遲,可滿足車聯網大規模數據的在線存儲與查詢需求。豐富的檢索能力,通過寬表引擎和搜索引擎組合,使用SQL一鍵在所需數據列上建立搜索(倒排)索引,提供在線搜索服務。搜索引擎支持多維檢索、全文檢索、地理位置檢索等多種高級檢索能力。
彈性:云原生彈性,靈活擴展,Lindorm計算引擎具備Serverless特性,可按需分配計算資源,進行高效的交互式分析和批處理。
部署流程
適用場景
車聯網:使用Lindorm存儲車聯網中的行駛軌跡、車輛狀況、精準定位等重要數據,提供低成本、彈性、靈活可靠的能力,幫助您構建高效的網約車、物流運輸、新能源車檢測等場景服務;集成Ganos時空數據庫引擎,高效支撐車聯網軌跡數據時空分析與挖掘等相關應用場景。
物聯網:使用Lindorm存儲來自工業物聯網場景下的海量異構IT&OT數據,將數據進行同構、匯聚、融合,打破工業場景IT數據和OT數據割裂的“信息孤島”;通過Lindorm計算引擎提供的低成本、高性能、穩定可靠的分布式計算能力,滿足您在數智化生產、交互式數據探索分析、AI/ML數據處理和大規模圖計算等場景中的計算需求。
交易賬單:使用Lindorm存儲金融交易中的海量訂單記錄,金融風控中的用戶事件、畫像特征、規則模型、設備指紋等重要數據,提供低成本、高并發、靈活可靠的能力,幫助您構建高效的金融交易與風控服務。
部署準備
開始部署前,請按以下指引完成賬號申請、賬號充值、RAM用戶創建和授權。
費用說明
完成本方案的部署及體驗,預計產生費用不超過30元。該費用僅為購買本方案示例的資源規格,且使用時長不超過1小時的預估費用。如果您調整了資源規格,或執行了本方案以外的其他操作,可能會導致費用有所變化。請以控制臺顯示的實際價格和最終賬單為準。
本方案以華東1(杭州)地域為例,以下為本方案涉及資源的華東1(杭州)地域單價,僅供參考。
產品 | 計費項 | 規格配置 | 預估費用參考 |
云原生多模數據庫 Lindorm | 寬表節點規格 | 規格:4核16 GB 寬表節點數量:2 | 2.500元/小時 |
搜索節點規格 | 規格:4核16 GB 搜索節點數量:2 | 2.500元/小時 | |
LTS節點規格 | 規格:4核8 GB LTS節點數量:1 | 1.053元/小時 | |
流節點規格 | 規格:4核16 GB 流節點數量:2 | 2.500元/小時 | |
彈性計算資源 | 不涉及 | 2.436元 | |
存儲空間 | 160 GB | 0.157元/小時 | |
集群固定費用 | 不涉及 | 1.875元/小時 | |
云服務器ECS | 實例 | 規格:ecs.e-c1m4.2xlarge | 1.35元/小時 |
系統盤 | 存儲空間:40 GiB(ESSD Entry) | 0.02916元/時 | |
專有網絡VPC | 免費 |
步驟一:準備賬號
步驟二:申請使用權限
在部署資源之前,請先加入釘釘群(群號:78080001631),申請流引擎購買權限。
部署資源
1. 創建專有網絡VPC和交換機
登錄專有網絡管理控制臺,創建1個專有網絡和1臺交換機。
填寫相關配置,具體說明如下:
項目
說明
示例值
專有網絡
地域
選擇專有網絡VPC所在地域,請選擇華東1(杭州)地域。
華東1(杭州)
名稱
專有網絡VPC的名稱。命名規則:長度為2~128個字符,以英文大小字母或中文開頭,可包含數字、下劃線(_)和短劃線(-)。
vpc_lindormk3uu
IPv4網段
在創建VPC時,您必須按照無類域間路由塊(CIDR block)的格式為您的專有網絡劃分私網網段。阿里云VPC支持的網段信息請參見專有網絡組成部分。
在網絡規劃時可以按照管理網段-開發網段-測試網段-生產網段等規則做好規劃。網段一旦投入使用,調整過程復雜,因此規劃十分重要。
192.168.0.0/16
交換機
名稱
虛擬交換機名稱。命名規則:長度為2~128個字符,以英文大小字母或中文開頭,可包含數字、下劃線(_)和短劃線(-)。
vsw_lindomk3uu
可用區
在規劃的地域內選擇1個可用區。
說明請確保交換機所屬的可用區的ECS和Lindorm等資源處于可用狀態。
可用區 G
2.創建云服務器ECS
3.創建云原生多模數據庫Lindorm
登錄Lindorm實例創建頁。
在購買頁面,按以下規劃配置Lindorm相關配置項。
1、商品屬性及網絡配置
選項
說明
商品類型、付費方式、部署方案(分別對應圖示①、②、③)
請按照圖中選項配置。
地域(對應圖示④)
選擇華東1(杭州)。
網絡相關(對應圖示⑤)
選擇之前規劃的VPC、交換機及交換區所在可用區。
2、數據引擎配置
請按照下圖所示進行配置。
單擊立即購買跳轉至訂單頁,勾選服務協議并單擊立即開通。
配置資源
配置ECS
請根據以下步驟在ECS實例上部署相關開發環境和Lindorm客戶端。
步驟一:部署開發環境
流引擎客戶端的運行依賴Java,同時,本方案將使用Python腳本文件模擬生成車機原始數據,因此您需要在ECS實例上部署Java和Python環境。
登錄ECS實例。
登錄云服務器ECS管理控制臺,在目標實例的操作列單擊遠程連接,使用root權限通過Workbench遠程登錄。
執行以下命令,安裝JDK 1.8和Python環境。
# 安裝JDK 1.8 yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y # 安裝Python yum install python3 -y # 安裝Python運行時依賴的庫 pip3 install cryptography==3.4.8
環境驗證。
# 驗證Java環境是否安裝成功 java -version # 驗證Python環境是否安裝成功 python3 --version
步驟二:安裝Lindorm客戶端
Lindorm-cli和Lindorm-sqlline是Lindorm提供的簡易命令行工具,在本方案中分別用于連接Lindorm寬表引擎和流引擎。
下載客戶端安裝包(Linux操作系統安裝包)。
Lindorm-cli:下載地址,請參見安裝Lindorm-cli。
Lindorm-sqlline:
wget https://hbaseuepublic.oss-cn-beijing.aliyuncs.com/lindorm-sqlline-2.0.2.tar.gz
解壓安裝包。
# 解壓Lindorm-cli安裝包 tar zxvf lindorm-cli-linux-latest.tar.gz # 解壓Lindorm-sqlline安裝包 tar zxvf lindorm-sqlline-2.0.2.tar.gz
配置Lindorm
登錄Lindorm管理控制臺(杭州地域),單擊目標實例ID,進入實例詳情頁。
設置Lindorm白名單,將ECS實例的主私網IP添加至組內白名單,保證ECS與Lindorm之間的連通性。
說明如何查看ECS實例的主私網IP地址,請參見查看IP地址。
開通搜索索引。搜索索引是寬表引擎與搜索引擎深度融合的特性,更適合復雜的多維查詢場景。
LTS規格請按照下表進行配置:
配置項
說明
LTS數據同步Core規格
選擇4核8 GB。
LTS節點數量
配置為1個。
請加入釘釘群(群號:78080001631),申請開通列存索引。
說明列存索引可以增強寬表中海量數據的分析計算能力,更適合車聯網與物聯網的設備信息統計、電商領域的數據分析、物流行業的訂單統計等場景。
如果在部署準備階段已開通該權限,可跳過此步驟。
數據導入
在實際的業務場景中,車機上傳的字段有上百甚至上千種,本部署方案篩選了其中一部分作為測試數據:
1.創建Lindorm寬表
登錄云服務器ECS管理控制臺,在目標實例的操作列單擊遠程連接,使用root權限通過Workbench遠程登錄。
跳轉至
Lindorm-cli.exe
所在目錄,連接Lindorm寬表引擎。./lindorm-cli -url <jdbc url> -username <username> -password <password>
參數說明
參數
獲取方法
jdbc url
寬表引擎的Lindorm寬表SQL地址。獲取方法請參見訪問實例。
username
連接寬表引擎的默認用戶名和默認初始密碼。獲取方式請參見訪問實例。
password
創建表
dwd_vehicle_tbox
,用于存儲車機數據。CREATE TABLE dwd_vehicle_tbox ( `vin` VARCHAR, `sampletime` bigint, `DriverStateLinkStatus` INT, `AirBagSystemStatus` INT, `HODHandoffmonitorValid` INT, `BodyCtrlModRollCounter` INT, `VehicleSpeed_kmph` INT, `SteeringAngle_Deg` DOUBLE, `BatterySOC_Percent` DOUBLE, `BrakePedalStatus` INT, `AcceleratorPedalPos_Percent` DOUBLE, `RegenBrakingLevel` INT, `CoolantTemperature_C` INT, `AEB_Activation` INT, `LaneAssistanceStatus` INT, `CruiseControlSpeedSet_kmph` INT, `ParkingAssistEngaged` INT, `RainSensorStatus` INT, `TirePressure_FL_psi` DOUBLE, `TirePressure_FR_psi` DOUBLE, `TirePressure_RL_psi` DOUBLE, `TirePressure_RR_psi` DOUBLE, `LaneDepartureWarningActive` INT, `BatteryStateOfHealth_Percent` DOUBLE, `BatteryTemperature_Avg_C` INT, `BatteryMaxCellVoltage_V` DOUBLE, `BatteryMinCellVoltage_V` DOUBLE, `EvBatteryTemperature_C` DOUBLE, PRIMARY KEY (vin,sampletime) );
(可選)驗證表
dwd_vehicle_tbox
結構是否正確。DESCRIBE TABLE dwd_vehicle_tbox;
返回結果:
+--------------+------------------+------------------------------+---------+----------------+------------+-------------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | TYPE | IS_PRIMARY_KEY | SORT_ORDER | IS_AUTO_INCREMENT | IS_LOCAL_UNIQUE | +--------------+------------------+------------------------------+---------+----------------+------------+-------------------+-----------------+ | default | dwd_vehicle_tbox | vin | VARCHAR | true | ASC | false | false | | default | dwd_vehicle_tbox | sampletime | BIGINT | true | ASC | false | false | | default | dwd_vehicle_tbox | DriverStateLinkStatus | INT | false | none | false | false | | default | dwd_vehicle_tbox | AirBagSystemStatus | INT | false | none | false | false | | default | dwd_vehicle_tbox | HODHandoffmonitorValid | INT | false | none | false | false | | default | dwd_vehicle_tbox | BodyCtrlModRollCounter | INT | false | none | false | false | | default | dwd_vehicle_tbox | VehicleSpeed_kmph | INT | false | none | false | false | | default | dwd_vehicle_tbox | SteeringAngle_Deg | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | BatterySOC_Percent | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | BrakePedalStatus | INT | false | none | false | false | | default | dwd_vehicle_tbox | AcceleratorPedalPos_Percent | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | RegenBrakingLevel | INT | false | none | false | false | | default | dwd_vehicle_tbox | CoolantTemperature_C | INT | false | none | false | false | | default | dwd_vehicle_tbox | AEB_Activation | INT | false | none | false | false | | default | dwd_vehicle_tbox | LaneAssistanceStatus | INT | false | none | false | false | | default | dwd_vehicle_tbox | CruiseControlSpeedSet_kmph | INT | false | none | false | false | | default | dwd_vehicle_tbox | ParkingAssistEngaged | INT | false | none | false | false | | default | dwd_vehicle_tbox | RainSensorStatus | INT | false | none | false | false | | default | dwd_vehicle_tbox | TirePressure_FL_psi | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | TirePressure_FR_psi | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | TirePressure_RL_psi | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | TirePressure_RR_psi | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | LaneDepartureWarningActive | INT | false | none | false | false | | default | dwd_vehicle_tbox | BatteryStateOfHealth_Percent | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | BatteryTemperature_Avg_C | INT | false | none | false | false | | default | dwd_vehicle_tbox | BatteryMaxCellVoltage_V | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | BatteryMinCellVoltage_V | DOUBLE | false | none | false | false | | default | dwd_vehicle_tbox | EvBatteryTemperature_C | DOUBLE | false | none | false | false | +--------------+------------------+------------------------------+---------+----------------+------------+-------------------+-----------------+
2.創建流表
使用組合鍵
Ctrl+D
斷開寬表引擎的連接,跳轉至lindorm-sqlline-2.0.2
目錄,執行以下命令連接流引擎。./bin/lindorm-sqlline -url <jdbc url>
參數說明
參數
獲取方法
jdbc url
流引擎的Lindorm Stream SQL地址。獲取方法:在Lindorm管理控制臺左側導航欄,選擇
。創建流表
dwd_vehicle_tbox_stream
,用于處理上游的報文數據。CREATE STREAM dwd_vehicle_tbox_stream ( `vin` VARCHAR, `sampletime` BIGINT, `DriverStateLinkStatus` INT, `AirBagSystemStatus` INT, `HODHandoffmonitorValid` INT, `BodyCtrlModRollCounter` INT, `VehicleSpeed_kmph` INT, `SteeringAngle_Deg` DOUBLE, `BatterySOC_Percent` DOUBLE, `BrakePedalStatus` INT, `AcceleratorPedalPos_Percent` DOUBLE, `RegenBrakingLevel` INT, `CoolantTemperature_C` INT, `AEB_Activation` INT, `LaneAssistanceStatus` INT, `CruiseControlSpeedSet_kmph` INT, `ParkingAssistEngaged` INT, `RainSensorStatus` INT, `TirePressure_FL_psi` DOUBLE, `TirePressure_FR_psi` DOUBLE, `TirePressure_RL_psi` DOUBLE, `TirePressure_RR_psi` DOUBLE, `LaneDepartureWarningActive` INT, `BatteryStateOfHealth_Percent` DOUBLE, `BatteryTemperature_Avg_C` INT, `BatteryMaxCellVoltage_V` DOUBLE, `BatteryMinCellVoltage_V` DOUBLE, `EvBatteryTemperature_C` DOUBLE );
(可選)執行以下語句,驗證表結構。
DESCRIBE dwd_vehicle_tbox_stream;
返回結果:
+---------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------+ | name | type | null | key | extras | watermark | ----------------------------------------------------------------------------+ |vin | STRING | TRUE | <NULL> | <NULL> | <NULL> | |sampletime | BIGINT | TRUE | <NULL> | <NULL> | <NULL> | |DriverStateLinkStatus | INT | TRUE | <NULL> | <NULL> | <NULL> | |AirBagSystemStatus | INT | TRUE | <NULL> | <NULL> | <NULL> | |HODHandoffmonitorValid | INT | TRUE | <NULL> | <NULL> | <NULL> | |BodyCtrlModRollCounter | INT | TRUE | <NULL> | <NULL> | <NULL> | |VehicleSpeed_kmph | INT | TRUE | <NULL> | <NULL> | <NULL> | |SteeringAngle_Deg | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |BatterySOC_Percent | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |BrakePedalStatus | INT | TRUE | <NULL> | <NULL> | <NULL> | |AcceleratorPedalPos_Percent | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |RegenBrakingLevel | INT | TRUE | <NULL> | <NULL> | <NULL> | |CoolantTemperature_C | INT | TRUE | <NULL> | <NULL> | <NULL> | |AEB_Activation | INT | TRUE | <NULL> | <NULL> | <NULL> | |LaneAssistanceStatus | INT | TRUE | <NULL> | <NULL> | <NULL> | |CruiseControlSpeedSet_kmph | INT | TRUE | <NULL> | <NULL> | <NULL> | |ParkingAssistEngaged | INT | TRUE | <NULL> | <NULL> | <NULL> | |RainSensorStatus | INT | TRUE | <NULL> | <NULL> | <NULL> | |TirePressure_FL_psi | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |TirePressure_FR_psi | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |TirePressure_RL_psi | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |TirePressure_RR_psi | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |LaneDepartureWarningActive | INT | TRUE | <NULL> | <NULL> | <NULL> | |BatteryStateOfHealth_Percent | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |BatteryTemperature_Avg_C | INT | TRUE | <NULL> | <NULL> | <NULL> | |BatteryMaxCellVoltage_V | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |BatteryMinCellVoltage_V | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | |EvBatteryTemperature_C | DOUBLE | TRUE | <NULL> | <NULL> | <NULL> | +---------------------------------------------------------------------------+
3.創建數據入庫任務
執行以下語句創建數據入庫任務,使流表不斷傳輸數據到寬表。
-- 創建數據入庫任務,后續可以通過該CQ名稱查詢任務的狀態. CREATE CQ dwd_vehicle_tbox_stream_job ; -- 建立關聯,如果您只需要抽取一部分數據,可以根據需求調整SQL語句. INSERT INTO lindorm_table.`default`.dwd_vehicle_tbox SELECT * FROM dwd_vehicle_tbox_stream;
(可選)查看入庫任務狀態。
DESCRIBE dwd_vehicle_tbox_stream_job;
返回結果:
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Query ID | Job ID | Status | Is Stoppable | Start time | End time | Duration | Max Parallelism | DelayMs | Sql | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | dwd_vehicle_tbox_stream_job | 2112c72ef3c3aeab587438f95013135c | RUNNING | false | 1720174064325 | -1 | 57912 | -1 | 3321553.0 | IA== | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4.導入數據
使用組合鍵
Ctrl+D
斷開流引擎的連接,執行以下命令安裝Python依賴。python3 -m pip install kafka-python
創建Python腳本文件
demo.py
,執行以下命令編輯文件。vim demo.py
編寫完整代碼,使用Python腳本模擬生成車機原始數據導入流表
dwd_vehicle_tbox_stream
。# -*- coding: UTF-8 -*- import csv import random import datetime import json from kafka import KafkaProducer def random_string(length=32): return ''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', k=length)) def random_int(min_val, max_val): return random.randint(min_val, max_val) def random_double(min_val, max_val): return random.uniform(min_val, max_val) def generate_vehicle_tbox_row(vin=None, current_time=None): """給定一個 VIN 和當前時間,生成一行車輛 T-Box 數據。""" vehicle_tbox_row_dict = { "vin": vin, "sampletime": (current_time - random.randint(0, 365 * 24 * 60 * 60 * 1000)), "DriverStateLinkStatus": random_int(0, 1), "AirBagSystemStatus": random_int(0, 1), "HODHandoffmonitorValid": random_int(0, 1), "BodyCtrlModRollCounter": random_int(8, 60), "VehicleSpeed_kmph": random_int(0, 300), "SteeringAngle_Deg": random_double(-720, 720), "BatterySOC_Percent": random_double(0, 100), "BrakePedalStatus": random_int(0, 1), "AcceleratorPedalPos_Percent": random_double(0, 100), "RegenBrakingLevel": random_int(0, 5), "CoolantTemperature_C": random_int(0, 100), "AEB_Activation": random_int(0, 1), "LaneAssistanceStatus": random_int(0, 1), "CruiseControlSpeedSet_kmph": random_int(0, 300), "ParkingAssistEngaged": random_int(0, 1), "RainSensorStatus": random_int(0, 1), "TirePressure_FL_psi": random_double(0, 3), "TirePressure_FR_psi": random_double(0, 3), "TirePressure_RL_psi": random_double(0, 3), "TirePressure_RR_psi": random_double(0, 3), "LaneDepartureWarningActive": random_int(0, 1), "BatteryStateOfHealth_Percent": random_double(0, 100), "BatteryTemperature_Avg_C": random_int(10, 70), "BatteryMaxCellVoltage_V": random_double(3, 8), "BatteryMinCellVoltage_V": random_double(3, 8), "EvBatteryTemperature_C": random_double(10, 70) } return vehicle_tbox_row_dict def create_kafka_producer(bootstrap_servers='localhost:9092'): """創建并返回 Kafka 生產者實例""" producer_config = { 'bootstrap_servers': bootstrap_servers, # Kafka集群地址 'value_serializer': lambda v: json.dumps(v).encode('utf-8'), # 設置值的序列化器為JSON 'batch_size': 16384, # 批處理大小限制(字節數),到達這個大小后會發送批量數據 'linger_ms': 10, # 毫秒,數據滯留時間(即使batch.size未滿,linger.ms時間到了也會發送數據) 'acks': 'all' # 確認設置,等待所有副本節點的確認 } producer = KafkaProducer(**producer_config) return producer if __name__ == "__main__": count = 200000 # 記錄行數 vin_count = 10 # 車輛數量 bootstrap_servers = "ld-bp1n18l34fefk****-proxy-stream.lindorm.rds.aliyuncs.com:30080" # 中間件連接地址 topicName = "-LINSTREAM-default.dwd-vehicle-tbox-stream" # 根據實際情況設置 vins = [random_string() for _ in range(vin_count)] producer = create_kafka_producer(bootstrap_servers=bootstrap_servers) insert_number = 0 start_time = datetime.datetime.now().timestamp() insert_vins = set() for _ in range(count): vin = random.choice(vins) insert_vins.add(vin) row_json = generate_vehicle_tbox_row(vin, datetime.datetime.now().timestamp() * 1000) producer.send(topicName, row_json) insert_number = insert_number + 1 if insert_number == 10000: print("insert row 10000") producer.flush() insert_number = 0 producer.flush() producer.close() print("insert " + str(count) + ", cost " + str(datetime.datetime.now().timestamp() - start_time) + " s.\n") print("insert vins is " , insert_vins)
參數說明
參數
說明
bootstrap_servers
Lindorm中間件連接地址。獲取方式:在Lindorm管理控制臺左側導航欄,選擇
。topicName
topic名稱,格式為
-LINSTREAM-
+ Database名+“.”+流表名。執行以下命令運行腳本文件,將模擬車機原始報文數據批量導入。
python3 demo.py
(可選)驗證數據導入結果。
再次使用Lindorm-cli連接寬表引擎。
./lindorm-cli -url <jdbc url> -username <默認用戶名> -password <默認初始密碼>
執行以下命令驗證導入結果。
SELECT * FROM dwd_vehicle_tbox LIMIT 10;
通過計算引擎進行復雜查詢
創建列存索引
在進行復雜查詢之前,您需要創建列存索引來增強數據分析計算能力,從而實現高效的數據查詢。
通過Lindorm-cli連接寬表引擎。
./lindorm-cli -url <jdbc url> -username <username> -password <password>
創建列存索引
column_index_dwd_vehi
。CREATE INDEX column_index_dwd_vehicle_tbox USING COLUMNAR ON dwd_vehicle_tbox(*) PARTITION BY ENUMERABLE (bucket(128, vin)) WITH (`lindorm_columnar.user.index.database` = 'vehicle_db', `lindorm_columnar.user.index.table` = 'dwd_vehicle_tbox_column_idx');
(可選)驗證索引信息和狀態。
SHOW INDEX FROM dwd_vehicle_tbox;
返回結果:
+--------------+------------------+-------------------------------+-------------+----------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +--------------+------------------+-------------------------------+-------------+----------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+ | default | dwd_vehicle_tbox | column_index_dwd_vehicle_tbox | ACTIVE | | COLUMNAR | NA | vin,sampletime,DriverStateLinkStatus,AirBagSystemStatus,HODHandoffmonitorValid,BodyCtrlModRollCounter,VehicleSpeed_kmph,SteeringAngle_Deg,BatterySOC_Percent,BrakePedalStatus,AcceleratorPedalPos_Percent,RegenBrakingLevel,CoolantTemperature_C,AEB_Activation,LaneAssistanceStatus,CruiseControlSpeedSet_kmph,ParkingAssistEngaged,RainSensorStatus,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi,LaneDepartureWarningActive,BatteryStateOfHealth_Percent,BatteryTemperature_Avg_C,BatteryMaxCellVoltage_V,BatteryMinCellVoltage_V,EvBatteryTemperature_C | | index table: | | | | | | | | | | | vehicle_db.dwd_vehicle_tbox_column_idx; | | | | | | | | | | | task id: | | | | | | | | | | | 8e60fb75-f01d-4a17-b1fc-9fb50ddc25a8; | | | | | | | | | | | partition by: [hash(128,vin)]; | | | | | | | | | | | attributes: [] | +--------------+------------------+-------------------------------+-------------+----------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+
INDEX_STATE由
BUILDING
變為ACTIVE
時,表示索引已創建完成,此過程大概需等待3分鐘。
復雜查詢
(可選)車輛的電池健康數據按照一定時間頻率上傳至Lindorm,在執行復雜查詢之前您可以先使用簡單的查詢語句查看表中數據。
例如,查詢某一時間段內的10條電池數據。
SELECT vin,BatteryStateOfHealth_Percent FROM lindorm_columnar.vehicle_db.dwd_vehicle_tbox_column_idx WHERE sampletime >= 1686585600000 AND BatteryStateOfHealth_Percent <= 80 LIMIT 10;
返回結果:
+----------------------------------+------------------------------+ | vin | BatteryStateOfHealth_Percent | +----------------------------------+------------------------------+ | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 23.764850669436843 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 6.215661473439549 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 12.852751497229441 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 8.332735748118846 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 19.596259310247877 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 17.621117691572984 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 66.77781508961095 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 77.56923806011324 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 25.969897299920774 | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 71.45633174979432 | +----------------------------------+------------------------------+
查詢每輛車最后一次上報的記錄,并根據電池健康程度排序,查詢電池健康度最低的前10輛汽車和電池信息。
SELECT vin,BatteryStateOfHealth_Percent FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY vin ORDER BY sampletime DESC) AS rn FROM lindorm_table.`default`.dwd_vehicle_tbox WHERE sampletime >= 1686585600000) AS tmp WHERE rn=1 ORDER BY BatteryStateOfHealth_Percent ASC LIMIT 10;
返回結果:
+----------------------------------+------------------------------+ | vin | BatteryStateOfHealth_Percent | +----------------------------------+------------------------------+ | j878HLSbLco8jSVVyTY8CMUZqfkUs28v | 20.652739801362372 | | echVK3CaoAYBSPoKxbaCrMEW8y4BTpmg | 21.518064804363355 | | SLJ1mkIbwBaiSLZO9xc1gy0cbUK69ULc | 23.388871500485052 | | DgBXmx0idrLeSVq08RobnYPxl45sYchb | 27.994995362735676 | | 4pJpua6dn1jzTevlI0NsruBe91rVVix9 | 30.321789199354043 | | CgO3PchAjoKprtBrFbyCG5kK3UGkBcpQ | 31.9348912927222 | | 3gP6BebgBxACvguf0de6juIiwdoCWvWB | 33.72344917241882 | | iMJY8rDr08tFe4BHFQtkalhQ5KSdyOMD | 36.89775232730048 | | Dsn9Wzr65FVZWaq1ajeV6uH7rFLYOH8h | 44.50827494756204 | | Yxoi4mTxvWJB7hKmlPkCnbgK9nUY7Ba2 | 66.27943854842643 | +----------------------------------+------------------------------+
通過搜索引擎進行多維檢索
通過搜索索引執行多維檢索耗時更短,效率更高。您可以根據以下步驟,對比針對同一查詢條件時使用搜索索引和無搜索索引的查詢效率。
未創建搜索索引
基于電池健康和胎壓兩個維度,查詢過去一年中電池健康程度低(小于50)并且胎壓過低(胎壓指標小于2) 的車輛。
-- 1686585600000 = 2023-06-13 0:0:00
SELECT DISTINCT(vin) FROM dwd_vehicle_tbox WHERE sampletime >= 1686585600000 AND BatteryStateOfHealth_Percent < 50 AND (TirePressure_FL_psi < 2 OR TirePressure_FR_psi < 2 OR TirePressure_RL_psi < 2 OR TirePressure_RR_psi < 2);
返回結果:
+----------------------------------+
| vin |
+----------------------------------+
| 0JImIThOLvmYbKmhCP1Mact83E7XvF6s |
| 4spNfR8OhEsDXXaZADS3jivPQUGPXUQo |
| 59ydPuK3xdCvBV8wB1Y5UHsmWfO2aNQj |
| 5Kq9BkgTzNSexZ3fd3XL7AaF56NNVXHu |
| EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 |
| EwB2929l43ttvFNudMZDogppzbXfzYJ1 |
| FaXdxPwK0An7LbaeUV0r8PmqPoBz7Tn9 |
| KDx9AF9qrr4zhJR3sXsuEmVIANjTj8wg |
| LsvywOyn1lLjbrzEghQlHk3aXHfVr8Py |
| SivBFi3uzuUQT9bjO4jrIO7NEd9PYd55 |
| YC6zOBs7h57aqjIGZddDtzZ2YXfREnG2 |
| hkCS5GQ5sHBy2uyPEj7ifGXs21L4EUHu |
| k0kXqJMvx4gyOWfFUIHG6d4N2K8GFdDP |
| mHFfXFIGeItuZM4G9WYyqrEwyMrumsrZ |
| mXtpBVucRZVdKC2FH9MfP0i3MJCOsXXn |
| nH5YV2MAh3EDA14r2efpIHtIMp3AdsH4 |
| rXVDXz7JZ0PpvBgWu79bsKBWmcykxbnJ |
| rfsvhAgRbikInQ6O7gHDztLNWwQnZjVl |
| xU6qTtaDesFrSlQVLkZDe0vQE15gd5VE |
| yWuGjDH9fyRNAlF7k7HUe4GQFHHzSh9Y |
+----------------------------------+
20 rows in set (94912 ms)
該查詢為全表掃描,總耗時為94912 ms。
使用搜索索引
再次通過Lindorm-cli連接寬表引擎。
./lindorm-cli -url <jdbc url> -username <username> -password <password>
創建搜索索引。
CREATE INDEX IF NOT EXISTS dwd_vehicle_tbox_search_idx USING SEARCH ON dwd_vehicle_tbox (BatteryStateOfHealth_Percent,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi);
(可選)查詢搜索索引的狀態。
SHOW INDEX FROM dwd_vehicle_tbox;
返回結果:
+--------------+------------------+-------------------------------+-------------+-------------------------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +--------------+------------------+-------------------------------+-------------+-------------------------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+ | default | dwd_vehicle_tbox | dwd_vehicle_tbox_search_idx | ACTIVE | N/A | SEARCH | NA | BatteryStateOfHealth_Percent,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi | -1 | | | default | dwd_vehicle_tbox | column_index_dwd_vehicle_tbox | ACTIVE | 2024-07-08 10:40:09.388 +0800 | COLUMNAR | NA | vin,sampletime,DriverStateLinkStatus,AirBagSystemStatus,HODHandoffmonitorValid,BodyCtrlModRollCounter,VehicleSpeed_kmph,SteeringAngle_Deg,BatterySOC_Percent,BrakePedalStatus,AcceleratorPedalPos_Percent,RegenBrakingLevel,CoolantTemperature_C,AEB_Activation,LaneAssistanceStatus,CruiseControlSpeedSet_kmph,ParkingAssistEngaged,RainSensorStatus,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi,LaneDepartureWarningActive,BatteryStateOfHealth_Percent,BatteryTemperature_Avg_C,BatteryMaxCellVoltage_V,BatteryMinCellVoltage_V,EvBatteryTemperature_C | | index table: | | | | | | | | | | | vehicle_db.dwd_vehicle_tbox_column_idx; | | | | | | | | | | | task id: | | | | | | | | | | | 8e60fb75-f01d-4a17-b1fc-9fb50ddc25a8; | | | | | | | | | | | partition by: [hash(128,vin)]; | | | | | | | | | | | attributes: [] | +--------------+------------------+-------------------------------+-------------+-------------------------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+
INDEX_STATE由
BUILDING
變為ACTIVE
時,表示索引已創建完成。說明如果索引狀態一直沒有變為ACTIVE狀態,可以通過LTS控制臺查看搜索索引實時同步以及全量同步的執行情況。
查看方式:在LTS控制臺左側導航欄選擇登錄LTS。
,單擊目標任務名。如何登錄LTS,請參見使用相同查詢語句查詢數據。
基于電池健康和胎壓兩個維度,查詢過去一年電池健康程度低(小于50)且胎壓過低(胎壓指標小于2) 的車輛。
-- 1686585600000 = 2023-06-13 0:0:00 SELECT DISTINCT(vin) FROM dwd_vehicle_tbox WHERE sampletime >= 1686585600000 AND BatteryStateOfHealth_Percent < 50 AND (TirePressure_FL_psi < 2 OR TirePressure_FR_psi < 2 OR TirePressure_RL_psi < 2 OR TirePressure_RR_psi < 2);
返回結果:
+----------------------------------+ | vin | +----------------------------------+ | 0JImIThOLvmYbKmhCP1Mact83E7XvF6s | | 4spNfR8OhEsDXXaZADS3jivPQUGPXUQo | | 59ydPuK3xdCvBV8wB1Y5UHsmWfO2aNQj | | 5Kq9BkgTzNSexZ3fd3XL7AaF56NNVXHu | | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | | EwB2929l43ttvFNudMZDogppzbXfzYJ1 | | FaXdxPwK0An7LbaeUV0r8PmqPoBz7Tn9 | | KDx9AF9qrr4zhJR3sXsuEmVIANjTj8wg | | LsvywOyn1lLjbrzEghQlHk3aXHfVr8Py | | SivBFi3uzuUQT9bjO4jrIO7NEd9PYd55 | | YC6zOBs7h57aqjIGZddDtzZ2YXfREnG2 | | hkCS5GQ5sHBy2uyPEj7ifGXs21L4EUHu | | k0kXqJMvx4gyOWfFUIHG6d4N2K8GFdDP | | mHFfXFIGeItuZM4G9WYyqrEwyMrumsrZ | | mXtpBVucRZVdKC2FH9MfP0i3MJCOsXXn | | nH5YV2MAh3EDA14r2efpIHtIMp3AdsH4 | | rXVDXz7JZ0PpvBgWu79bsKBWmcykxbnJ | | rfsvhAgRbikInQ6O7gHDztLNWwQnZjVl | | xU6qTtaDesFrSlQVLkZDe0vQE15gd5VE | | yWuGjDH9fyRNAlF7k7HUe4GQFHHzSh9Y | +----------------------------------+ 20 rows in set (14321 ms)
可以從返回結果看出,在相同查詢條件下未創建搜索索引時全表查詢耗時94912 ms,使用了搜索索引后查詢耗時14321 ms,時延大幅降低。
說明搜索引擎在復雜多條件的查詢下延遲更低,更適用于涉及在線查詢業務較多的場景,而計算引擎更適合做更加復雜的查詢,例如有離線分析需求的場景。