Spark 读取、写入时序数据库TDengine以及TDengine概述

news2024/11/18 12:45:39

一、TDengine是什么

TDengine 是一款高性能、分布式、支持 SQL 的时序数据库,其核心代码,包括集群功能全部开源(开源协议,AGPL v3.0)。TDengine 能被广泛运用于物联网、工业互联网、车联网、IT 运维、金融等领域。除核心的时序数据库功能外,TDengine 还提供缓存、数据订阅、流式计算等大数据平台所需要的系列功能,最大程度减少研发和运维的复杂度。

1.TDengine总结出了物联网数据的特点:

  • 数据是时序的,一定带有时间戳;

  • 数据是结构化的;

  • 数据极少有更新或删除操作;

  • 数据源是唯一的;

  • 相对互联网应用,写多读少;

  • 用户关注的是一段时间的趋势,而不是某一特点时间点的值;

  • 数据是有保留期限的;

  • 数据的查询分析一定是基于时间段和地理区域的;

  • 除存储查询外,还往往需要各种统计和实时计算操作;

  • 流量平稳,可以预测;

  • 往往需要有插值等一些特殊的计算;

  • 数据量巨大,一天采集的数据就可以超过100亿条。

总结出这些特点后,会发现物联网数据像日志数据,几乎没有更新操作的可能,那数据库中的事务处理的实现就完全多余;数据是时序的,时间戳自然可以作为主键,根本不需要复杂的索引结构;

物联网数据是结构化的,像HBase、Cassandra那样用Key-Value来存储,计算效率和存储效率大打折扣,应该采用结构化存储才行;

物联网数据的冷热程度是时间决定的,刚采集的数据是最热的,而不是用户点击决定。因此用简单的先进先出的内存管理就能很好的实现高效的缓存,根本就不需要Redis;

物联网数据从一个设备来看,就是一个数据流,实现滑动窗口的流计算那不是一个最顺其自然的事情,哪用得上Spark这么复杂的引擎;

对于数据分区,简单的按设备分区按时间段分区,就轻松解决,根本就不需要复杂的分区机制;

物联网数据流是相对平稳的,而且物联网设备本身一定有缓存能力,完全可以抛弃Kafka这些套件,实现一个简单的消息队列和数据订阅来满足需求。

随后又发现有时序数据库,马上看他们文档和代码,发现他们利用了时序数据一些特点,但还是没有充分利用,而且只是定位为一个数据库。

后面又了解到工业界有实时数据库,发现这些实时数据库都是老古董产品了,基本上都还是Windows上研发,价格贵,而且没有标准SQL,水平扩展几乎没有,大数据分析能力几乎没有,完全没有能力应对日益增长的大数据量和大数据分析需求,迟早会被淘汰。

一个分布式高可靠、持久化存储的消息队列,每台手机需要推送的消息就放在一个队列里。消息队列与物联网的时序数据有区别吗?本质上没有。

一个是非结构化的,一个是结构化的;

一个是简单的进和出,但另外一个是需要有分析和计算的;

两者在系统的架构设计上没有大的不同。

因此TDengine迅速定位了自己要做的产品,那就是物联网大数据平台,要把时序数据库、缓存、消息订阅、流式计算等系列功能融合在一起,一站式的解决物联网大数据问题,这样才能将系统研发、维护的复杂度与成本大幅降低。

研究完物联网数据的特点后,TDengine做了两个技术创新点,

2.TDengine的开源协议

TDengine目前已经在GitHub上进行了开源。采用是AGPL许可。AGPL的全称为:GNU Affero General Public License,是GPL的一个补充,在GPL的基础上加了一些限制。

开源项目地址:https://github.com/taosdata/TDengine

3.TDengine的优势

  • 10 倍以上的性能提升:定义了创新的数据存储结构,单核每秒能处理至少 2 万次请求,插入数百万个数据点,读出一千万以上数据点,比现有通用数据库快十倍以上。

  • 硬件或云服务成本降至 1/5:由于超强性能,计算资源不到通用大数据方案的 1/5;通过列式存储和先进的压缩算法,存储占用不到通用数据库的 1/10。

  • 全栈时序数据处理引擎:将数据库、消息队列、缓存、流式计算等功能融合,应用无需再集成Kafka/Redis/HBase/Spark/HDFS 等软件,大幅降低应用开发和维护的复杂度成本。与第三方工具无缝连接:不用一行代码,即可与 Telegraf, Grafana, Matlab, R 集成。后续将支持 MQTT, OPC, Hadoop,Spark等, BI工具也将无缝连接。

  • 强大的分析功能:无论是十年前还是一秒钟前的数据,指定时间范围即可查询。数据可在时间轴上或多个设备上进行聚合。即席查询可通过 Shell, Python, R, MATLAB 随时进行。

  • 高可用性和水平扩展:通过分布式架构和一致性算法,通过多复制和集群特性,TDengine确保了高可用性和水平扩展性以支持关键任务应用程序。

  • 零运维成本、零学习成本:安装集群简单快捷,无需分库分表,实时备份。类似标准 SQL,支持 RESTful,支持 Python/Java/C/C++/C#/Go/Node.js, 与 MySQL 相似,零学习成本。

  • 核心开源:除了一些辅助功能外,TDengine的核心是开源的。企业再也不会被数据库绑定了。这使生态更加强大,产品更加稳定,开发者社区更加活跃。

