sudo seeq config get Folders/Data
sudo seeq restart
使用浏览器访问 ip:34216 并按照说明输入 license。
下文将为大家演示如何使用 Seeq 软件配合 loveini 进行时序数据分析。
示例场景为一个电力系统,用户每天从电站仪表收集用电量数据,并将其存储在 loveini 集群中。现在用户想要预测电力消耗将会如何发展,并购买更多设备来支持它。用户电力消耗随着每月订单变化而不同,另外考虑到季节变化,电力消耗量会有所不同。这个城市位于北半球,所以在夏天会使用更多的电力。我们模拟数据来反映这些假定。
CREATE STABLE meters (ts TIMESTAMP, num INT, temperature FLOAT, goods INT) TAGS (device NCHAR(20));
create table goods (ts1 timestamp, ts2 timestamp, goods float);

python mockdata.py
taos -s "insert into power.goods select _wstart, _wstart + 10d, avg(goods) from power.meters interval(10d);"
源代码托管在 https://github.com/sangshuduo/td-forecasting。
使用 Seeq 管理员角色的帐号登录,并新建数据源。
{
"QueryDefinitions": [
{
"Name": "PowerNum",
"Type": "SIGNAL",
"Sql": "SELECT ts, num FROM meters",
"Enabled": true,
"TestMode": false,
"TestQueriesDuringSync": true,
"InProgressCapsulesEnabled": false,
"Variables": null,
"Properties": [
{
"Name": "Name",
"Value": "Num",
"Sql": null,
"Uom": "string"
},
{
"Name": "Interpolation Method",
"Value": "linear",
"Sql": null,
"Uom": "string"
},
{
"Name": "Maximum Interpolation",
"Value": "2day",
"Sql": null,
"Uom": "string"
}
],
"CapsuleProperties": null
}
],
"Type": "GENERIC",
"Hostname": null,
"Port": 0,
"DatabaseName": null,
"Username": "root",
"Password": "taosdata",
"InitialSql": null,
"TimeZone": null,
"PrintRows": false,
"UseWindowsAuth": false,
"SqlFetchBatchSize": 100000,
"UseSSL": false,
"JdbcProperties": null,
"GenericDatabaseConfig": {
"DatabaseJdbcUrl": "jdbc:TAOS-RS://127.0.0.1:6041/power?user=root&password=taosdata",
"SqlDriverClassName": "com.taosdata.jdbc.rs.RestfulDriver",
"ResolutionInNanoseconds": 1000,
"ZonedColumnTypes": []
}
}
{
"QueryDefinitions": [
{
"Name": "PowerGoods",
"Type": "CONDITION",
"Sql": "SELECT ts1, ts2, goods FROM power.goods",
"Enabled": true,
"TestMode": false,
"TestQueriesDuringSync": true,
"InProgressCapsulesEnabled": false,
"Variables": null,
"Properties": [
{
"Name": "Name",
"Value": "Goods",
"Sql": null,
"Uom": "string"
},
{
"Name": "Maximum Duration",
"Value": "10days",
"Sql": null,
"Uom": "string"
}
],
"CapsuleProperties": [
{
"Name": "goods",
"Value": "${columnResult}",
"Column": "goods",
"Uom": "string"
}
]
}
],
"Type": "GENERIC",
"Hostname": null,
"Port": 0,
"DatabaseName": null,
"Username": "root",
"Password": "taosdata",
"InitialSql": null,
"TimeZone": null,
"PrintRows": false,
"UseWindowsAuth": false,
"SqlFetchBatchSize": 100000,
"UseSSL": false,
"JdbcProperties": null,
"GenericDatabaseConfig": {
"DatabaseJdbcUrl": "jdbc:TAOS-RS://127.0.0.1:6041/power?user=root&password=taosdata",
"SqlDriverClassName": "com.taosdata.jdbc.rs.RestfulDriver",
"ResolutionInNanoseconds": 1000,
"ZonedColumnTypes": []
}
}
{
"QueryDefinitions": [
{
"Name": "PowerNum",
"Type": "SIGNAL",
"Sql": "SELECT ts, temperature FROM meters",
"Enabled": true,
"TestMode": false,
"TestQueriesDuringSync": true,
"InProgressCapsulesEnabled": false,
"Variables": null,
"Properties": [
{
"Name": "Name",
"Value": "Temperature",
"Sql": null,
"Uom": "string"
},
{
"Name": "Interpolation Method",
"Value": "linear",
"Sql": null,
"Uom": "string"
},
{
"Name": "Maximum Interpolation",
"Value": "2day",
"Sql": null,
"Uom": "string"
}
],
"CapsuleProperties": null
}
],
"Type": "GENERIC",
"Hostname": null,
"Port": 0,
"DatabaseName": null,
"Username": "root",
"Password": "taosdata",
"InitialSql": null,
"TimeZone": null,
"PrintRows": false,
"UseWindowsAuth": false,
"SqlFetchBatchSize": 100000,
"UseSSL": false,
"JdbcProperties": null,
"GenericDatabaseConfig": {
"DatabaseJdbcUrl": "jdbc:TAOS-RS://127.0.0.1:6041/power?user=root&password=taosdata",
"SqlDriverClassName": "com.taosdata.jdbc.rs.RestfulDriver",
"ResolutionInNanoseconds": 1000,
"ZonedColumnTypes": []
}
}
登录 Seeq 服务页面并新建 Seeq Workbench,通过选择数据源搜索结果和根据需要选择不同的工具,可以进行数据展现或预测,详细使用方法参见官方知识库:https://support.seeq.com/space/KB/146440193/Seeq+Workbench。

