网上商城选择hive还是mysql作为数据存储工具?为什么。

根据 2022 年最新 DB-engines排名,主流时序数据库依然是 InfluxDB、Prometheus 等。但从排行上升趋势不难看出,近一年新的时序数据库崭露头角,这也说明企业技术选型的方向也越来越多。

如何做好时序数据库的选择,也是困扰众多企业的根本问题。数据迁移的难度、后期运维的成本、更甚至是物理条件的限制等等一系列问题都会成为阻碍企业发展的一道不可逾越的鸿沟。TDengine 作为一款集群版都开源的时序数据库,近几年也帮助很多大厂完成了技术选型和企业数据的迁移。如果你正在为技术选型而头秃,不妨循着前人的脚步进行一番探索。

作为众多公司的最终选择,TDengine 能脱颖而出的根本原因还是在于其技术的完备。大数据有很多处理工具,例如 HBase,Hive,YARN,Storm,Spark 等系列工具。整个大数据平台中往往还有 Kafka,Redis 等类似的消息队列、缓存软件。这些软件较好的解决了通用大数据问题,但是物联网、车联网、工业互联网等场景的数据有其独特性,充分利用这些独特之处,必定可以使数据处理有数量级的提升,并且大大减少研发和运维成本。

TDengine 专为物联网、车联网等时序空间大数据设计,其核心功能是时序数据库。但为减少大数据平台的研发和运维的复杂度,更进一步降低计算资源,TDengine 还提供大数据处理所需要的消息队列、消息订阅、缓存、等功能。TDengine 的优势十分明显,主要表现在以下几个方面:

1. 大幅提升数据插入和查询性能

物联网的数据是结构化的,因此 TDengine 采取的是结构化存储,而不是流行的 KV 存储。物联网场景里,每个数据采集点的数据源是唯一的,数据是时序的,而且用户关心的往往是一个时间段的数据,而不是某个特殊时间点。基于这些特点,TDengine 要求对每个采集设备单独建表。如果有 1000 万个设备,就需要建 1000 万张表。

基于这样的设计,任何一台设备采集的数据在存储介质里可以是一块一块连续的存放的,而且按照时间排序。因此查询单个设备一个时间段的数据,查询性能就有数量级的提升。另外一方面,虽然不同设备由于网络的原因,到达服务器的时间无法控制,是完全乱序的,但对于同一个设备而言,数据点的时序是保证的。一个设备一张表,就保证了一张表插入的数据是有时序保证的,这样数据插入操作就变成了一个简单的追加操作,插入性也能大幅度提高。

KV 存储的好处是不用定义数据库表结构,每条记录都可以变换格式。但在物联网、车联网这些场景里,一般数据格式是固定的,改动的频次很低,而且 TDengine 实现了一种高效的修改表结构的方法,因此 TDengine 采取格式化存储不会带来太大的不便。

2. 大幅降低硬件或云服务成本

由于数据插入查询性能大幅度提升,系统所需要的计算资源就大幅减少。另外一方面,物联网采集的物理量的值是随时间改变的,但正常情况下,是渐变的,因此 TDengine 采取列式存储,将同一个物理量在多个时间点采集的值连续存放,这样能成倍的提高压缩效率。而且 TDengine 针对不同的数据类型采取不同的压缩方法,比如 delta-delta 编码、simple 8B 方法、zig-zag 等等,这样更进一步的提高。与通用数据库相比,在已经测试过的物联网场景中,TDengine存储空间不到 1/5,大幅节省存储资源。在 TDengine 公布的对比测试报告里,有如下的结果:

3. 大幅简化大数据系统架构

与互联网应用不一样的是,物联网场景中,只要指定联网设备数量,数据采集频次,系统所需要的流量就可以较为准确地估算出来,不像双 11,电商的流量可以几十倍的变化,而物联网的流量则较为平稳。同时,物联网设备都有一定的数据缓存能力,以防止网络连接失败,因此物联网平台对消息队列的需求没有那么强烈。TDengine 内部实现了一简单的消息队列,同时提供订阅功能,这样就不需要使用 Kafka 等类似的消息队列软件了。