4.TDengine的适用场景

TDengine作为一个基础性的软件,应用范围及其广泛,原则上,所有使用机器、设备、传感器采集数据的地方都可以用上。

一些典型场景罗列如下:

  • 公共安全:上网记录、通话记录、个体追踪、区间筛选

  • 电力行业:智能电表、电网、发电设备的集中监测

  • 通讯行业:话费详单、用户行为、基站/通讯设备监测

  • 金融行业:交易记录、存取记录、ATM、POS 机监测

  • 出行工具:火车/汽车/出租/飞机/自行车的实时监测

  • 交通行业:实时路况,路口流量监测,卡口数据;

  • 石油石化:油井、运输管线、运输车队的实时监测

  • 互联网: 服务器/应用监测、用户访问日志、广告点击日志

  • 物流行业:车辆、集装箱的追踪监测

  • 环境监测:天气、空气、水文、地质环境等监测;

  • 物联网: 电梯、锅炉、机械、水表、气表等各种联网设备

  • 军工行业:各种军事装备的数据采集、存储

  • 制造业: 生产过程管控,流程数据、供应链数据采集与分析

5.TDengine的特点

  • 专为物联网数据而设计,利用物联网数据时序性的特点,实现每个采集点对应一个表的这一功能。但其不适用于处理通用的互联网数据。

  • 采用列式存储+压缩的方式,以节省硬件成本。(压缩效率高:利用物联网数据变化波动不大的特性、dif插值后压缩,然后二阶压缩,效率很高。)

  • 支持高可用性,将每个物理节点划分为多个虚拟数据节点和虚拟管理节点。虚拟数据节点存储数据,虚拟管理节点管理MetaData。虚拟数据节点和虚拟管理节点分布在不同的物理节点上实现数据集应用的高可用。

  • 存储结构上,采用每个采集点创建一个独立的表的方式来存储。这样实现每个采集点的数据的连续存放,提升读取效率。由于每个表的数据来源只有一个,能够实现无锁写入,提升写入速率。

  • 针对多变的聚合,引入了超级表的概念。同一类型的采集设备可以创建一张超级表。在创建超级表时,可以对这类表指定标签,在查询的时候通过标签来对数据库中的表进行过滤,这样即使数据库中有非常多的表,也可以实现快速的多表聚合。

  • 安装包非常小,安装使用简单。支持SQL,语法与MySQL类似。

二、TDengine 安装

安装包地址:https://www.taosdata.com/all-downloads

代码案例地址: https://www.cnblogs.com/jason-dong/p/13127459.html

1.安装步骤

准备工作:要主机名映射(/etc/hosts)

解压:TDengine-server-2.4.0.10-Linux-x64.tar.gz解压的文件夹下有个install.sh命令,直接运行即可;

linux默认安装位置:/etc/taos/

这里已经安装好了,已经可以启动使用了(默认端口6030),安装就是这么简单!!!

systemctl start taosd //启动

systemctl status taosd //查看状态

systemctl stop taosd //停止

#进入taos 默认用户名root 默认密码taosdata

taos -u root -p

CREATE TABLE taos001 (ts timestamp, id int, name NCHAR(255), sex BOOL);

TDengine 在 SQL 层面并没有提供修改与删除操作的语句,即不存在 UPDATE , DELETE 语句

TDengine默认配置下数据不可更新!

TDengine默认配置下数据存储10年!

CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1];

KEEP是该数据库的数据保留多长天数,缺省是3650天(10年),数据库会自动删除超过时限的数据;

UPDATE 标志数据库支持更新相同时间戳数据;

建库时不指定 update 参数,则 update 默认为0,表示数据不可修改(相同时间戳的数据直接被丢弃)。

可通过 update 参数配置为可修改,但是在修改时,要求时间戳必须一样,其他字段才能修改成功(显然,时间戳无法修改~)。(即:根据时间戳,后来的值把前面的字节覆盖,数据还是一条)

卸载命令:rmtaos

