23,622
社区成员
前言
hi ,上一次我们已经在Kuiper创建了规则,这次装好插件将数据持久化到TDengine
TDengine是什么
TDengine是涛思数据专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度,且核心代码,包括集群功能全部开源。官网地址: https://www.taosdata.com/cn/ ; GitHub地址: https://github.com/taosdata/TDengine
TDengine中的超级表是什么,有什么用?跟传统的查询有什么不同?
现在我们来想象一个场景,如果一间房子里面有许多温湿度计。每一个温湿度计有一张表,那怎么知道哪一张表是哪个设备呢?如果要查询某个区域的温湿度计,一张表一张表的查好像有点麻烦。TDengine的超级表就是用来解决这个问题的。我们下面用一个房子有若干个温湿度计分布在卧室、厕所、阳台这些地方。
创建超级表&使用超级表做模板建表
taos> create stable sensordata (time timestamp,temperature float,humidity float) tags (location binary(64));
Query OK, 0 of 0 row(s) in database (0.002387s)
taos> create table t1 using sensordata tags("bedroom");
Query OK, 0 of 0 row(s) in database (0.009156s)
taos> create table t2 using sensordata tags("bedroom");
Query OK, 0 of 0 row(s) in database (0.003948s)
taos> create table t3 using sensordata tags("balcony");
Query OK, 0 of 0 row(s) in database (0.002927s)
taos> create table t4 using sensordata tags("toilet");
Query OK, 0 of 0 row(s) in database (0.002632s)
创建的超级表里有字段时间戳、温度和湿度。标签是地点。我们用超级表sensordata作为模板创建表t1234,并写上不同的标签。
向几张表中添加数据。
insert into t1 values(now,27.1,70.1);
insert into t2 values(now,22.1,67.1);
insert into t3 values(now,23.1,64.1);
insert into t4 values(now,24.1,64.1);
查询超级表的数据
taos> select * from sensordata;
time | temperature | humidity | location |
=========================================================================================================
2021-09-01 03:52:59.525 | 27.10000 | 29.00000 | bedroom |
2021-09-01 03:53:06.922 | 27.10000 | 70.10000 | bedroom |
2021-09-01 03:53:07.846 | 27.10000 | 70.10000 | bedroom |
2021-09-01 03:53:08.497 | 27.10000 | 70.10000 | bedroom |
2021-09-01 03:53:08.981 | 27.10000 | 70.10000 | bedroom |
2021-09-01 03:53:10.409 | 27.10000 | 70.10000 | bedroom |
2021-09-01 03:53:22.031 | 22.10000 | 67.10000 | bedroom |
2021-09-01 03:53:23.280 | 22.10000 | 67.10000 | bedroom |
2021-09-01 03:53:23.729 | 22.10000 | 67.10000 | bedroom |
2021-09-01 03:53:24.156 | 22.10000 | 67.10000 | bedroom |
2021-09-01 03:53:24.580 | 22.10000 | 67.10000 | bedroom |
2021-09-01 03:53:25.380 | 22.10000 | 67.10000 | bedroom |
2021-09-01 03:55:35.627 | 22.10000 | 67.10000 | balcony |
2021-09-01 03:55:36.131 | 22.10000 | 67.10000 | balcony |
2021-09-01 03:55:36.593 | 22.10000 | 67.10000 | balcony |
2021-09-01 03:55:37.086 | 22.10000 | 67.10000 | balcony |
2021-09-01 03:55:37.683 | 22.10000 | 67.10000 | balcony |
2021-09-01 03:55:39.144 | 22.10000 | 67.10000 | balcony |
2021-09-01 03:55:47.134 | 24.10000 | 64.10000 | toilet |
2021-09-01 03:55:47.650 | 24.10000 | 64.10000 | toilet |
2021-09-01 03:55:48.023 | 24.10000 | 64.10000 | toilet |
2021-09-01 03:55:48.327 | 24.10000 | 64.10000 | toilet |
2021-09-01 03:55:48.599 | 24.10000 | 64.10000 | toilet |
2021-09-01 03:55:49.114 | 24.10000 | 64.10000 | toilet |
Query OK, 24 row(s) in set (0.010163s)
STable多表聚合
按照标签聚合查询——我们要查询卧室里最高的温度和最低的湿度。可以用标签聚合查询
taos> select MAX(temperature),MIN(humidity) from sensordata where location='bedroom' group by location;
max(temperature) | min(humidity) | location |
===============================================================================
27.10000 | 29.00000 | bedroom |
Query OK, 1 row(s) in set (0.004057s)
按时间周期聚合查询——查询一天之内卧室的平均温度。
taos> select AVG(temperature) from sensordata where location='bedroom' and time >=now-1d group by location;
avg(temperature) | location |
=============================================================
24.600000381 | bedroom |
Query OK, 1 row(s) in set (0.002941s)
kuiper和TDengine的插件
一般来说发送数据到EdgeX,最后将发送的数据持久化,一般有几种导出的形式。例如听过REST导出,或者MQTT导出,如果选择MQTT导出则需要一个MQTT Broker,在MQTT Broker接收到数据之后再制定规则将数据持久化发送到时序数据库。而使用kuiper的TDengine插件则不需要经过这种过程,可以通过kuiper制定规则,将数据导出到TDengine中去。
两种安装方式
自动安装
curl -d "{\"name\":\"tdengine\",\"file\":\"https://packages.emqx.io/kuiper-plugins/1.2.1/debian/sinks/tdengine_amd64.zip\",\"shellParas\": [\"2.0.20.10\"]}" http://127.0.0.1:59720/plugins/sinks
kuiper插件的下载地址已经改变,TDengine client的下载地址也已经发生改变
https://packages.emqx.io/kuiper-plugins/1.X.X/debian/sinks/tdengine_amd64.zip
之前我使用自动安装的,一条指令就可以完成了。在输入CURL指令的时候要指定TDengine的版本。在本次demo中使用的是2.0.20.10版本。但现在问题就在于.. 不知道为啥会报错。这时候我们可以进行手动安装。
手动安装
手动安装的大致步骤是将TDengine的插件下载下来并解压,并将解压出来的so文件移动到ekuiper容器中的kuiper/plugins/sinks里面。完成这一步之后再安装相应的TDengine版本。(执行install.sh脚本安装TDengine客户端)
因为在docker容器内部执行一些操作不太方便(如缺少unzip,权限问题等),因为我们先将TDengine的zip包下载下来并解压。解压出来之后是一个后缀为.so
的文件
之后将文件复制到容器内部中。docker cp tdengine@1.2.1.so edgex-kuiper:/kuiper/plugins/sinks
下载TDengine客户端,手动下载https://raw.githubusercontent.com/lf-edge/ekuiper/master/extensions/sinks/tdengine/install.sh。然后在容器内执行 sh install.sh 2.0.20.10
这里有一个小细节,如果一直用的是官方提供的docker-compose.yml镜像文件,可能会导致不能在容器的根目录执行任何东西。于是要在docker-compose.yml那份文件中找到ekuiper,然后将read_only=true
注释掉。
Install.sh文件可能会因为权限不够而不能执行,所以要赋予其权限chmod 777 install.sh
验证安装是否成功; 执行 curl http://127.0.0.1:59720/plugins/sinks/tdengine
root@u20:/home/TDengineplugin# wget https://packages.emqx.io/kuiper-plugins/1.2.1/debian/sinks/tdengine_amd64.zip
--2021-08-25 19:18:21-- https://packages.emqx.io/kuiper-plugins/1.2.1/debian/sinks/tdengine_amd64.zip
Resolving packages.emqx.io (packages.emqx.io)... 18.65.159.105, 18.65.159.95, 18.65.159.25, ...
Connecting to packages.emqx.io (packages.emqx.io)|18.65.159.105|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4178611 (4.0M) [application/zip]
Saving to: ‘tdengine_amd64.zip’
tdengine_amd64.zip 100%[======================================================================================================================================>] 3.98M 30.4KB/s in 3m 26s
2021-08-25 19:21:48 (19.8 KB/s) - ‘tdengine_amd64.zip’ saved [4178611/4178611]
root@u20:/home/TDengineplugin# unzip tdengine_amd64.zip
Archive: tdengine_amd64.zip
inflating: tdengine@1.2.1.so
root@u20:/home/TDengineplugin# curl http://127.0.0.1:59720/plugins/sinks/tdengine
{"name":"tdengine","version":"1.2.1"}
然后我们通过Event事件向EdgeX发送数据。上面我们已经创建好规则了,所以发送数据之后kuiper会匹配到温湿度数据,然后将数据持久化到TDengine
7. 查询TDengine,我们回发现刚才发送的数据已经有了
taos> select * from sensordata where time > now - 10m;
time | temperature | humidity |
========================================================================
2021-08-26 02:40:26.864 | 12.20000 | 25.10000 |
Query OK, 1 row(s) in set (0.004565s)
写在最后
连着上一篇笔记,我们的将 发送事件 --> EdgeX --> rule-engine (kuiper)--> TDengine这条路走了一遍,但实际上应用起来还没完。下一篇笔记我们介绍一下TDengine跟Grafana图表整合起来能怎用吧。如果你觉得文章对你有点帮助,或者觉得写得还可以,欢迎关注公众号 ProgrammerHe 。写得不好/不对的地方烦请指出,谢谢。