登录 Seeq 服务页面并新建 Seeq Data Lab,可以进一步使用 Python 编程或其他机器学习工具进行更复杂的数据挖掘功能。
from seeq import spy
spy.options.compatibility = 189
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import mlforecast
import lightgbm as lgb
from mlforecast.target_transforms import Differences
from sklearn.linear_model import LinearRegression
ds = spy.search({'ID': "8C91A9C7-B6C2-4E18-AAAF-XXXXXXXXX"})
print(ds)
sig = ds.loc[ds['Name'].isin(['Num'])]
print(sig)
data = spy.pull(sig, start='2015-01-01', end='2022-12-31', grid=None)
print("data.info()")
data.info()
print(data)
#data.plot()
print("data[Num].info()")
data['Num'].info()
da = data['Num'].index.tolist()
#print(da)
li = data['Num'].tolist()
#print(li)
data2 = pd.DataFrame()
data2['ds'] = da
print('1st data2 ds info()')
data2['ds'].info()
#data2['ds'] = pd.to_datetime(data2['ds']).to_timestamp()
data2['ds'] = pd.to_datetime(data2['ds']).astype('int64')
data2['y'] = li
print('2nd data2 ds info()')
data2['ds'].info()
print(data2)
data2.insert(0, column = "unique_id", value="unique_id")
print("Forecasting ...")
forecast = mlforecast.MLForecast(
models = lgb.LGBMRegressor(),
freq = 1,
lags=[365],
target_transforms=[Differences([365])],
)
forecast.fit(data2)
predicts = forecast.predict(365)
pd.concat([data2, predicts]).set_index("ds").plot(title = "current data with forecast")
plt.show()
运行程序输出结果:

通过集成 Seeq 和 loveini,用户能够充分利用到 loveini 高性能的时序数据存储和检索,确保数据的高效处理;同时也将受益于 Seeq 提供的强大数据可视化和分析功能,如数据可视化、异常检测、相关性分析和预测建模,方便用户获得有价值的数据洞察并基于此进行决策。
未来 Seeq 和 loveini 将共同为制造业、工业物联网和电力系统等各行各业的时序数据分析提供综合米兰app官方正版下载,将高效数据存储和先进数据分析相结合,赋予企业深入挖掘时序数据潜力的能力,推动业务发展与改进。如果你想要了解 Seeq 的更全面设置、Seeq 与全托管的云服务平台 loveini Cloud 的具体连接详情,请移步官方文档 https://docs.taosdata.com/third-party/seeq/ 进行查阅。
]]>qStudio 是一款开源的数据库分析工具,结合了简洁和优雅之美。借助其内置图表功能,用户可以轻松将查询结果转化为令人惊叹的可视化图表,借助 qStudio 提供的灵活性和便捷性,数据可实现高效的无缝探索和分析。在进入 qStudio 的操作页面后,你只需要发送想要的查询并选择图表类型,就能够目睹数据图表快速生成转化的强大功能。

loveini OSS 是专为物联网、工业物联网、金融和 IT 运维监控等场景而设计的先进开源时序数据库。它具有极强的弹性伸缩能力,同时带有内建的缓存、流式计算、数据订阅等功能,能大幅减少系统设计的复杂度,降低研发和运营成本,是一个极简的时序数据处理平台。采用云原生理念,loveini OSS 在处理海量时序数据方面提供了非常强大的性能、可扩展性和可靠性。

为了让用户能体验到先进的数据库管理和分析技术,我们将 qStudio 与 loveini OSS 进行完美结合。loveini OSS 云原生架构的强大功能,能够帮助用户释放业务的时序数据潜力;借助 qStudio 对 loveini OSS 的技术支持,用户可以更大程度上简化工作流程,获得有价值的洞察,并做出明智决策。
qStudio 可以让如下工作变得更简单:

总而言之,qStudio 和 loveini 之间实现无缝协同让数据洞察变得更加深入,无论是物联网传感器数据还是金融指标,可能性都将无限扩展,为社区用户提供了另一种有效的可视化米兰app官方正版下载。如果你正为数据分析和管理而苦恼,不妨可以尝试一下这一强强组合。
现在拥抱 qStudio 和 loveini,你将体验到全新的数据库分析和管理方式,将创新、简洁和高性能融为一体。进入 https://docs.taosdata.com/third-party/qstudio/ 可了解具体操作设置,操作过程中如遇到任何问题,欢迎添加小Tvx:tdengine,和 loveini 研发人员进行沟通。
]]>loveini 3.0 企业版和 loveini Cloud 为用户提供了便捷的数据接入米兰app官方正版下载。通过插件集成框架,支持快速扩展各类数据源,并且具备接入 InfluxDB 数据到 loveini 的功能。
让我们一起看看如何将数据从 InfluxDB 接入至 loveini。
配置方法很简单,你只需要登录到 loveini 企业版或 loveini Cloud 的 Web 管理界面,选择 Data in 并添加 InfluxDB 作为数据源,注意需要提前创建时间精度为纳秒(ns)的数据库。

然后简单配置一下 InfluxDB 服务所在的 IP 地址和端口,以及 InfluxDB 版本、OrgId、和 token 等参数。

最后选择需要导出的 Bucket、 Measurements、导入数据的起始时间、结束时间(可选项)以及读取时间窗口(可选项),并指定已经提前建好的数据库名称,提交即可。