但实际操作过后 发现卸载后再重新安装,启动还是有问题,后来卸载后,使用find / -name 'taos*'找到所有taos文件夹,删除后再安装就没问题了(实际应用时绝对不可以使用这种操作)

2.TDengine支持的数据类型

三、Spark操作TDengine

1.pom依赖

<!-- https://mvnrepository.com/artifact/com.taosdata.jdbc/taos-jdbcdriver -->
<dependency>
    <groupId>com.taosdata.jdbc</groupId>
    <artifactId>taos-jdbcdriver</artifactId>
    <version>2.0.36</version>
</dependency>

2.SparkDataFrame读写TDengine

object TDengineRead {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("testTDengineRead")
      .master("local")
      .getOrCreate()

    val driver = "com.taosdata.jdbc.TSDBDriver"
    val userName = "root"
    val password = "taosdata"
    val url = "jdbc:TAOS://192.168.1.1:6030/test"

    val sql = "select * from taos001 "
    val dbtable = "( " + sql + ") temp"
    
    val df1 = spark.createDataFrame(
      Seq(("2023-02-02 11:20:28.125", "5", "ming5", "true"),
        ("2023-02-02 10:20:21", "2", "hong", "true"),
        ("2023-02-02 13:20:22", "3", "zhi", "false")
      )).toDF("ts", "id", "name", "sex")
    df1.show()
    
    println("=========================")

    val properties = new Properties()
    properties.setProperty("user", userName)
    properties.setProperty("password", password)
    properties.setProperty("driver", driver)
    df1.write.mode(SaveMode.Append).jdbc(url, "taos001", properties)
    
    val df2 = spark.read.format("jdbc")
      .option("url", url)
      .option("driver", driver)
      .option("dbtable", dbtable)
      .option("user", userName)
      .option("password", password)
      .option("fetchsize", "500000")
      .load()
    df2.show()    
  }
}

四、常见错误:

1. TDengine ERROR (8000000b): Unable to establish connection

记得做映射

https://blog.csdn.net/weixin_43700866/article/details/126506610

https://blog.csdn.net/L_Mr_ll/article/details/123692825

https://blog.csdn.net/kangweijian/article/details/126733066

https://blog.csdn.net/qq_26525215/article/details/122435176

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman form-data、x-www-form-urlencoded的区别

我们在平时的postman请求调试&#xff0c;以及web的http请求开发时&#xff0c;常常能看到以下几种传参的形式 form-data、x-www-form-urlencoded、raw、binary&#xff0c;那么这些请求方式的区别是什么呢&#xff1f; 1、form-data: 就是http请求中的multipart/form-data,它…

一文读懂!2023量子计算行业发展方向

&#xff08;图片来源&#xff1a;网络&#xff09;量子计算是一个引人入胜的主题&#xff0c;放眼全球&#xff0c;很多文章报道了商业量子计算的项目和应用&#xff0c;关于量子计算行业在2023年的可能发展方向&#xff0c;本文从大量文章中筛选罗列了一些主要发展方向。McKi…

postman生成测试报告

一、newman插件生成测试报告安装nodejs官网下载适合自己设备的包&#xff0c;下载后直接傻瓜式安装&#xff1b;安装完成验证&#xff1a;打开终端&#xff0c;输入 node -v&#xff0c;即可查看安装版本&#xff1b;安装newman安装好nodejs后&#xff0c;通过npm来安装newman&…

VueJS 基础之组件

