使用HetuEngine查询IoTDB时序数据
应用场景
IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB采用轻量式架构,具有高性能和丰富的功能。IoTDB数据查询及分析包括以下两种场景:
- IoTDB时序数据查询
IoTDB以时间序列为基础,提供丰富的时间序列查询语义,包含精确点查询,时间范围查询,分组查询,最新点查询等。
图1 IoTDB时序数据查询 - 跨源IT/OT数据统一分析
IoTDB可以借助HetuEngine提供的数据跨源分析能力,使用HetuEngine作为统一数据查询入口,也可以将IT数据和OT数据进行联合分析,提供复杂的IT和OT数据统一分析能力。
图2 跨源IT/OT数据统一分析使用场景如下:
- 统一SQL入口
为简化应用系统对接多系统的复杂性,可在HetuEngine添加IoTDB作为数据源,通过HetuEngine的SQL语法查询IoTDB中的数据。
- 与数据湖中的数据进行关联查询
IT数据需要与OT数据进行关联分析查询。可在HetuEngine添加IoTDB、Hive作为数据源,通过HetuEngine的SQL语法同时查询Hive、IoTDB中的数据,并将两个子查询的数据进行关联。
- 与NoSQL中的数据进行关联查询
NoSQL中的数据需要与OT数据进行关联分析查询,可在HetuEngine添加IoTDB、HBase作为数据源,通过HetuEngine的SQL语法同时查询HBase、IoTDB中的数据,并将两个子查询的数据进行关联。
- 统一SQL入口
方案架构
IoTDB套件由若干个组件构成,共同形成数据收集、数据写入、数据存储、数据查询、数据可视化、数据分析等一系列功能。
图3展示了使用IoTDB套件的全部组件形成的整体应用架构,IoTDB特指其中的时间序列数据库组件。
- 用户可以通过JDBC/Session将来自设备传感器上采集的时序数据和服务器负载、CPU内存等系统状态数据、消息队列中的时序数据、应用程序的时序数据或者其他数据库中的时序数据导入到本地或者远程的IoTDB中。用户还可以将上述数据直接写成本地(或位于HDFS上)的TsFile文件。
- 用户可以将TsFile文件写入到HDFS上,进而满足Hadoop、Flink等数据处理任务的访问。
- 对于写入到HDFS或者本地的TsFile文件,可以利用TsFile-Hadoop或TsFile-Flink连接器,允许Hadoop或Flink进行数据处理。
- 对于分析的结果,可以写回成TsFile文件。
- IoTDB和TsFile还提供了相应的客户端工具,满足用户以SQL形式、脚本形式和图形形式写入和查看数据的各种需求。
操作流程
- 步骤1:创建MRS集群:创建一个包含有HBase、HetuEngine、Hive、IoTDB组件的MRS集群。
- 步骤2:创建集群用户:创建具有HBase、HetuEngine、Hive、IoTDB管理员权限的用户。
- 步骤3:添加HetuEngine数据源:在HSConsole WebUI页面添加HBase和IoTDB数据源。
- 步骤4:准备数据:创建用于查询的HBase、Hive和IoTDB表并插入数据。
- 步骤6:在HetuEngine客户端跨源查询表数据:在HetuEngine客户端查询表数据。
步骤1:创建MRS集群
- 创建一个包含有HBase、HetuEngine、Hive、IoTDB组件的MRS集群,详情请参见购买自定义集群。
本文以自定义购买的MRS 3.2.0-LTS.1版本的集群为例,集群已开启Kerberos认证。
- 集群购买成功后,在MRS集群的任一节点内,安装集群客户端,具体操作可参考安装并使用集群客户端。
例如客户端安装目录为“/opt/client”。
- 关闭IoTDB组件的SSL配置。
- 登录集群Manager界面,选择“集群 > 服务 > IoTDB > 配置”,搜索“SSL_ENABLE”,如果该参数值为“true”,需修改为“false”并单击“保存”,关闭SSL配置。
- 修改IoTDB客户端对应的参数关闭SSL配置:
cd 客户端安装目录/IoTDB/iotdb/conf
vi iotdb-client.env
修改“iotdb_ssl_enable”参数值为“false”,保存并退出。
- 在Manager界面,选择“集群 > 服务 > IoTDB”,选择页面右上角的“更多 > 重启服务”,输入当前用户密码并单击“确定”使配置生效。
步骤2:创建集群用户
对于开启Kerberos认证的MRS集群,需提前准备具有相关组件操作权限的用户用于安全认证和创建HetuEngine数据源,本示例以创建对应组件的管理员用户为例进行演示,请根据实际需求创建相关权限的用户。
- 登录FusionInsight Manager,选择“系统 > 权限 > 角色 > 添加角色”,配置以下参数并单击“确定”创建HBase管理员角色:
- 角色名称:输入角色名称,例如“hbaserole”。
- 配置资源权限:在配置资源权限列表中选择“待操作的集群名称 > HBase”,勾选“HBase管理员权限”。
- 选择“用户 > 添加用户”,配置以下参数并单击“确定”创建用户:
- 用户名:填写“用户名”,例如“test”。
- 用户类型:选择“人机”。
- 填写“密码”和“确认新密码”。
- 用户组:单击“添加”,为该用户添加“hive”、“hetuadmin”、“iotdbgroup”“hadoop”、“hetuuser”、“yarnviewgroup”用户组。
- 主组:在下拉列表中选择“hive”作为主组。
- 角色:单击“添加”,为该用户绑定“default”、“System_administrator”以及新创建的HBase管理员角色。
- 使用新创建的test用户重新登录FusionInsight Manager,修改该用户的初始密码。
步骤3:添加HetuEngine数据源
本章节以使用HetuEngine数据源实现关联查询同一集群的HBase、Hive、IoTDB数据为例进行演示,Hive数据源已默认对接。
添加IoTDB数据源。
- 使用新创建的具有HetuEngine管理员权限的用户登录FusionInsight Manager,选择“集群 > 服务 > HetuEngine”,进入HetuEngine服务页面。
- 在概览页签下的“基本信息”区域单击“HSConsole WebUI”后的链接,进入HSConsole界面。
- 选择“数据源”,单击“添加数据源”,在“添加数据源”页面填写参数。
- 配置“基本配置”,填写数据源名称,例如“iotdb”,选择数据源类型“JDBC > IoTDB”,“驱动”默认为“iotdb”。
- 配置“IoTDB配置”的以下参数:
- JDBC URL:连接IoTDB的JDBC URL地址,格式为“jdbc:iotdb://IoTDBServer业务IP1,IoTDBServer业务IP2:端口号”。
IoTDBServer业务IP地址可在Manager界面,选择“集群 > 服务 > IoTDB > 实例”,查看IoTDBServer的业务IP。端口号可单击“配置”,搜索并查看“IOTDB_SERVER_RPC_PORT”的值,默认为“22260”。
- 用户名:连接IoTDB数据源的IoTDB用户名。当IoTDB所在集群为非安全模式时,需使用IoTDB默认用户“root”。
- 密码:连接IoTDB数据源的IoTDB用户密码。当IoTDB所在集群为非安全模式时,需使用IoTDB默认用户“root”的密码。
- 开启ssl:选择“否”。
- JDBC URL:连接IoTDB的JDBC URL地址,格式为“jdbc:iotdb://IoTDBServer业务IP1,IoTDBServer业务IP2:端口号”。
- (可选)根据需求可添加自定义配置。
- 单击“确定”创建IoTDB数据。
添加HBase数据源。
- 获取HBase数据源的“hbase-site.xml”、“hdfs-site.xml”和“core-site.xml”配置文件。
- 登录FusionInsight Manager页面,在“主页”右上方单击“下载客户端”,根据界面提示下载“完整客户端”文件。
- 将下载的客户端文件压缩包解压,获取“FusionInsight_Cluster_1_Services_ClientConfig/HBase/config”路径下的“hbase-site.xml”、“core-site.xml”和“hdfs-site.xml”文件。
- 获取HBase数据源的代理用户的“user.keytab”和“krb5.conf”文件。
- 在FusionInsight Manager页面,选择“系统 > 权限 > 用户”。
- 选择对应的HBase数据源用户,在“操作”列中选择“更多 > 下载认证凭据”。
- 从下载的文件中解压获取“user.keytab”和“krb5.conf”文件。
数据源的代理用户需要具有对HBase的相关操作权限。
- 使用HetuEngine管理员用户登录FusionInsight Manager,选择“集群 > 服务 > HetuEngine”,进入HetuEngine服务页面。
- 在概览页签下的“基本信息”区域,单击“HSConsole WebUI”后的链接,进入HSConsole界面。
- 选择“数据源”,单击“添加数据源”。在“添加数据源”页面填写参数。
- 配置“基本配置”,填写数据源名称,例如“hbase”,选择数据源类型“HBase”,驱动默认为“hbase-connector”。
- 配置“HBase配置”的以下参数:
- ZooKeeper Quorum地址:该数据源ZooKeeper服务所有quorumpeer实例业务IP。可登录FusionInsight Manager,选择“集群 > 服务 > ZooKeeper > 实例”,查看所有quorumpeer实例所在主机业务IP地址。
- ZooKeeper客户端端口号:表示ZooKeeper客户端端口号。可登录FusionInsight Manager,选择“集群 > 服务 > ZooKeeper”,在“配置”页签查看“clientPort”的值。
- HBase RPC通信保护:根据步骤 4获取的“hbase-site.xml”里配置项“hbase.rpc.protection”的值进行选择:
- 为“authentication”时选择“否”。
- 为“privacy”时选择“是”。
- Principal:值为步骤 5中获取的“user.keytab”文件所属的用户。
- keytab文件:安全认证的密钥,在本地选择步骤 5获取的“user.keytab”文件。
- krb5文件:Kerberos认证用到的配置文件,在本地选择步骤 5获取的“krb5.conf”文件。
- hbase-site文件:连接HDFS时,需要的配置文件。在本地选择步骤 4获取的“hbase-site.xml”文件。
- core-site文件:连接HDFS时需要用到的配置,在本地选择步骤 4获取的“core-site.xml”文件。
- hdfs-site文件:连接HDFS时需要用到的配置,在本地选择步骤 4获取的“hdfs-site.xml”文件。
图4 添加HBase数据源 - 单击“确定”创建HBase数据源。
验证数据源连接是否成功。
- 登录集群客户端所在节点,执行以下命令,切换到客户端安装目录并认证用户。
cd /opt/client
source bigdata_env
kinit HetuEngine组件操作用户
- 执行以下命令,登录数据源的catalog。
hetu-cli --catalog 数据源名称 --schema 数据库名
例如执行以下命令连接HBase数据源:
hetu-cli --catalog hbase --schema default
- 执行以下命令,可正常查看数据库表信息或不报错即表示连接成功。
show tables;
步骤4:准备数据
准备IoTDB数据。
- 以客户端安装用户登录安装客户端的节点,执行以下命令配置环境变量并认证用户:
cd 客户端安装目录
source bigdata_env
kinit 组件业务用户
- 执行以下命令登录IoTDB客户端:
cd IoTDB/iotdb/sbin
./start-cli.sh -h IoTDBserver实例业务IP地址 -p IoTDBserver RPC端口
运行该命令后,根据实际需求指定业务用户名:
- IoTDBServer实例节点IP地址可在Manager界面,选择“集群 > 服务 > IoTDB > 实例”查看。
- IoTDBServer RPC端口可在参数“IOTDB_SERVER_RPC_PORT”中自行配置。默认端口如下:
- 开源端口默认值为:6667
- 定制端口默认值为:22260
端口定制/开源区分:创建LTS版本类型集群时,可以选择“组件端口”为“开源”或是“定制”,选择“开源”使用开源端口,选择“定制”使用定制端口。
- 创建IoTDB数据库并插入数据,例如:
- 创建数据库:
create database root.c1.r1.s1.d1; create database root.c1.r1.s1.d2;
- 创建时间序列:
create timeseries root.c1.r1.s1.d1.value WITH DATATYPE=FLOAT, ENCODING=PLAIN; create timeseries root.c1.r1.s1.d1.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN; create timeseries root.c1.r1.s1.d1.temperature WITH DATATYPE=FLOAT, ENCODING=PLAIN; create timeseries root.c1.r1.s1.d1.humidity WITH DATATYPE=FLOAT, ENCODING=PLAIN;
- 创建带有标签的时间序列(后续可以通过标签与其他数据源进行关联查询):
create timeseries root.c1.r1.s1.d1.t3 WITH DATATYPE=TEXT, ENCODING=PLAIN tags(tag1=d00000001);
- 插入数据至时间序列中:
insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(20,false,15,20); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(20,true,17,21); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(20,false,19,22); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(20,true,20,23); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(25,false,20,24); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(25,true,19,25); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(25,false,18,26); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(25,true,16,27); insert into root.c1.r1.s1.d1(value,status,temperature,humidity) values(26,true,16,27);
- 执行以下命令查看插入的数据:
select * from root.c1.r1.s1.*;
图5 查看表数据 - 数据插入成功后,可直接在IoTDB客户端执行查询操作,也可参考步骤6:在HetuEngine客户端跨源查询表数据在HetuEngine客户端查询IoTDB表数据。
- 根据时间精确查询单个设备的温度:
select temperature from root.c1.r1.s1.d1 where time=2023-11-28T14:38:53.318+08:00;
图6 查询单个设备的温度 - 根据时间精确查询单个设备所有测量值:
select * from root.c1.r1.s1.d1 where time=2023-11-28T14:38:53.318+08:00;
图7 查询单个设备的所有测量值 - 根据时间精确查询所有设备的所有测量值:
select * from root.c1.r1.s1.* where time=2023-11-28T14:38:53.318+08:00;
图8 查询所有设备的所有测量值 - 根据设备健康状态查询该设备的所有测量值:
select * from root.c1.r1.s1.d1 where status=false;
图9 根据设备健康状态查询所有测量值 - 根据时间范围查询多个设备的所有测量值:
select * from root.c1.r1.s1.* where time>2023-11-28T14:35:47.181+08:00 and time<2023-11-28T14:38:53.318+08:00;
图10 根据时间范围查询所有测量值 - 根据时间范围查询某设备的最大湿度及测量值上传次数(聚合查询):
select count(humidity),max_value(humidity) from root.c1.r1.s1.d1 where time>2023-11-28T14:35:47.181+08:00 and time<2023-11-28T14:38:53.318+08:00;
图11 根据时间范围进行聚合查询 - 查询某设备在指定时间内且电量使用值在20%~30%之间,设备电量使用的最大值:
select max_value(value) from root.c1.r1.s1.d1 where time>2023-11-28T14:35:47.181+08:00 and time<2023-11-28T14:38:53.318+08:00 and value>20 and value<30;
图12 根据时间和数值范围进行聚合查询
- 根据时间精确查询单个设备的温度:
- 执行以下命令,退出IoTDB客户端。
quit;
- 创建数据库:
准备Hive数据。
- 执行以下命令登录Hive客户端:
beeline
- 执行以下命令创建Hive表并插入数据:
- 创建Hive表,Hive表结构如表1所示:
create table device_hive(D_ID int,D_NAME string,D_DATA data,D_PRODUCT string,D_LIFECYCLE int,D_STATUS string,D_REGION string,D_TYPE string);
- 向Hive表中插入数据:
insert into table device_hive(D_ID,D_NAME,D_DATA,D_PRODUCT,D_LIFECYCLE,D_STATUS,D_REGION,D_TYPE) values("ID1","device1","2024-10-25",“a”,"在保质期","工作中","region1","传感器");
- 执行以下命令,退出Hive客户端。
!q
- 创建Hive表,Hive表结构如表1所示:
准备HBase数据。
- 执行以下命令登录HBase客户端:
hbase shell
- 执行以下命令创建HBase表并插入数据:
- 创建HBase表,HBase表结构如表2所示:
create 'device_hbase','f1'
- 向HBase表中插入数据:
put 'device_hbase', '001', 'f1:A_ID', '账户1' put 'device_hbase', '001', 'f1:D_ID', 'd00000001' put 'device_hbase', '001', 'f1:A_NAME', '开户名1' put 'device_hbase', '001', 'f1:A_ADDRESS', '开户地址1' put 'device_hbase', '001', 'f1:A_CITY', '开户城市1' put 'device_hbase', '001', 'f1:A_NATION', '开户区域1' put 'device_hbase', '001', 'f1:A_Date', '开户时间1' put 'device_hbase', '001', 'f1:A_PHONE', '联系电话1' put 'device_hbase', '002', 'A_ID', '账户2' put 'device_hbase', '002', 'D_ID', 'd00000002' put 'device_hbase', '002', 'A_NAME', '开户名2' put 'device_hbase', '002', 'A_ADDRESS', '开户地址2' put 'device_hbase', '002', 'A_CITY', '开户城市2' put 'device_hbase', '002', 'A_NATION', '开户区域2' put 'device_hbase', '002', 'A_Date', '开户时间2' put 'device_hbase', '002', 'A_PHONE', '联系电话2'
- 执行以下命令,退出HBase客户端。
quit;
- 创建HBase表,HBase表结构如表2所示:
- 执行以下命令在HetuEngine客户端为已创建的HBase表创建映射表:
- 执行以下命令,登录数据源的catalog:
hetu-cli --catalog 数据源名称 --schema 数据库名
例如执行以下命令:
hetu-cli --catalog hbase --schema default
- 创建结构化映射表,字段类型要大于HBase的字段类型,例如:
CREATE TABLE default.device_hbase ( rowId VARCHAR, aid VARCHAR, did VARCHAR, aname VARCHAR, aaddress VARCHAR, acity VARCHAR, anation VARCHAR, adate VARCHAR, aphone VARCHAR ) WITH ( column_mapping = 'aid:f1:A_ID,did:f1:D_ID,aname:f2:A_NAME,aaddress:f2:A_ADDRESS,acity:f2:A_CITY,anation:f3:A_NATION,adate:f3:A_Date,aphone:f3:A_PHONE', row_id = 'rowId', hbase_table_name = 'default.device_hbase', external = true );
- 执行以下命令,登录数据源的catalog:
步骤6:在HetuEngine客户端跨源查询表数据
- 为执行数据查询的用户赋予Ranger相关权限。
- 使用Ranger管理员用户rangeradmin登录Ranger管理页面。
- 在首页中单击“TRINO”区域的“HetuEngine”。
- 在“Access”页签单击“all - catalog, sessionproperty”所在行的编辑按钮进入编辑页面,在“Allow Conditions”区域新增策略允许条件,“Select User”列选择已创建的用户,例如“test”,“Permissions”列选择“Alter”权限,单击“Save”保存。
- 单击“all - systemproperty”所在行的编辑按钮进入编辑页面,在“Allow Conditions”区域新增策略允许条件,“Select User”列选择已创建的用户,例如“test”,“Permissions”列选择“Alter”权限,单击“Save”保存。
- 登录集群客户端所在节点,执行以下命令,切换到客户端安装目录并认证用户。
cd /opt/client
source bigdata_env
kinit HetuEngine组件操作用户
- 执行以下命令,登录IoTDB数据源的catalog。
hetu-cli --catalog 数据源名称
例如执行以下命令:
hetu-cli --catalog iotdb
- 执行以下命令,修改session配置:
set session implicit_conversion=true;
- 数据查询。
- 跨源关联查询IoTDB、HBase、Hive数据。
- 关联查询IoTDB和Hive表数据:
select * from iotdb."root.c1.r1.s1.*".value t1 join hive.default.device_hive d2 on t1.tag1=d2.d_id where t1.value>25;
例如,关联查询的数据如下:
图13 关联查询IoTDB和Hive表数据 - 关联查询IoTDB和HBase表数据:
select * from iotdb."root.c1.r1.s1.*".value t1 join hbase.default.device_hbase d2 on t1.tag1=d2.did where t1.value>25;
例如,关联查询的数据如下:
图14 关联查询IoTDB和HBase表数据 - 关联查询IoTDB和Hive+HBase表数据:
select * from iotdb."root.c1.r1.s1.*".status t1 join hive.default.device_hive d2 on t1.tag1=d2.d_id join hbase.default.device_hbase d3 on t1.tag1=d3.did where t1.value=false;
例如,关联查询的数据如下:
图15 关联查询IoTDB和Hive+HBase表数据
本示例中的关联查询的关键key是“D_ID”,在IoTDB中是通过tag实现的。例如,d1设备的所有测量值设置的标签为tag1=d00000001,d2设备的所有测量值设置的标签为tag1=d00000002,依次类推。
- 关联查询IoTDB和Hive表数据:
- 在HetuEngine客户端查询IoTDB表数据。
show databases;
执行以下命令切换至需要查询数据的Schema中:
use "root.c1.r1.s1.d1";
查询示例如下:- 根据时间精确查询单个设备的温度:
select value from "root.c1.r1.s1.d1".temperature where time='2023-11-28 06:38:28.379';
图16 查询单个设备的温度 - 根据时间范围查询单个设备的所有测量值:
select * from "root.c1.r1.s1.d1"."*" where time>'2023-11-28 06:35:47.181' and time<'2023-11-29 11:58:49.602';
图17 查询单个设备的所有测量值 - 根据时间查询所有设备所有测量值:
select * from "root.c1.r1.s1.*"."*" where time='2023-11-28 06:38:28.379';
图18 查询所有设备的所有测量值 - 查询某个设备处于不健康状态的时间点:
select * from "root.c1.r1.s1.d1".status where status=false;
图19 查询设备处于不健康状态的时间点 - 聚合查询。
- 根据时间精确查询单个设备的温度:
- 跨源关联查询IoTDB、HBase、Hive数据。