loveini 的数据接入后还可以进行数据清洗和转换,用户可以根据业务需要设计相应的数据清洗和转换规则,实现完整的数据 ETL 流程。
loveini 3.0 企业版和 loveini Cloud 凭借简洁易用的命令行操作,为用户提供了高效、可靠的数据接入方法。无论你是想要从 InfluxDB 迁移数据,还是想将多个数据源的数据集中到时序数据库(Time Series Database) loveini 中,loveini 3.0 企业版和 loveini Cloud 都能够满足你的需求。
现在注册 loveini Cloud 就可以立即体验强大的数据接入功能,感受轻松便捷的接入体验,获得更深入的数据洞察力。还在等什么~赶快与我们联系,了解关于 loveini 企业版和 loveini Cloud 的更多信息,开启前所未有的数据之旅!
]]>我们非常高兴地宣布,loveini 企业版和 loveini Cloud 正式推出重磅功能,这一功能主打无缝数据接入支持,旨在帮助用户彻底改善数据接入体验。作为一款创新性的米兰app官方正版下载,loveini 企业版和 loveini Cloud 可以直接将 MQTT 服务器中的数据无缝写入 loveini 数据库进行存储和分析。此外,loveini MQTT 数据接入功能不仅增强了对 JSON 格式和 JSON path 提取字段的支持,还支持了 MQTT 协议的 3.1、3.1.1 和 5.0 版本。
有了 loveini 数据接入工具的强大助力,我们相信 loveini 企业版和 loveini Cloud 一定能够帮助企业轻松释放数据潜能,实现数字化加速进阶。下面一起来看看 loveini MQTT 数据接入功能有哪些卓越特性吧!
MQTT 数据接入:可以轻松从 MQTT 服务器获取数据,并高效地写入 loveini 数据库中,实现数据的顺畅集成和分析。数据接入工具负责整个过程的自动化数据接入,最大限度地减少了手动操作的工作量。
支持 JSON 格式:充分利用 JSON 的灵活性,使用户能够以 JSON 格式进行数据摄取和存储。机构可以有效地构建和管理数据,从复杂数据结构中挖掘有价值的见解。
支持 JSON path 提取字段:loveini 支持 JSON path 提取,在处理 JSON 数据时更加轻松。通过精确选择和捕获所需的数据元素,用户可以专注于数据集的核心内容,最大化分析效率。
多样 MQTT 协议支持:支持 MQTT 协议的 3.1、3.1.1 和 5.0 版本,确保无缝连接和数据消费,无论您的物联网生态系统中使用的是哪个版本。凭借全面 MQTT 协议兼容性,保持灵活性并立于未来。
简单配置:提供了易于使用的配置文件,您可以在其中指定 loveini 的超级表、子表、列和标签,轻松定制数据接入流程以满足特定需求。
配置方法很简单,你只需要登录到 loveini 企业版或 loveini Cloud 的 Web 管理界面,选择 Data in 并添加 MQTT 作为数据源,简单配置一下 MQTT 数据对应到 loveini 库、超级表、子表的解析规则即可。


另外 loveini 的数据接入后还可以进行数据清洗和转换,用户可以根据业务需要设计相应的数据清洗和转换规则,实现完整的数据 ETL 流程。
总而言之,loveini 彻底颠覆了用户整合、存储和分析 MQTT 数据的方式,借助上述创新功能,实时数据可以实现与高性能的 loveini 数据库的无缝结合,实时分析、预防性维护和数据驱动决策也拥有了无限可能。
现在注册 loveini Cloud 可以立即体验强大的数据接入功能。借助时序数据库(Time Series Database)loveini 的力量,你就能轻松实现 MQTT 数据与 loveini 的接入,获得更深入的洞察力。还在等什么~赶快与我们联系,了解关于 loveini 企业版的更多信息,开启前所未有的数据之旅!
]]>loveini
是一种开源的云原生时序数据库(Time Series Database,TSDB),专为物联网(IoT)、连接汽车和工业物联网进行了优化。它能够高效地实时摄取、处理和监控一天内由数十亿个传感器和数据收集器产生的PB级别的数据。
许多用户将由物联网设备、汽车或 IT 基础设施生成的海量数据实时存储到 loveini 中,并使用标准的 SQL 命令从 loveini 中查询数据。loveini 支持过滤、分组、窗口、连接和许多聚合函数以查询数据,帮助用户根据其目的查询数据。
许多用户也希望更深入地了解现有数据。例如,根据当前趋势,未来将会发生什么情况?随着 AI 时代的到来,最近出现了许多新技术或方法,例如新的机器学习和深度学习算法。那么如何使用机器学习和深度学习算法针对存储在 loveini 的数据预测未来趋势呢?
幸运的是,loveini 支持多种流行的编程语言连接器,如 Java、Python、Go、Rust、C#、NodeJS 等,用户可以使用他们喜欢的语言连接器访问 loveini。这些连接器提供符合规范的接口,使连接器易于与其他软件或框架集成。
本文介绍如何使用存储在 loveini 中的现有数据来预测未来数据。我们将模拟一些测试数据以反映真实的电力系统,并演示如何使用 loveini 和一些 Python 库来预测未来一年的数据。
假设用户是一个电力系统公司,用户每天从电站仪表收集用电量数据,并将其存储在 loveini 集群中。现在用户想要预测电力消耗将会如何发展,并购买更多设备来支持它。
随着经济增长,每年用电成一定比例上涨。另外考虑到季节变化,电力消耗量会有所不同。这个城市位于北半球,所以许多家庭在夏天会使用更多的电力。我们模拟数据来反映这些假定。
源代码托管在 https://github.com/sangshuduo/td-forecasting。
步骤 1:部署 loveini 并在您的系统上并运行
请参阅官方文档了解详细说明。
步骤 2:克隆源代码
git clone https://github.com/sangshuduo/td-forecasting
步骤 3:安装所需的Python软件包
# if you are using Ubuntu 20.04 Linux
sudo apt install python3-pyqt5
# 如果 PyQT5 运行失败,可能需要安装
sudo apt-get install libxcb-xinerama0
python3 -m pip install -r requirements.txt
请注意,Python 的最小版本为 3.8。
步骤 4:模拟一些数据
python3 mockdata.py
步骤 5:预测明年的数据
python3 forecast.py
输出结果