文章目录参考描述组件化开发组成templatescriptstylemain.js使用嵌套关系组件的使用LeftRight举个栗子全局组件及私有组件私有组件全局组件举个栗子main.jsApp.vue参考 项目描述VueJS官方文档搜索引擎Bing哔哩哔哩黑马程序员 描述 项目描述Edge109.0.1518.70 (正式版本) (64 …

计算机网路6-详述网路层:数据交换、路由算法和协议、网络协议

一、网络层基本概念 1、主要任务 把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务 2、网络层传输单位--数据报 数据报与分组之间关系&#xff1a; 分组是数据报通过切割划分出来的一个片段&#xff0c;多个分组组成数据报 3、网络层的几大功能 路…

LeetCode-122. 买卖股票的最佳时机 II

目录暴力递归动态规划贪心题目来源 122. 买卖股票的最佳时机 II 暴力递归 根据题意&#xff1a;由于不限制交易次数&#xff0c;在每一天&#xff0c;就可以根据当前是否持有股票选择相应的操作。「暴力搜索」在树形问题里也叫「回溯搜索」、「回溯法」。 首先画出树形图&…

如何实现报表集成?(二)——用户同步和单点登录

在上一篇&#xff0c;我们对报表集成进行了一个整体的介绍&#xff0c;从报表集成的背景、痛点、需求、集成架构等几个方面进行了阐述。 这一篇&#xff0c;我们来聊一下用户同步和单点登录。行文过程中得到了来自报表软件厂商 Smartbi 的报表产品&#xff1a;电子表格软件的协…

c++11 标准模板(STL)(std::multiset)(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class multiset;(1)namespace pmr { template <class Key, class Compare std::less<Key>> usi…

怎么给视频配音好听?这些好方法快学起来

应该不少小伙伴每天都会刷各种短视频&#xff0c;有些视频很搞笑&#xff0c;有些却很无趣&#xff0c;让人想直接的划走。很多制作短视频的小伙伴应该都知道&#xff0c;很多视频都需要配音来衬托&#xff0c;吸引别人的眼球。当你想给自己的视频配上好听的声音&#xff0c;但…

QT/C++——网络编程

目录 一、基础知识复习 二、UDP 客户端&#xff1a; 服务器&#xff1a; 三、TCP 服务器&#xff1a; 客户端&#xff1a; 四、小项目 客户端&#xff1a; 服务器&#xff1a; 一、基础知识复习 这部分内容前面讲的比较详细&#xff0c;现在就是简单复习一下。 两台主…

OAuth2授权机制介绍指南

目录 一、什么是OAuth2&#xff1f; 二、OAuth2中有哪些角色&#xff1f; 三、OAuth2的授权流程&#xff1f; 四、OAuth2令牌的特点&#xff1f; 五、OAuth2有哪些授权方式&#xff1f; 5.1 授权码 5.2 隐藏方式 5.3 密码方式 5.4 凭证方式 一、什么是OAuth2&#xff1f; …

PowerCLi 批量多esxi主机创建登陆用户

官网PowerCLI参数配置参考 New-VMHostAccount 创建用户参考New-VIRole 创建权限组参考Get-VIPrivilege 查询所有角色层配置信息参考创建esxi登陆用户一键脚本,目前只能单

2023年软考报哪门比较好?

2023年软考报名还有一个月左右就会启动了&#xff0c;大家有想好报考哪门吗&#xff1f;不妨看看下文&#xff0c;让你的思路更加清晰。 软考科目汇总&#xff1a; (1)高级资格&#xff1a;网络规划设计师、系统规划与管理师、系统架构设计师、信息系统项目管理师、系统分析师…

磨金石教育技能干货分享|年味摄影作品选登:你的春节怎么过的

要问年味是什么&#xff1f;味&#xff0c;是一种感觉&#xff0c;年味就是&#xff1a;除夕夜里&#xff0c;红灯笼挂满街道&#xff0c;各种年货摆满长街。各种美食充满餐桌&#xff0c;亲人团聚&#xff0c;欢笑一堂。这种让人放松、快乐的感觉就是过年特有的味道。最近由长…

MySQL(一)

性能监控 使用show profile查询剖析工具&#xff0c;可以指定具体的type type all&#xff1a;显示所有性能信息 show profile all for query n block io&#xff1a;显示块io操作的次数 show profile block io for query n context switches&#xff1a;显示上下文切换次数&a…

【算法基础】整数二分查找法

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞…

[golang Web开发] 1.golang web开发简介以及web服务器的搭建以及http协议简介

一.web开发简介 1.简介 Web应用在我们的生活中无处不在,看看我们日常使用的各个应用程序,它们要么是 Web应用&#xff0c;要么是移动 App 这类 web应用的变种,无论哪一种编程语言&#xff0c;只要它能够开发出与人类交互的软件&#xff0c;它就必然会支持 Web应用开发,对一门崭…

高精度压缩Transformer,NNI剪枝一站式指南

无论在学术界还是产业界&#xff0c;今年人工智能大模型都是爆款话题。但面对这些动不动就数十亿级别参数的模型&#xff0c;使用传统方法微调&#xff0c;宛如水中捞月、海底捞针。作为微软亚洲研究院为科研人员和算法工程师量身定制的一站式 AutoML&#xff08;自动机器学习&…

Vertical-align属性值区分

先简单看一下官方文档上的Vertical-align这些属性值的描述&#xff0c;虽然只有简单的描述&#xff0c;但其实描述的很清楚&#xff0c;但有时只看文字并不能很好的理解其含义。 下面结合代码图说明&#xff1a; 首先&#xff0c;我建造了一个背景颜色为绿色的div盒子&#xf…

9、app稳定性测试之monkey工具使用

简介 方法:利用Monkey工具,选择某些场景做持续反复操作,以衡量系统的稳定性 工具: monkey 友盟埋点 日志分析工具 系统监控工具GT 场景: * 随机测试 可以用monkey模拟 * 多个运行中app切换测试&#xff1b; * 各种事件打扰&#xff0c;如插拔数据线、电话打扰、收…