关于Lindorm Ganos
Lindorm是阿里云推出的云原生超融合多模数据库,提供了宽表、时序、搜索、文件等多种引擎。目前,Lindorm已经深度融合了由阿里云数据库产品事业部研发的时空数据库引擎Ganos(下文统称为Lindorm Ganos),可以解决海量移动对象存储、管理和查询需求,弥补了各类NoSQL在时空数据处理方面的不足。
关于Lindorm Ganos的特点与优势,可以参考《基于Lindorm Ganos的车辆实时行为分析》一文中第一部分。
应用场景
车联网领域存在大量实时写入的轨迹点数据,在数据存储到数据库之前,根据后续业务的需求可以将车辆上报的 GPS 点数据聚合成一套轨迹线数据,便于后续开展更为复杂的业务。
需求分析
在这类场景中,我们可以定期(如每小时、每天)将用户输入的 GPS 点按车辆 id 分组并按时间顺序拼接为轨迹。这样不仅可以减少数据库的写压力,而且轨迹数据在计算和分析上更为直观。
技术实现
1. 开通Lindorm Ganos服务
Lindorm Ganos时空服务是Lindorm宽表引擎和流引擎的一个组件,服务开通后仅收取Lindorm宽表引擎和流引擎费用。本文介绍通过云原生多模数据库Lindorm控制台开通Ganos时空服务的方法。
前提条件
已创建Lindorm实例并开通宽表引擎,具体操作请参见创建实例。
操作步骤
- 登录Lindorm管理控制台。
- 在页面左上角,选择实例所属的地域。
- 在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理。
- 在左侧导航栏,选择宽表引擎。
- 在Ganos时空服务页签中,单击立即开通。
2. 创建结果表
首先,通过 lindorm-cli 工具连接到宽表引擎,并创建一张围栏表和两张结果保存表,详细用法见:如何通过Lindorm-cli连接并使用宽表引擎。
3. 接入流数据
这一步通过流引擎客户端连接流引擎并写入流数据。可以通过 Kafka API 写入数据到指定的 topic 中,见通过开源Kafka客户端写入Lindorm流引擎数据,或通过开源Kafka脚本工具连接Lindorm流引擎,并写入数据。
4. 提交流引擎计算任务
这一步使用 Flink SQL 提交流引擎计算任务,读取 Kafka topic 中的数据并结合宽表数据做计算。
连接到流引擎
请参考下列链接连接到流引擎:使用客户端连接并使用Lindorm流引擎。建议在与流引擎同一个可用区的 ECS 环境下运行,运行前请将 ECS 的 IP 地址添加到访问控制白名单。请将ld-xxx替换成您的实例 ID:
./lindorm-sqlline -url jdbc:streamsql:url=http://ld-xxx-proxy-stream.lindorm.rds.aliyuncs.com:30060
创建计算任务
注意:
- Kafka的连接地址properties.bootstrap.servers,请使用 Lindorm Stream Kafka 私有网络地址;
- 宽表的连接地址seedServer,请使用 Lindorm 宽表 SQL 私有网络地址及 30020端口。
轨迹聚合计算任务
下面的计算任务将流入 Kafka 的点根据给定的时间窗口和顺序拼接为轨迹:
- 首先,加载 ganos 函数模块。
- 随后创建数据源表 tdrive、数据结果表resultAgg。
- 最后创建流任务,使用 ST_MakeLine_Agg函数将点拼接为轨迹。该函数不会对点进行排序,若要保证点的顺序,请用 ORDER BY排序。
请将ld-xxx替换成您的实例 ID:
CREATE FJOB lineAgg ( LOAD MODULE ganos; -- create stream table CREATE TABLE tdrive( cid INT, ts TIMESTAMP(0), lng DOUBLE, lat DOUBLE, WATERMARK FOR ts AS ts-INTERVAL '10' MINUTES --set watermark delay ) WITH ( 'connector'='kafka', 'topic'='tdrive', 'scan.startup.mode'='earliest-offset', 'properties.bootstrap.servers'='ld-xxx-proxy-stream.lindorm.rds.aliyuncs.com:30080', 'format'='json', 'json.ignore-parse-errors'='true' ); -- order data by timestamp CREATE VIEW orderedDrive AS SELECT * FROM tdrive ORDER BY ts; -- create result table CREATE TABLE resultAgg( cid INT, stt TIMESTAMP(0), edd TIMESTAMP(0), line STRING, PRIMARY KEY(cid,stt) NOT ENFORCED ) WITH ( 'connector'='lindorm', 'seedServer'='ld-xxx-proxy-lindorm.lindorm.rds.aliyuncs.com:30020', 'userName'='username', 'password'='password', 'tableName'='resultAgg', 'namespace'='default'); ); -- aggregate points INSERT INTO resultAgg SELECT cid, window_start AS stt, window_end AS edd, ST_AsText(ST_MakeLine_Agg(ST_MakePoint(lng,lat))) AS line FROM TABLE(TUMBLE(TABLE orderedDrive, DESCRIPTOR(ts), INTERVAL '1' HOUR)) WHERE lng IS NOT NULL AND lat IS NOT NULL AND ST_IsEmpty(ST_MakePoint(lng,lat))=false GROUP BY window_start,window_end,cid; );
如果希望输出的结果包含点的时间戳信息,可使用 LISTAGG函数拼接时间戳,具体用法如下:
INSERT INTO resultAgg SELECT cid, window_start AS startTime, window_end AS endTime, ST_AsText(ST_MakeLine_Agg(ST_MakePoint(lng,lat))) AS line, LISTAGG(CAST(ts AS VARCHAR)) AS timeseries, FROM TABLE(TUMBLE(TABLE tdrive, DESCRIPTOR(ts), INTERVAL '1' HOUR)) WHERE lng IS NOT NULL AND lat IS NOT NULL AND ST_IsEmpty(ST_MakePoint(lng,lat))=false GROUP BY window_start,window_end,cid;
5. 查看结果
在宽表中,通过 SQL 语句查看对应的计算结果,下面展示部分结果:
包含时间戳的结果如下:
将车辆 1 从 2008-02-02 到 2008-02-03 的轨迹可视化:
后续场景
在获取聚合的轨迹后,可以基于Ganos的相关能力进行一系列的后续时空数据挖掘操作。主要的应用场景有:
- 轨迹展示:轨迹存入数据库后,可以将指定车辆在指定时间段内的轨迹绘制在地图上
- 轨迹相似度分析:车队有部分车辆偏离位置,可能是驶入了错误的路线,导致物流延迟风险。可以根据多个车辆轨迹的相似情况,寻找异常轨迹,及时发现可能的风险
- 轨迹预测:根据车辆历史轨迹,可以通过相关的算法预测车辆一段时间内的行进路线
- 轨迹停留点分析:运输车辆往往需要中途休息,为了避免驾驶员开夜车可能造成的安全隐患,需要监管车辆是否存在夜间停留点(大量的轨迹没有空间位置上的移动)。如果夜间时间段内没有停留点产生,则说明驾驶员一直在开夜车,需要提醒驾驶员尽快休息。
总结
Lindorm Ganos实现了Lindorm宽表、流、计算等引擎在时空领域的打通,支持原生时空类型与多种时空算子,支持多种不同的时空索引,不仅可用于传统的周边查询,还面向了历史轨迹的查询分析、地理围栏查询、点面查询等更加复杂的业务需求。相较于传统的Geomesa、ElasticSearch等NoSQL时空方案,Ganos在多种场景下性能均有3-5倍以上的提升,同时兼容适配Flink、Spark引擎进一步降低了客户技术方案的复杂性,结合Lindorm在写入、压缩等方面的优势,Lindorm Ganos在海量时空数据管理分析领域构建出了既能满足客户功能与性能需求,又可大幅度降低存储计算成本的全新方案。