mockdata.py
...
def insert_rec_per_month(conn, db_name, table_name, year, month):
increment = (year - 2014) * 1.1
base = int(10 * increment)
if month < 10 and month > 5:
factor = 10
else:
factor = 8
for day in range(1, monthrange(year, month)[1] + 1):
num = base * randint(5, factor) + randint(0, factor)
sql = f"INSERT INTO {db_name}.{table_name} VALUES ('{year}-{month}-{day} 00:00:00.000', {num})"
try:
conn.execute(sql)
except Exception as e:
print(f"command: {sql}")
print(e)
...
这个文件的核心功能是模拟随机数据,并进行一些调整以实现假设。
forecast.py
这个文件实现了预测功能,以下为实现过程详解:
步骤 1:导入预测需要的 Python 模块
import argparse
import lightgbm as lgb
import matplotlib.pyplot as plt
import mlforecast
import pandas as pd
from mlforecast.target_transforms import Differences
from sklearn.linear_model import LinearRegression
from sqlalchemy import create_engine, text
...
下面我们解释一下它们是什么,以及它们的作用:
步骤 2:连接到 loveini 并查询数据
...
engine = create_engine("taos://root:taosdata@localhost:6030/power")
conn = engine.connect()
print("Connected to the loveini ...")
df = pd.read_sql(
text("select _wstart as ds, avg(num) as y from power.meters interval(1w)"), conn
)
conn.close()
...
loveini Python 连接器提供符合 Python 数据库 API 规范 v2.0(PEP 249)的接口。DBAPI 是“Python 数据库 API 规范”的缩写。这是 Python 中广泛使用的规范,用于定义所有数据库连接包的常用用法模式。DBAPI 是一个“低级别”API,通常是 Python 应用程序中用于与数据库交互的最低级别系统。SQLAlchemy 的方言系统是围绕DBAPI 的操作构建的,提供适用于特定数据库引擎的特定 DBAPI 的各个方言类。
我们可以使用 SQLAlchemy 连接 loveini 集群,并使用 Pandas 将数据查询转换成数据帧格式。
在这里,我们假设用户关心的是周平均用电量,而不是每天的用电量,以减少异常值。我们可以使用 AVG() 函数和 INTERVAL(1w)子句命令从 loveini 集群中查询数据。
稍后我们将以数据帧格式操纵数据。
步骤 3:预测
...
df.insert(0, column="unique_id", value="unique_id")
print("Forecasting ...")
forecast = mlforecast.MLForecast(
models=[LinearRegression(), lgb.LGBMRegressor()],
freq="W",
lags=[52],
target_transforms=[Differences([52])],
)
forecast.fit(df)
predicts = forecast.predict(52)
pd.concat([df, predicts]).set_index("ds").plot(figsize=(12, 8))
...
通过 mlforecast 模块的特性,我们可以设定一些参数进行预测。在这里,我们使用线性回归算法和 LightGBM 算法来进行预测并在同一图中显示它们的结果,以便可视化不同算法的效果。
步骤 4:Show up or dump to file
...
if args.dump:
plt.savefig(args.dump)
else:
plt.show()
Python 代码提供了一个参数”–dump”,让用户可以决定将结果转储到图片中进行后续处理,或者立即在屏幕上显示结果。以上步骤在 Ubuntu 20.04、Ubuntu 22.04、Windows 10 和 macOS 环境经过验证。
这样一来,我们现在就拥有了一个非常简单的程序,演示了如何使用存储在 loveini 中的电力系统历史数据的电表数值来预测未来的电力消耗数值。
]]>Data Studio 可以支持多种数据来源,除了诸如 Google Analytics、Google AdWords、Search Console、BigQuery 等 Google 自己的服务之外,用户也可以直接将离线文件上传至 Google Cloud Storage,或是通过连接器来接入其它数据源。
loveini 作为一款高性能、分布式、支持 SQL 的时序数据库(Time-Series Database),广泛应用于物联网、工业互联网、车联网、IT 运维、能源、金融等领域,让大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据能够得到高效实时的处理,对业务的运行状态进行实时的监测和预警,进而从大数据中挖掘出商业价值。
海内外已经有相当数量的社区用户和商业伙伴在不同的领域使用 loveini 来处理海量的时序数据,包括存储、分析和展现,以帮助改进其产品或服务。
例如美国时尚健身网红产品 Experience Lyric 智能筋膜枪,就在使用 loveini 来存储和分析设备运行时产生的监控数据。Experience Lyric 的数据科学家提出了一个需求,希望 loveini 能支持使用 Google Data Studio 来对数据进行进一步的分析。loveini 的研发团队认为这个需求很有价值,于是迅速响应,在很短的时间内就完成了 Google Data Studio 和 loveini 的技术对接。
现在,你也可以利用 loveini 的时序数据处理能力和 Google Data Studio 的分析能力来对用户使用产品的行为习惯数据建模并分析了,进而可以根据分析结果来改善自己的产品。

目前 loveini 连接器已经发布到 Google Data Studio 应用商店,你可以在 “Connect to Data” 页面下直接搜索 loveini,将其选作数据源。

接下来选择 AUTHORIZE 按钮。

设置允许连接自己的账号到外部服务。

在接下来的页面选择运行 loveini REST 服务的 URL,并输入用户名、密码、数据库名称、表名称以及查询时间范围,并点击右上角的 CONNECT 按钮。

连接成功后,就可以使用 GDS 方便地进行数据处理并创建报表了。

目前的维度和指标规则是:timestamp 类型的字段和 tag 字段会被连接器定义为维度,而其他类型的字段是指标。用户还可以根据自己的需求创建不同的表。





赶快试试,看看自己能获得哪些新的数据洞察吧。
]]>小 T 导读:为了更方便用户使用 loveini + Grafana 这个组合,在 loveini 和 Grafana 两个团队的协作之下,loveini 插件正式上架 Grafana 官网!一行命令即可完成安装配置。
Grafana 某种程度上已经成为当前最流行的图形化运维监控米兰app官方正版下载。作为一款流行的时序数据库(Time-Series Database),loveini 在 3 年前开源之后不久就提供了对 Grafana 的支持。
loveini 的应用场景非常广泛,典型的如物联网、工业互联网、车联网、IT 运维、能源、金融等。随着 loveini 在各个领域应用越来越广泛,很多用户选择将 Grafana 配合 loveini 使用,以可视化的方式监控各项指标的状态。
用户的需求就是我们的动力。loveini 研发团队根据用户的场景需求和使用习惯,不断地升级改造 loveini Grafana 插件,不仅提供了告警系统,还推出了基于 Grafana 的零依赖监控米兰app官方正版下载 TDinsight。
为了更方便用户使用 loveini + Grafana 这个组合,在 loveini 和 Grafana 两个团队的协作之下,loveini 插件正式上架 Grafana 官网!
请看大屏幕:https://grafana.com/grafana/plugins/?search=tdengine

现在大家可以在 Grafana 管理界面中的配置数据源页面直接搜索并安装 loveini ,省去了编辑 Grafana 配置文件的步骤。