TDengine 对数据库分配了固定的内存区域,新插入的数据,会先写入内存。内存按照先进先出的原则进行管理,内存不足时,老的数据会被持久化存储,而内存里的老数据会被最新的覆盖掉。TDengine 还保证了任何一台设备最后一条记录一定在内存中,如果应用要获取每个设备的最新数据或状态,都将从内存里直接获取,这样的设计让系统可以不再需要 Redis 这类软件。

因此 TDengine提供了大数据处理所需要的数据库、缓存、消息队列、流式计算等系列功能。使用TDengine,在物联网大数据平台中完全可以抛弃掉Kafka、HDFS、HBase、Spark和Redis等软件,大幅简化大数据平台的设计,降低研发成本大,而且系统将更加健壮,数据的一致性更有保证。

因此 TDengine 提供了大数据处理所需要的数据库、缓存、消息队列、流式计算等系列功能。使用 TDengine,在物联网大数据平台中完全可以抛弃掉 Kafka、HDFS、HBase、Spark 和 Redis 等软件,大幅简化大数据平台的设计,降低研发成本大,而且系统将更加健壮,数据的一致性更有保证。

4. 强大的历史数据分析能力

TDengine 设计上让用户对历史数据和实时数据的处理完全透明,不区分历史数据和实时数据。用户只需要在 SQL 语句里指定时间段,TDengine 自动决定是否从内存、从本地硬盘,还是从网络存储上获取数据,这样应用的实现变的简单。

每个设备的数据按块存储,而且每个数据块都已经做了预聚合(比如和、最大、最小值等),这样执行一个设备一个时间段的各种统计操作,有可能不用扫描原始数据,就能计算出来,性能大幅提升。即使有的计算需要扫描原始数据,但由于数据是一块一块连续存储的,读取速度远超通用数据库,计算分析速度也是大幅提升。而且由于结构化存储,解压后,不用做任何解析,读进内存就可以直接计算,相对于 NoSQL 数据库,计算分析速度也是大幅提升。

TDengine 定义了一新的概念——超级表,用以描述同一类型的设备。给每个设备或表打上静态标签后,就可以用标签值筛出一部分满足过滤条件的设备,然后对这一部分设备的数据进行聚合。TDengine 还设计了一特殊的机制,对于多个设备数据聚合,仅仅需要扫描一次数据文件,这样大幅减少IO操作次数,提高聚合计算速度。为提高易用性,用户可以通过 TDengine 自带的 shell,或者 Python、R、Matlab 等工具直接进行各种 Ad-Hoc 的查询或分析。TDengine 用来做物联网、车联网、工业互联网的数据仓库,会是一个理想的选择。

5. 零运维管理,零学习成本

TDengine 安装包很小,下载、安装几秒钟搞定。对于企业版,把一台机器加入集群一条命令就能完成,而且数据库是实时自动备份,不用手动分库分表,运维极其简单。系统使用标准的 SQL,支持 C/C++、Java、Python 和 Go 等各种语言开发接口,支持 JDBC,支持 RESTful 接口。使用起来就像是在使用MySQL,几乎不需要学习成本。

6. 与第三方工具无缝集成

目前 TDengine 在数据采集侧,已经支持 Telegraf、Kafka,后续还将支持 MQTT、OPC 等。在应用侧,已经支持 Grafana 可视化工具,支持 Matlab,R 以及一些 BI 工具。因为 TDengine 支持 JDBC 接口,很容易实现与第三方工具的接口,可以预见,更多的工具将会被无缝集成。

对于运维监测场景,不用写任何代码,只要将开源的 Telegraf、Grafana与TDengine配置好,就可以迅速搭建一个高效的运维监测平台。

TDengine 由北京涛思数据技术有限公司自主开发,没有依赖任何第三方软件。研发时间已经超过 2 年,而且已经有一批付费商业客户,涉及电力、数控机床、智慧城市、车辆网等多个领域,客户的使用反馈都很不错。可喜的是,涛思数据将 TDengine 的核心存储、计算引擎完全开源。TDengine 的社区版完全能满足一定规模的物联网、车联网、工业互联网的应用需求。因为涛思数据核心团队就在北京,相比其他开源软件,应该能够给中国的软件工程师提供更好的本地服务。

对比其他时序数据库,TDengine 在易用性、功能上、性能上有明显的优势。采用 TDengine,让物联网、工业互联网、运维监测的大数据平台的搭建变得极为简单,具备超强性能,不仅降低硬件成本、运维成本,还能大幅降低对研发和运维人员的需求。

}

关于批次间隔需要结合业务来确定的,如果实时性要求高,批次间隔需要调小。

每个批次的数据量是和每天产生的数据量有直接关系,在计算的时候需要考虑峰值的情况。需要注意的是,批次间隔越长,每个批次计算的数据量会越多。

在默认情况下,Spark Streaming 通过receiver或者Direct方式以生产者生产数据的速率接收数据。当 batch processing time > batch interval 的时候,也就是每个批次数据处理的时间要比 Spark Streaming 批处理间隔时间长。越来越多的数据被接收,但是数据的处理速度没有跟上,导致系统开始出现数据堆积,可能进一步导致

处理的记录条数以及处理完成事件来估算出一个速率;这个速率主要用于更新流每秒能够处理的最大记录的条数。速率估算器(RateEstimator)可以又多种实现,不过目前的 Spark 2.2 只实现了基于 PID 的速率估算器。● InputDStreams 内部的 RateController 里面会存下计算好的最大速率,这个速率会在处理完 onBatchCompleted

启用反压机制时每个接收器接收第一批数据的初始最大速率。默认值没有设置。● spark.streaming.backpressure.rateEstimator:速率估算器类,默认值为 pid ,目前 Spark 只支持这个,大家可以根据自己的需要实现。●

以上为Spark的反压机制,再结合Spark资源的动态调整(在下面的题中有详细解释),就是该问题的完整解决方案

批次间隔为SparkStreaming处理实时需求的时间间隔,需要根据业务需求来确定批次间隔。

实时需求的处理结果一般是保存在能快速读取的数据库中来提高效率,比如Redis、MongoDB、HBase。

该问题一定要根据业务需求来确定,比如要实现的需求为:统计每分钟的前一个小时的在线人数。

上面需求的窗口大小(窗口长度)为1小时,然后再统计每个窗口需要处理的数据量。

窗口处理的数据量 = 每个批次处理的平均数据量 * 窗口的批次数量

2.6.3.7 MySQL的数据如何被Spark Streaming消费,假如:MySQL中用户名为张三,Spark已经消费了,但是此时我的名字改为了张小三,怎么办?如何同步?

Spark Streaming是批处理,每个批次的计算方式都是从MySQL中消费到数据进行统计,得到结果后会紧接着将结果持久化到对应的数据库,此时如果MySQL的某个字段值更新了,更新的值是无法影响以前批次的Streaming的结果的,只能影响以后批次的结果。除非是将之前的结果覆盖操作。

Spark Streaming 是微批处理,运行的时候需要指定批处理的时间,每次运行 job 时处理一个批次的数据

Flink 是基于事件驱动的,事件可以理解为消息。事件驱动的应用程序是一种状态应用程序,它会从一个或者多个流中注入事件,通过触发计算更新状态,或外部动作对注入的事件作出反应。

以上两种模型编程机构近似,只是在 api 和内部数据获取有些区别,新版本的已经取消了基于 receiver 这种模式,企业中通常采用基于 direct Dstream 的模式。