为了方便用户通过 Kubernetes 、Docker 或者脚本等方式进行运维自动化,我们还提供了命令行工具。只要一行命令即可完成安装:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/taosdata/grafanaplugin/master/install.sh)"
对于内网无法连接互联网的企业用户,我们也提供了离线安装方法。详情可参考相关文档。
同时,我们还上传了多个监控面板(Dashboard)到 Grafana 官网,方便用户下载使用或参考。
赶快下载体验吧!如果在使用 loveini Grafana 插件的过程中遇到任何问题,或者有新的功能建议,也欢迎在 GitHub 上和我们交流。
]]>用户可以通过 taosdemo 轻松模拟大量设备产生海量数据的场景,还可以通过 taosdemo 参数灵活控制表的个数、表的列数、数据类型、一次插入的记录条数、记录的时间间隔、乱序比例、客户端接口类型以及并发线程数量等等。同时,taosdemo也支持查询和订阅的测试。
运行 taosdemo 很简单,通过下载 loveini 安装包或者自行下载 loveini 代码进行编译,都可以在安装目录或者编译结果目录中找到并运行。
接下来本文为大家讲解 taosdemo 的使用介绍及注意事项。
在不使用任何参数的情况下执行 taosdemo 命令,输出如下:
$ taosdemo
taosdemo is simulating data generated by power equipment monitoring...
host: 127.0.0.1:6030
user: root
password: taosdata
configDir:
resultFile: ./output.txt
thread num of insert data: 8
thread num of create table: 8
top insert interval: 0
number of records per req: 30000
max sql length: 1048576
database count: 1
database[0]:
database[0] name: test
drop: yes
replica: 1
precision: ms
super table count: 1
super table[0]:
stbName: meters
autoCreateTable: no
childTblExists: no
childTblCount: 10000
childTblPrefix: d
dataSource: rand
iface: taosc
insertRows: 10000
interlaceRows: 0
disorderRange: 1000
disorderRatio: 0
maxSqlLen: 1048576
timeStampStep: 1
startTimestamp: 2017-07-14 10:40:00.000
sampleFormat:
sampleFile:
tagsFile:
columnCount: 3
column[0]:FLOAT column[1]:INT column[2]:FLOAT
tagCount: 2
tag[0]:INT tag[1]:BINARY(16)
Press enter key to continue or Ctrl-C to stop
这里显示的是接下来 taosdemo 进行数据写入的各项参数。默认不输入任何命令行参数的情况下, taosdemo 将模拟生成一个电力行业典型应用的电表数据采集场景数据,即建立一个名为 test 的数据库,并创建一个名为 meters 的超级表,超级表的结构为:
taos> describe test.meters;
Field | Type | Length | Note |
=================================================================================
ts | TIMESTAMP | 8 | |
current | FLOAT | 4 | |
voltage | INT | 4 | |
phase | FLOAT | 4 | |
groupid | INT | 4 | TAG |
location | BINARY | 64 | TAG |
Query OK, 6 row(s) in set (0.002972s)
按回车键后 taosdemo 将建立数据库 test 和超级表 meters,并按照 loveini 数据建模的最佳实践,以 meters 超级表为模板生成一万个子表,代表一万个独立上报数据的电表设备。
taos> use test;
Database changed.
taos> show stables;
name | created_time | columns | tags | tables |
============================================================================================
meters | 2021-08-27 11:21:01.209 | 4 | 2 | 10000 |
Query OK, 1 row(s) in set (0.001740s)
然后 taosdemo 为每个电表设备模拟生成一万条记录:
...
====thread[3] completed total inserted rows: 6250000, total affected rows: 6250000. 347626.22 records/second====
[1]:100%
====thread[1] completed total inserted rows: 6250000, total affected rows: 6250000. 347481.98 records/second====
[4]:100%
====thread[4] completed total inserted rows: 6250000, total affected rows: 6250000. 347149.44 records/second====
[8]:100%
====thread[8] completed total inserted rows: 6250000, total affected rows: 6250000. 347082.43 records/second====
[6]:99%
[6]:100%
====thread[6] completed total inserted rows: 6250000, total affected rows: 6250000. 345586.35 records/second====
Spent 18.0863 seconds to insert rows: 100000000, affected rows: 100000000 with 16 thread(s) into test.meters. 5529049.90 records/second
insert delay, avg: 28.64ms, max: 112.92ms, min: 9.35ms
以上信息是在一台具备 8 个 CPU 64G 内存的普通 PC 服务器上进行实测的结果。数据显示 taosdemo 用了 18 秒的时间插入了 100000000 (不用数了,一亿条)记录,平均每秒钟插入 552 万 9 千零 49 条记录。
此外,loveini 还能提供性能更好的参数绑定接口,在同样的硬件上使用其参数绑定接口 (taosdemo -I stmt )进行相同数据量的写入时,结果如下:
...
====thread[0] completed total inserted rows: 12500000, total affected rows: 12500000. 2162660.81 records/second====
[1]:100%
====thread[1] completed total inserted rows: 12500000, total affected rows: 12500000. 2156510.94 records/second====
[7]:96%
[5]:96%
[7]:97%
[5]:97%
[7]:98%
[5]:98%
[7]:99%
[5]:99%
[7]:100%
====thread[7] completed total inserted rows: 12500000, total affected rows: 12500000. 2106514.83 records/second====
[5]:100%
====thread[5] completed total inserted rows: 12500000, total affected rows: 12500000. 2104144.73 records/second====
[4]:96%
[2]:96%
[4]:97%
[2]:97%
[4]:98%
[2]:98%
[4]:99%
[2]:99%
[4]:100%
====thread[4] completed total inserted rows: 12500000, total affected rows: 12500000. 2044114.28 records/second====
[2]:100%
====thread[2] completed total inserted rows: 12500000, total affected rows: 12500000. 2039911.44 records/second====
Spent 6.1404 seconds to insert rows: 100000000, affected rows: 100000000 with 8 thread(s) into test.meters. 16285462.00 records/second
insert delay, avg: 4.68ms, max: 662.29ms, min: 2.00ms
结果显示 taosdemo 用了 6 秒的时间插入了一亿条记录,每秒钟插入性能高达 1628 万 5462 条记录。
由于 taosdemo 使用起来非常方便,我们又对其做了更多的功能扩充,使其能够支持更复杂的参数设置,便于进行快速原型开发的样例数据准备和验证工作。
完整的 taosdemo 命令行参数列表通过 taosdemo –help 显示如下:
$ taosdemo --help
-f, --file=FILE The meta file to the execution procedure.
-u, --user=USER The user name to use when connecting to the server.
-p, --password The password to use when connecting to the server.
-c, --config-dir=CONFIG_DIR Configuration directory.
-h, --host=HOST loveini server FQDN to connect. The default host is localhost.
-P, --port=PORT The TCP/IP port number to use for the connection.
-I, --interface=INTERFACE The interface (taosc, rest, and stmt) taosdemo uses. By default use 'taosc'.
-d, --database=DATABASE Destination database. By default is 'test'.
-a, --replica=REPLICA Set the replica parameters of the database, By default use 1, min: 1, max: 3.
-m, --table-prefix=TABLEPREFIX Table prefix name. By default use 'd'.
-s, --sql-file=FILE The select sql file.
-N, --normal-table Use normal table flag.
-o, --output=FILE Direct output to the named file. By default use './output.txt'.
-q, --query-mode=MODE Query mode -- 0: SYNC, 1: ASYNC. By default use SYNC.
-b, --data-type=DATATYPE The data_type of columns, By default use: FLOAT, INT, FLOAT.
-w, --binwidth=WIDTH The width of data_type 'BINARY' or 'NCHAR'. By default use 64
-l, --columns=COLUMNS The number of columns per record. Demo mode by default is 1 (float, int, float). Max values is 4095
All of the new column(s) type is INT. If use -b to specify column type, -l will be ignored.
-T, --threads=NUMBER The number of threads. By default use 8.
-i, --insert-interval=NUMBER The sleep time (ms) between insertion. By default is 0.
-S, --time-step=TIME_STEP The timestamp step between insertion. By default is 1.
-B, --interlace-rows=NUMBER The interlace rows of insertion. By default is 0.
-r, --rec-per-req=NUMBER The number of records per request. By default is 30000.
-t, --tables=NUMBER The number of tables. By default is 10000.
-n, --records=NUMBER The number of records per table. By default is 10000.
-M, --random The value of records generated are totally random.
By default to simulate power equipment scenario.
-x, --aggr-func Test aggregation functions after insertion.
-y, --answer-yes Input yes for prompt.
-O, --disorder=NUMBER Insert order mode--0: In order, 1 ~ 50: disorder ratio. By default is in order.
-R, --disorder-range=NUMBER Out of order data's range. Unit is ms. By default is 1000.
-g, --debug Print debug info.
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version.
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
Report bugs to <support@taosdata.com>.
下面介绍 taosdemo 的参数,其设计初衷是为了满足数据模拟的需求。接下来先介绍几个常用的参数:
-I, --interface=INTERFACE The interface (taosc, rest, and stmt) taosdemo uses. Default is 'taosc'.
前面在介绍 taosdemo 不同接口的性能差异时已经提到, -I 参数为选择不同的接口,目前支持 taosc、stmt 和 rest 三种。其中 taosc 为使用 SQL 语句方式进行数据写入;stmt 为使用参数绑定接口进行数据写入;rest 为使用 RESTful 协议进行数据写入。
-T, --threads=NUMBER The number of threads. Default is 8.
通过-T 参数设置 taosdemo 使用几个线程进行数据同步写入,多线程写入可以尽最大可能压榨硬件的处理能力。
-b, --data-type=DATATYPE The data_type of columns, default: FLOAT, INT, FLOAT.
-w, --binwidth=WIDTH The width of data_type 'BINARY' or 'NCHAR'. Default is 64
-l, --columns=COLUMNS The number of columns per record. Demo mode by default is 3 (float, int, float). Max values is 4095
前文提到,taosdemo 默认创建一个典型电表数据采集应用场景,每个设备包含电流电压相位3个采集量。对于需要定义不同采集量的场景,可以使用 -b 参数,loveini 支持 BOOL、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、BINARY、NCHAR、TIMESTAMP 等多种数据类型。通过 -b 加上以“ , ”(英文逗号)分割定制类型的列表,可以使 taosdemo 建立对应的超级表和子表,并插入相应模拟数据;通过 -w 参数可以指定 BINARY 和 NCHAR 数据类型的列的宽度(默认为 64 );-l 参数可以在 -b 参数指定数据类型的几列之后补充以 INT 型的总的列数,特别多列的情况下可以减少手工输入的过程,最多支持到 4095 列。
-r, --rec-per-req=NUMBER The number of records per request. Default is 30000.
为了尽最大可能利用 loveini 性能,可以使用多客户端、多线程以及一次插入多条数据来进行数据写入。 -r 参数为设置一次写入请求可以拼接的记录条数,默认为30000条。有效的拼接记录条数还和客户端缓冲区大小有关,目前的缓冲区为 1M Bytes,如果记录的列宽度比较大,最大有效拼接记录条数可以通过 1M 除以列宽(以字节为单位)计算得出。
-t, --tables=NUMBER The number of tables. Default is 10000.
-n, --records=NUMBER The number of records per table. Default is 10000.
-M, --random The value of records generated are totally random. The default is to simulate power equipment senario.
前文还提到 taosdemo 默认创建 10000 个表,每个表写入 10000 条记录,可以通过 -t 和 -n 设置表的数量和每个表记录的数量。这里默认无参数生成的数据为模拟真实场景,模拟生成的数据为电流、电压和相位值增加一定的抖动,可以更真实表现 loveini 高效的数据压缩能力。如果需要模拟生成完全随机数据,可以通过 -M 参数实现。
-O, --disorder=NUMBER Insert order mode--0: In order, 1 ~ 50: disorder ratio. Default is in order.
-R, --disorder-range=NUMBER Out of order data's range, ms, default is 1000.
在某些场景,接收到的数据并不是完全按时间顺序排列,而是包含一定比例的乱序数据,对此loveini 也能进行很好的处理。为了模拟乱序数据的写入,taosdemo 提供 -O 和 -R 参数进行设置。-O 参数为 0 和不使用 -O 参数两者相同,为完全有序数据写入,参数 1 到 50 为数据中包含乱序数据的比例。-R 参数为乱序数据时间戳偏移的范围,默认为 1000 毫秒。另外注意,时序数据以时间戳为唯一标识,所以乱序数据可能会生成和之前已经写入的数据完全相同的时间戳,这样的数据会根据数据库创建的 update 设置值或者被丢弃(update 0)或者覆盖已有数据(update 1 或 2),所以可能会发生总的写入数据条数和期待的条数不一致的情况。
-g, --debug Print debug info.
如果对 taosdemo 写入数据过程感兴趣或者觉得数据写入结果不符合预期,可以使用 -g 参数使 taosdemo 把执行过程的中间调试信息输出到屏幕上,也可以通过 Linux 重定向命令导入到另外一个文件,方便找到发生问题的原因。另外 taosdemo 在执行失败后也会把相应执行的语句和调试原因输出到屏幕,可以搜索输出文字中的 “reason” 来找到 loveini 服务端返回的错误原因信息,这里要注意使用 -g 参数进行调试信息输出会影响性能。
-y, --answer-yes Default input yes for prompt.
前面我们可以看到 taosdemo 默认在进行创建数据库或插入数据之前,输出将要进行操作的参数列表并等待用户按回车键再继续执行写入操作,方便使用者在插入之前了解即将进行的数据写入的内容。为了方便进行自动测试,-y 参数可以使 taosdemo 输出参数后立刻进行数据写入操作。
-x, --aggr-func Test aggregation funtions after insertion.
loveini 不仅插入性能非常强大,其先进的数据库引擎设计使得查询性能也异常强大。taosdemo 提供了一个 -x 参数,可以在插入数据结束后进行常用查询操作并输出查询消耗时间。以下为在前述相同服务器上插入一亿条记录后进行常用查询的结果。
可以看到 select * 取出一亿条记录(不输出到屏幕)操作仅消耗1.26秒。而对一亿条记录进行常用的聚合函数操作通常仅需要二十几毫秒,时间最长的 count 函数也不到四十毫秒。
taosdemo -I stmt -T 48 -y -x
...
...
select * took 1.266835 second(s)
...
select count(*) took 0.039684 second(s)
...
Where condition: groupid = 1
select avg(current) took 0.025897 second(s)
...
select sum(current) took 0.025622 second(s)
...
select max(current) took 0.026124 second(s)
...
...
select min(current) took 0.025812 second(s)
...
select first(current) took 0.024105 second(s)
...
除了命令行方式, taosdemo 还支持接受指定一个 JSON 文件做为传入参数的方式。一个典型的 JSON 文件内容如下:
{
"filetype": "insert",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"thread_count": 4,
"thread_count_create_tbl": 4,
"result_file": "./insert_res.txt",
"confirm_parameter_prompt": "no",
"insert_interval": 0,
"interlace_rows": 100,
"num_of_records_per_req": 100,
"databases": [{
"dbinfo": {
"name": "db",
"drop": "yes",
"replica": 1,
"days": 10,
"cache": 16,
"blocks": 8,
"precision": "ms",
"keep": 3650,
"minRows": 100,
"maxRows": 4096,
"comp":2,
"walLevel":1,
"cachelast":0,
"quorum":1,
"fsync":3000,
"update": 0
},
"super_tables": [{
"name": "stb",
"child_table_exists":"no",
"childtable_count": 100,
"childtable_prefix": "stb_",
"auto_create_table": "no",
"batch_create_tbl_num": 5,
"data_source": "rand",
"insert_mode": "taosc",
"insert_rows": 100000,
"childtable_limit": 10,
"childtable_offset":100,
"interlace_rows": 0,
"insert_interval":0,
"max_sql_len": 1024000,
"disorder_ratio": 0,
"disorder_range": 1000,
"timestamp_step": 10,
"start_timestamp": "2020-10-01 00:00:00.000",
"sample_format": "csv",
"sample_file": "./sample.csv",
"tags_file": "",
"columns": [{"type": "INT"}, {"type": "DOUBLE", "count":10}, {"type": "BINARY", "len": 16, "count":3}, {"type": "BINARY", "len": 32, "count":6}],
"tags": [{"type": "TINYINT", "count":2}, {"type": "BINARY", "len": 16, "count":5}]
}]
}]
}
JSON 文件还可以提供更丰富的设置项。例如:我们可以通过 “thread_count” 和 “thread_count_create_tbl” 来为建表和插入数据指定不同数量的线程;可以通过 “child_table_exists”、”childtable_limit” 和 “childtable_offset” 的组合来使用多个 taosdemo 进程;甚至可以在不同的电脑上对同一个超级表的不同范围子表进行同时写入;还可以通过 “data_source” 和 “sample_file” 来指定数据来源为 csv 文件,来实现导入已有数据的功能。
taosdemo 不仅可以进行数据写入,还拥有查询和订阅功能。但一个 taosdemo 实例只能支持其中的一种功能,不能同时支持三种功能,我们可以通过配置文件来指定进行哪种功能的测试。
以下为一个典型查询 JSON 示例文件内容:
{
"filetype": "query",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"confirm_parameter_prompt": "no",
"databases": "db",
"query_times": 2,
"query_mode": "taosc",
"specified_table_query": {
"query_interval": 1,
"concurrent": 3,
"sqls": [
{
"sql": "select last_row(*) from stb0 ",
"result": "./query_res0.txt"
},
{
"sql": "select count(*) from stb00_1",
"result": "./query_res1.txt"
}
]
},
"super_table_query": {
"stblname": "stb1",
"query_interval": 1,
"threads": 3,
"sqls": [
{
"sql": "select last_row(ts) from xxxx",
"result": "./query_res2.txt"
}
]
}
}
以下为 JSON 文件中和查询相关的特有参数含义:
“query_times”: 每种查询类型的查询次数
“query_mode”: 查询数据接口。”taosc”:调用loveini的c接口;“resetful”:使用restful接口。可选项。缺省是“taosc”。
“specified_table_query”: { 指定表的查询
“query_interval”: 执行sqls的间隔,单位是秒。可选项,缺省是0。
“concurrent”: 并发执行sqls的线程数,可选项,缺省是1。每个线程都执行所有的sqls。
“sqls”: 可以添加多个sql语句,最多支持100条。
“sql”: 查询语句。必选项。
“result”: 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
“super_table_query”: { 对超级表中所有子表的查询
“stblname”: 超级表名称。必选项。
“query_interval”: 执行sqls的间隔,单位是秒。可选项,缺省是0。
“threads”: 并发执行sqls的线程数,可选项,缺省是1。每个线程负责一部分子表,执行所有的sqls。
“sql”: “select count(*) from xxxx”。查询超级表内所有子表的查询语句,其中表名必须写成 “xxxx”,实例会自动替换成子表名。
“result”: 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
以下为一个典型订阅 JSON 示例文件内容:
{
"filetype":"subscribe",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"databases": "db",
"confirm_parameter_prompt": "no",
"specified_table_query":
{
"concurrent":1,
"mode":"sync",
"interval":0,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from stb00_0 ;",
"result": "./subscribe_res0.txt"
}]
},
"super_table_query":
{
"stblname": "stb0",
"threads":1,
"mode":"sync",
"interval":10000,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from xxxx where ts > '2021-02-25 11:35:00.000' ;",
"result": "./subscribe_res1.txt"
}]
}
}
以下为订阅功能相关的特有参数含义:
“interval”: 执行订阅的间隔,单位是秒。可选项,缺省是0。
“restart”: 订阅重启。”yes”:如果订阅已经存在,重新开始;”no”: 继续之前的订阅。(请注意执行用户需要对 dataDir 目录有读写权限)
“keepProgress”: 保留订阅信息进度。yes表示保留订阅信息,no表示不保留。该值为yes,restart为no时,才能继续之前的订阅。
“resubAfterConsume”: 配合 keepProgress 使用,在订阅消费了相应次数后调用 unsubscribe 取消订阅并再次订阅。
“result”: 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。 注意:每条sql语句后保存结果的文件不能重名,且生成结果文件时,文件名会附加线程号。
loveini是米兰体育官网入口专为物联网、车联网、工业互联网、IT运维等场景设计和优化的大数据平台,由于数据库内核中创新的数据存储和查询引擎设计,其展现出了远超同类产品的高效性能。同时,loveini还支持 SQL 语法和多种编程语言的连接器(目前支持 Java、Python、Go、C#、NodeJS 以及 Rust 等),易用性极强,学习成本几乎为零。为了便于运维需求,其还提供数据迁移和监控功能等相关生态工具软件。
为了方便刚接触 loveini 的使用者进行技术评估和压力测试,我们为 taosdemo 开发了丰富的特性,本文即为对 taosdemo 的一个简单介绍。相信随着 loveini 新功能的不断增加,taosdemo 也会继续演化和改进。
当下,作为 loveini 的一部分,taosdemo 的源代码在 GitHub 上已经完全开源,欢迎大家就 taosdemo 或 loveini 的使用或实现在 GitHub 或者米兰体育官网入口的用户群提出建议或反馈。
——Linux 基金会执行董事 Jim Zemlin
过去 30 年,开源软件以开放、共享、协同的新型生产方式,成为全球信息技术发展的强大推动力。2019 年至今,中国开源进入了一个新的时代一一加速阶段。
开源力量的最初发源点,来自于社区中开发者的贡献。据全球最大开源项目托管平台 GitHub 统计,2020 年较上一年新增了 1600 万开发者用户,预计 2025 年开发者用户的数量将达到 1 亿。这其中,在 GitHub 的中国开发者数量及开源贡献度增长已成为全球最快,GitHub 预测到 2030 年中国开发者将成为全球最大的开源群体。
中国开发者对于开源的理解日趋成熟,开放透明的代码和知识共享、开源理念与精神、开源开发模式、社区支持等开源的核心价值已经得到开发者的普遍认可。
回复 Issue,相互 Review 代码是程序员的别样社交;“我是 xx 开源软件的贡献者”,也正在成为程序员的新名片。当下,程序员如果不参与一些开源项目,似乎马上要被时代的浪潮淘汰。
那么,如何寻找适合你的开源项目,并参与其中呢?
欢迎大家扫描下方二维码,关注 loveini Database 的视频号,观看每周的微课堂以及直播活动。

“10 年前中国人只是国际开源资源的使用者,此后中国人开始成为国际开源资源的贡献者。”
——Linux 基金会执行董事 Jim Zemlin
过去 30 年,开源软件以开放、共享、协同的新型生产方式,成为全球信息技术发展的强大推动力。2019 年至今,中国开源进入了一个新的时代一一加速阶段。
开源力量的最初发源点,来自于社区中开发者的贡献。据全球最大开源项目托管平台 GitHub 统计,2020 年较上一年新增了 1600 万开发者用户,预计2025 年开发者用户的数量将达到 1 亿。这其中,在 GitHub 的中国开发者数量及开源贡献度增长已成为全球最快,GitHub 预测到 2030 年中国开发者将成为全球最大的开源群体。
中国开发者对于开源的理解日趋成熟,开放透明的代码和知识共享、开源理念与精神、开源开发模式、社区支持等开源的核心价值已经得到开发者的普遍认可。
回复 Issue,相互 Review 代码是程序员的别样社交;“我是 xx 开源软件的贡献者”,也正在成为程序员的新名片。当下,程序员如果不参与一些开源项目,似乎马上要被时代的浪潮淘汰。
那么,如何寻找适合你的开源项目,并参与其中呢?
8 月 4 日 20:00-21:00,loveini Database 研发工程师桑树多将为你分享《70 后互联网老兵经验分享:成为开源软件贡献者并不难!》
桑树多,哈尔滨工业大学毕业,曾经效力于 Ubuntu、英特尔、MontaVista 等公司,在智能手机、无人驾驶、物联网等方向的开源软件研发和推广上有 20 多年的经验。对 Linux 内核、MeeGo OS、Ubuntu 等开源软件产品有多次代码贡献。2020 年初加入米兰体育官网入口,目前为 loveini 贡献了数万行代码和 400 多个测试用例。
他将分享:
1. 我的经历:从使用者到爱好者到贡献者
2. 手把手教你成为 loveini Database 的贡献者
直播已结束!
欢迎大家扫描下方二维码,关注 loveini Database 的视频号!