通过以上代码我们可以 get 到:

Flink 与 kafka 结合是事件驱动,大家可能对此会有疑问,消费 kafka 的数据调用 poll 的时候是批量获取数据的(可以设置批处理大小和超时时间),这就不能叫做事件触发了。而实际上,flink 内部对 poll 出来的数据进行了整理,然后逐条 emit,形成了事件触发的机制。 下面的代码是 flink 整合 kafka 作为 data source 和 data sink:

Spark Streaming 任务如上文提到的是基于微批处理的,实际上每个批次都是一个 Spark Core 的任务。对于编码完成的 Spark Core 任务在生成到最终执行结束主要包括以下几个部分:

Slot 的集群上运行。

可以看出 flink 的拓扑生成提交执行之后,除非故障,否则拓扑部件执行位置不变,并行度由每一个算子并行度决定,类似于 storm。而 spark Streaming 是每个批次都会根据数据本地性和资源情况进行调度,无固定的执行拓扑结构。 flink 是数据在拓扑结构里流动执行,而 Spark Streaming 则是对数据缓存批次并行处理。

流处理程序在时间概念上总共有三个时间概念:

处理时间是指每台机器的系统时间,当流程序采用处理时间时将使用运行各个运算符实例的机器时间。处理时间是最简单的时间概念,不需要流和机器之间的协调,它能提供最好的性能和最低延迟。然而在分布式和异步环境中,处理时间不能提供消息事件的时序性保证,因为它受到消息传输延迟,消息在算子之间流动的速度等方面制约。

事件时间是指事件在其设备上发生的时间,这个时间在事件进入 flink 之前已经嵌入事件,然后 flink 可以提取该时间。基于事件时间进行处理的流程序可以保证事件在处理的时候的顺序性,但是基于事件时间的应用程序必须要结合 watermark 机制。基于事件时间的处理往往有一定的滞后性,因为它需要等待后续事件和处理无序事件,对于时间敏感的应用使用的时候要慎重考虑。

注入时间是事件注入到 flink 的时间。事件在 source 算子处获取 source 的当前时间作为事件注入时间,后续的基于时间的处理算子会使用该时间处理数据。

相比于事件时间,注入时间不能够处理无序事件或者滞后事件,但是应用程序无序指定如何生成 watermark。在内部注入时间程序的处理和事件时间类似,但是时间戳分配和 watermark 生成都是自动的。

flink 支持三种时间机制:事件时间,注入时间,处理时间,同时支持 watermark 机制处理滞后数据。

对于 Spark Streaming 任务,我们可以设置 checkpoint,然后假如发生故障并重启,我们可以从上次 checkpoint 之处恢复,但是这个行为只能使得数据不丢失,可能会重复处理,不能做到恰一次处理语义。

之前会导致数据多次处理,这个时候我们需要保证处理结果多次输出不影响正常的业务。

由此可以分析,假设要保证数据恰一次处理语义,那么结果输出和 offset 提交必须在一个事务内完成。在这里有以下三种做法:

  • 将结果和 offset绑定到 一起提交

也就是结果数据包含 offset。这样提交结果和提交 offset 就是一个操作完成,不会数据丢失,也不会重复处理。故障恢复的时候可以利用上次提交结果带的 offset。

若要 sink 支持仅一次语义,必须以事务的方式写数据到 Kafka,这样当提交事务时两次 checkpoint 间的所有写入操作作为一个事务被提交。这确保了出现故障或崩溃时这些写入操作能够被回滚。

在一个分布式且含有多个并发执行 sink 的应用中,仅仅执行单次提交或回滚是不够的,因为所有组件都必须对这些提交或回滚达成共识,这样才能保证得到一致性的结果。Flink 使用两阶段提交协议以及预提交(pre-commit)阶段来解决这个问题。

}

我要回帖

更多关于 mysql数据存储 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信