数据仓库发展历史与架构演进

news2024/11/25 22:47:24

 从1990年代Bill Inmon提出数据仓库概念后经过四十多的发展,经历了早期的PC时代、互联网时代、移动互联网时代再到当前的云计算时代,但是数据仓库的构建目标基本没有变化,都是为了支持企业或者用户的决策分析,包括运营报表、企业营销、用户画像、BI分析等。

广义上看数据库仓库并不是一项技术或者产品而是数据处理过程,从不同的数据源进行数据汇合,然后经过数据的统一建模成适合于分析的数据模型,最终辅助企业的决策分析。这个过程涉及到ETL、数据建模及数据可视化等一系列实现,这也是与数据库的本质区别。

随着计算机科学技术发展与产业变革,数据仓库在应对从数据特征呈现多样化、海量化到业务特征复杂化、智能化及实时化等,再到基础设施(存储、网络及计算资源)能力的提升、云计算技术的发展等变化,数仓的整个体系也在持续演进中,这里从数据仓库的系统架构及内核引擎的实现角度去分析数据仓库的发展过程,基本上如下图所示:

从数仓的核心能力去分析各个阶段实现的变化,我将重点分析以下几个方面:

  • 存储引擎:主要是数据的组织方式,定义了数据如何存储及压缩、索引的创建和更新、锁机制、事务及缓存管理等。在数仓中数据是面向主题的将数据进行整理归纳和重组,这是提高数据分析性能的核心,在分析过程只需要处理部分维度的数据,并且大量的统计任务需要进行数据的扫描或者精确检索,因此存储引擎的合理设计是数仓架构发展的重要部分。
  • 计算引擎:分析型任务涉及到大量的计算,计算效率往往会成为数据库系统的瓶颈,计算模型(框架)、优化技术、和运行中间数据的处理等都是数仓演进的突破点。MPP计算、分布式流计算、分布式批计算等都有相应的使用场景,在具体的算子执行过程中向量计算、编译执行及硬件加速技术等都是近年有效的提升性能的方法。
  • 技术实现架构,数据库可以基于功能分为存储、计算及管理等层次,这些功能的运行机制影响着系统的灵活性、可运维性、成本及分析的性能等。云计算的出现为数仓架构的演进提供了新的方向,赋予数仓获得自服务、弹性等能力,同时目前企业将基础系统、平台部署到云端降低信息化建设成本及优化运行管理流程等成为趋势。

数据仓库的演进变革的因素有很多,例如快速的业务模式与群体规模的数据量带来的大数据处理技术、互联网的发展带来的数据源及数据类型的增多、人工智能的发展带来数智的融合、云计算交付模式的出现需要的细粒度的资源管理与隔离等,业务实时性的要求等都会带来数据仓库架构的变化。这里只分析不同阶段数据仓库的核心特性的变化,其他的内容可以逐步分析。

1.初代数仓(单体分析型数据库)

这个阶段是数据仓库概念提出后,数据库厂商传统数据库的基础上结合数仓方法论提供的数仓产品。在这个阶段数仓的数据来自于CRM、ERP等业务数据,数据量小多GB级别,数据类型基本上是结构化数据,而且产生的周期按天或者周为单位,因此对数据仓库的要求不高,基本上是单机(性能较高的商用主机,例如中小型机器)分析型数据库,以Oracle、DB2、SQL Server、SybaseIQ等为代表。

这些数据仓库产品从本质上是关系型数据库,使用ETL工具实现多种异构数据源的有效集成与处理,并按照主题的方式进行数据进行重新整合,即按照数仓的维度模型进行归一化构建。这些数据库的设计是为了决策分析而进行的,例如使用位图化索引、按列存储、数据压缩及与众不同的锁机制,这些特性都极大提高了查询引擎的性能。这个阶段的数据仓库主要集中在金融、电信、大型零食及制造等行业。

2.传统MPP数据仓库

随着业务的发展,单机数据仓库的数据存储和计算模式不能满足大量数据处理的需求,在这个背景下基于MPP架构的数据仓库成为主流的解决方案,这阶段的数仓产品以在2000年代后出现的Teradata、Greenplum、Vertica等为代表。MPP(Massively Parallel Processing),大规模并行处理架构,更适合于复杂的数据处理和综合分析,典型实现如下图所示:

这种架构主要的特征如下:

  • Shared Nothing,节点之间不共享存储、计算资源和磁盘,节点之间仅通过网络通信。
  • 数据按照特定的规则进行本地化存储,例如基于特定分布式键上按照Hash规则分布到全部节点上。
  • 完全对称的并行执行策略,每个节点都参与计算,并且节点上执行的任务逻辑完全一致。
  • 任务按照流水线的方式进行组织执行,任务之间数据的传递以流水线的方式来进行,数据的流转在内存中进行,避免了数据积压的时间开销。任务的流水线执行使得MPP数据库具有优异的性能。

这种架构可以实现横向扩展的方式,使用普通主机就可以构建较大规模的集群系统,通过并行化来实现快速的分析任务的快速执行,同时更具有成本优势。

在这个阶段的MPP架构在技术实现基于传统数据库实例进行扩展,例如Greenplum、ADB for PG等都是基于PostgreSQL内核进行开发,在集群中每个节点都是一个独立的数据库实例,具有独立的系统表、用户表等,数据是按照某种策略分布到不同的实例中。客户端在发起请求后由管理节点生成查询计划并进行并行化调度,当涉及到多个节点的数据交换时,例如HashJoin的执行,引入数据交换算子,如下图所示:

管理节点分布到每个节点的查询计划是相同的,在执行时如果需要每个节点扫描自己所在节点的数据,当需要进行数据交换时调用Motion算子发送到其他节点,例如Join计算中符合过滤条件的右表数据,最后在管理节点上通过GatherMotion进行查询结果的汇总。

MPP数仓它是整体向外提供服务,每台节点无法单独运行局部数据,数据在存储时通过一定的策略进行分布,存储位置是不透明的,因此在执行任务时由于无法断定数据的位置,导致任务会在所有节点上执行,同时在计算过程中涉及到锁、事务、内外存交互等问题,所以当数据达到一定规模后就会出现性能的瓶颈问题。当集群或者数据量达到一定程度后,节点的故障成本较高,查询任务在某个节点故障时需要重启整个任务。

另一个缺点是存算耦合的架构,节点进行扩缩容时需要进行数据的重新分布,整个操作的过程会由于耗费大量IO请求引起业务处理速度的下降,影响客户的正常查询需求,最后是无法动态适应业务的发展。对于不同的请求,例如导入类任务耗费大量IO、网络带宽,但是CPU的使用率较低。复杂的查询任务CPU的资源消耗非常大,因此资源规格的需求是不同的,但是MPP架构很难满足这些需求。因此这种架构的数仓集群的规模不能太大,适用于中等规模的企业数据处理场景,通常不超过数百级别,因此支持的数据体量很少超过PB级别。

3.大数据OLAP引擎

随着移动互联网、物联网的蓬勃发展带动了大数据的发展,数据处理种类的多样化、数据量不断变大、快速的数据流转等对系统有了新的要求,大数据框架从底层数据存储机制、计算模型(分布式批处理、内存及流计算等)到数据的集成等都发生了革命性的变化。其中Hadoop生态技术被广泛使用,数据仓库在大数据背景下建设的理论和目标是相同的。

根据大数据架构模式可以分为三个方向如下图所示:

  • 大数据数仓

传统的MPP数据仓库的出现是为了解决大数据量和性能的问题,但是随着大数据的发展,需要产生新的大数据处理技术和架构模式。在存储引擎上以HDFS为代表的分布式存储、在计算框架上出现了MR、Spark(DAG)和Flink等。

MapReduce计算框架

DAG计算框架

基于大数据构建等数仓产品很多,例如Hive、Kylin等,这些产品使用大数据的计算框架、底层直接读取文件系统中的数据,如下图所示:

这些数仓可以看到做事传统数仓各个引擎部分替换成大数据体系中的组件,在Hive中执行引擎替换成MapReduce及存储引擎替换成HDFS,为了增加实时性减少数据的落地执行引擎集成了Spark。

大数据数仓产品并不是某个单独运行的产品,而是一系列大数据组件遵循数据的处理流程的“范式”,例如离线数仓、流式数仓、实时数仓Lambda架构或者实时数仓Kappa架构在大数据组件的使用及数据的流转上是不同的,这里以Lambda为例,架构为例:

Kappa架构与Lamda架构相比更多关注于流处理部分,但是在真实中用户并不会完全遵循规范的架构而是进行混合使用,在近年还提出的IOTA的架构模式,基于AI生态下的全新的数据架构模式。

大数据数仓是一个松散的遵循某种规范的系统套件组合,涉及到数据的传输、计算(批处理、流处理)、存储及服务等组件,其优点在于可以支持PB以上级别的数据处理且具有较强的扩展性,但是缺点是性能及架构复杂。

  • 湖仓

数据湖概念在2010年被提出,其特征是以原始格式存储数据的存储库或者文件系统,无需对数据进行结构化处理,并且通常是将数据存储在开放的格式中,例如Parquet、ORC等。湖仓是将数据湖具有低成本的开放格式的存储能力和数据仓库的管理和优化能力结合在一起,典型的湖仓架构如下图所示:

从数据流转和计算来看与大数据数仓基本相同,核心的变化在于使用数据湖存储格式,例如Hudi、Iceberg、Delta Lake等进行数据的组织,解决了数据湖松散的文件结构问题,并在此基础上提供统一的元数据管理能力,实现各种数据库和数据仓库的元数据无缝打通和管理。

数据湖存储格式是湖仓运行的核心,其通过良好的抽象对接数据存储和元数据管理,格式如下图所示:

通过定义存储格式为数据湖添加了管理特性,如数据一致性、版本控制、增量处理及事务等,除外还通过表文件列式存储及压缩、表索引信息、谓词下推来加速SQL引擎的查询能力,简单来说数据湖存储格式提供了传统数据仓库存储引擎中的日志模块相同的功能。

  • 湖仓分体模式

从上面介绍的大数据架构的数仓能力来看为了支持大数据量处理、扩展性和容错性等能力,将不同的组件按照一定的架构“范式”进行叠加,存在架构极其复杂且维护成本很高,采用分布式处理框架查询性能比较低,而且事务支持较弱等问题,因此无法替代传统数仓。但是传统数仓存在集群规模小、并发能力不高、动态扩展性差等问题,因此业界出现了大数据数仓和传统数仓进行互补的新式架构的数仓。在大数据的存储能力基础上使用MPP的架构优势提高计算的实时型,典型数仓产品Impala、Presto/Trino、Hawq等产品,这里以Impala为例,其架构如下图所示:

Impala Daemon进程安装在所有节点上,通常与DN部署在一起,方便于数据的本地计算。管理节点对外提供服务,并且维护表的元数据、资源信息及各节点的健康状况。Coordinator会查询HDFS文件获取此次查询的数据所在的位置以及存储方式的信息。

查询请求提交到集群后由FE进行解析并生成查询计划,在这个过程中会将执行计划转换成分布式并行物理执行计划,如下图所示:

单机执行计划

分布式并行执行计划

分布式并行执行计划是在单机执行计划的基础上,结合数据分布式存储的特点,将其拆分为多个子任务,每个子任务都是可以并行执行,待执行后将结果进行全局的聚合。

具体来说在这种框架下数据存储在分布式架构的存储系统中,分散存储到多个节点上实现数据的分区容错性和扩展性,然后在上层利用MPP的并行计算能力来优化数据查询和计算等任务,减少运算延迟,提高处理效率。

4.新架构实时数仓

上面介绍的大数据背景下的数仓并不能称之为数仓产品,不管是Hive、Kylin、Impala、Presto还是湖仓,这些姑且可以称之为OLAP引擎,要提供数仓的能力还要与其他组件,例如分布式存储、元数据管理及数据传输等进行组合来作为整体来提供数仓服务。

但是大数据和数据仓库从概念和目标上是不同的,大数据体系是实现一个以原始格式进行数据存储和治理的基础设施,来满足不同的异构数据存储和计算需求。本质上需要灵活的标准来实现数据的集成、数据管理与对外提供数据服务等,因此从产品形态上看大数据体系下的数据仓库能力更像是一种架构指导,还可以在相同的基础能力上提供机器学习、数据挖掘、数据集市等各种能力。但是数据仓库从概念上看是一个面向主题、集成、相对稳定和反映历史变化的数据集合,在数据仓库中信息是在不同的业务系统中进行集成,并经过一系列加工、整理和汇总等过程,形成规范性的关于确定主题的一致的全局信息,可以对这些数据进行频繁的可重复的分析。

因此大数据背景下的数仓能力不能实现对数据仓库的替代,但是大数据的先进技术可以实现用来促进数仓的架构的演进,在这种趋势下出现的新型数据仓库产品有ClickHouse、Doris、StarRocks等产品,这些产品具有以下特征:

  • 现代化的MPP架构,实现了向量化执行引擎、编译执行、提高查询的实时性(支持高并发小查询)等;
  • 重新定义了数据存储引擎,可以支持大规模数据集,例如使用LMS的列式存储引擎、针对列创建ZoneMap索引来进行针对性过滤、MVCC事务隔离机制等;
  • 重新定义了数据分布与副本管理机制,可以支持大数据集的灵活管理。在小查询时只需要使用部分机器资源能够提高并发查询量;机器扩缩容时迁移部分数据分片可,不影响线上服务,负载均衡可以自动实现;
  • 新型的预聚合机制,能够做到数据的自动更新、查询的智能路由、实时数据的增量聚合计算等,例如Rollup机制,在数据导入时自动完成汇聚。

这里以Doris为例,其在整体上整合Google Mesa存储模型、Impala MPP查询引擎和ORC file存储格式(在格式的基础上进行优化)等先进技术。

与传统的MPP数仓每个实例都基于传统关系型数据库技术不同,现代化数仓根据AP的大量表扫描的特征重新定义了数据的存储引擎。与传统MPP数仓的不同,Doris使用了LSM(Log Structured Merge)树架构,这个也是目前大数据存储系统(HBase、LevelDB、RocksDB等)常用的技术,如下图所示:

核心思路是将最新的数据驻留在缓存中,等积累到一定量后再使用归并合并的方式将缓存中的数据合并到磁盘队尾中。数据写入时先在内存中组成Mem Table,其内的数据是经过排序的数据,当达成一定程度后将其添加到LSM Tree中,这些相邻的SSTable不保证有序,在后台会启动定时任务进行合并。为了加快数据的读取,大部分的LSM结构中会基于Key的索引和Bloom Filter来快速过滤查询Key,减少IO数据的访问。读取流程如下:

在数据建模方法Doris支持Aggregate、Unique和Duplicate等模型可以满足OLAP领域的各种应用模型,为了提高高并发的点查能力实现Unique存储模型和行缓存等技术;新型预聚合技术Rollup、Cube、智能物化视图技术实现预聚合加速,从而实现用户近实时查询。但是传统的数据仓库依赖与数据的Cube来进行数据的预处理,无法支持数据持续导入或者聚合的同时提供近实时的用户查询能力。

在数据导入方面在内部集成了多种数据导入方式实现不同数据源导入的过程中提供原子性保证。在集群扩缩上Doris与传统MPP数仓不同的地方在于借鉴了大数据技术中常用的分布式管理框架,可以自动管理数据副本的分布、恢复和均衡,在整个过程中不影响系统服务。

5.云数仓

传统数仓将计算与存储部署在同一个节点,集群的扩容复杂,需要进行数据的迁移,同时架构存在木桶效应,单节点故障会影响整体的性能,且资源管理不灵活,无法满足不同场景下资源隔离及动态调整的需求。云计算的出现为数仓架构的演进提供了新的方向,赋予数仓获得自服务、弹性等能力,同时目前企业将基础系统、平台部署到云端降低信息化建设成本及优化运行管理流程等成为趋势。

数仓在云端提供服务可以利用公有云强大的基础设施能力(弹性计算、存储、网络及安全能力),同时让用户更加轻松将数据进行集成,并降低使用、维护与架构成本。这就产生了云数仓(基于云原生的数据仓库),业界没有明确的定义,但是Snowflake是云数仓的里程碑产品,目前出现的云数仓产品很多都会借鉴该产品的设计思想,架构如下图所示:

云数仓、现代MPP架构都可以称为现代化数仓,但是这两种产品体系都是对传统数仓进行了不同角度的革新,现代MPP架构是从底层存储引擎角度(数据的组织与计算优化)而云数仓是从基础架构的角度进行了升级。云数仓的基本特征如下:

  • 计算与存储分离(Disaggregation),在云环境下网络传输能力已经基本上能追上磁盘的IO的能力,存算分离后可以实现存储的横向扩展,并且在计算低峰时进行缩容,进一步降低数据分析的成本,最后是可以根据数据的热度进行存储分级,保证性能的同时进一步降低存储成本;存储不再是服务本身的一部分,演变为独立的服务,扩容无需数据的重分布;
  • 资源扩展秒级弹性,计算层实现无状态可以随时扩缩容,并且随时热升级,为了实现无状态需要对元数据进行“分解”,计算层无状态后才能够随机增减节点、故障后快速切换且不需要复制/迁移数据,从而实现可靠性的提升及降低成本;弹性的扩缩可以基于定时或者负载(Workload Manager)等规则来控制,在资源不需要时可以进行关闭;
  • 数据共享(Multi Cluster, Shared Data),计算资源可以根据不同的业务进行划分后构成虚拟数仓,虚拟数仓共享底层的数据,可以通过MVCC机制来实现数据访问的一致性。

在公有云中云数仓以服务的模式来进行交互,降低数据仓库的管理复杂度,用户将运维、升级等工作交由云厂商来实现,并且以Web的方式来使用数据仓库服务。目前各种云数仓产品层出不穷,从公有云厂商推出的Google BigQuery、Redshift、Synapse、Snowflake、国内云厂商的阿里云ADB、华为云GaussDB、移动云海山数仓,到近期开源的DataBend、ByConity等,这些产品之间的功能基本相同,只是在技术细节的实现各有不同。

移动云云原生数据库海山数仓产品是中国移动自主研发的云原生分析型(OLAP)数据库。采用基于 Shared-Data与存储计算分离架构,具备zero-ETL能力,具备水平在线扩缩容,金融级高可用,提供全面向量化引擎与多种数据源联邦查询等重要特性。兼容 MySQL 协议和 MySQL 生态。支持海量数据在线查询,复杂查询快速响应,多维数据查询分析等。不仅有力辅助企业客户驾驭复杂的计算场景与海量数据需求,简化数据流转流程,使用户得以快速洞悉业务运营的真实面貌,而且还能有效帮助企业抓住数据时代的战略机遇,驱动业务模式的创新与升级。

6.总结

数据仓库从概念提出后随着用户使用需求的变化、新技术的出现等多种因素促使架构不断演进,在这个过程中不同的厂商针对各自的观点和需求,例如原始数据(数据湖)、实时性、多模数据及机器学习等,不断的在进行架构优化和新技术的引入,针对数仓的概念也在不断的重新定义,下图对这些概念进行了总结:

  

在图中数据库、数据仓库与数据湖保持明确的功能定位,产品体系的界限相对比较清晰,但是随着技术的发展,产品也在相互借鉴融合。数据仓库由于对数据实时性的需求演进到了实时数仓,在这个过程中数据的实时接入框架、查询性能的提升、交互式查询等能力让数仓的实现复杂化;为了面向满足不同数据类型的需求,数据仓库逐步进行数据的融合处理,形成了湖仓、多模数据库的概念。随时云原生技术的发展,目前各种类型的数据仓库在加速向云架构转型,力求打造新一代云数据仓库。目前在业界虽然数仓的产品数量及类型较多,但从技术实现的角度观察,它们正在朝着相似的核心技术和设计理念靠拢例如向量化执行、编译执行、计算Pipeline模型、计算存储分离、灵活弹缩等。

7.参考链接

1)数据仓库发展史:数据库发展史2--数据仓库_Data_Oracle_Inmon

2)从数仓架构到大数据架构的九种演进:https://mp.weixin.qq.com/s/5AjL6b9SleMERfRiWmycxg

3)从Snowflake看数据仓库未来演进方向:https://www.infoq.cn/article/Afr0uCxfAXsRBzLQQ24N

4)DB Engine 数据库排行及介绍 : https://db-engines.com/en/

5)墨天轮中国数据库流行度排行:https://www.modb.pro/dbRank

5)CliBench数据仓库评测:https://benchmark.clickhouse.com

7)各产品官网与开源社区:

https://github.com/ClickHouse/ClickHouse

https://github.com/apache/doris

https://github.com/greenplum-db/gpdb

https://clickhouse.com/

Apache Doris: Open-Source Real-Time Data Warehouse - Apache Doris

https://github.com/datafuselabs/databend

https://github.com/ByConity

  1. 作者介绍:

冯永设,中国移动云能力中心数据库产品部-OLAP数据库开发工程师。主要参与OLAP数据库产品架构设计/内核优化等工作。

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

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

相关文章

vscode中vue插件

在Visual Studio Code (VSCode) 中,有许多插件可以帮助Vue开发者提高工作效率和代码质量。以下是一些针对Vue开发的必备VSCode插件,结合了多篇搜索结果中的信息,以提供详尽的介绍。 Volar Volar是Vue.js开发者的官方推荐插件,专门…

python基于opencv实现数籽粒

千粒重是一个重要的农艺性状,通过对其的测量和研究,我们可以更好地理解作物的生长状况,优化农业生产,提高作物产量和品质。但数籽粒数目是一个很繁琐和痛苦的过程,我们现在用一个简单的python程序来数水稻籽粒。代码的…

React之基础项目搭建

前言 React的生态系统非常庞大,拥有大量的第三方库和工具,如React Native(用于构建原生移动应用)、Next.js(用于构建服务器渲染应用)、Create React App(用于快速搭建React应用的脚手架&#x…

【机器学习300问】62、若想将逻辑回归用于多分类有哪些常见做法?

逻辑回归算法在设计之初是用于二分类问题的,但若想把它用在多分类上也不是不行,这得看你具体面临的多分类问题是什么样的(问题的定义)。不同的问题就有不同的应对之策: 一、一对一 (1)方法的原…

【JavaEE】_Spring MVC项目获取Header

目录 1. 使用Servlet原生方法获取Header 2. 使用Spring注解获取Header 1. 使用Servlet原生方法获取Header .java文件内容如下: package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*; impor…

Linux-等待子进程

参考资料:《Linux环境编程:从应用到内核》 僵尸进程 进程退出时会进行内核清理,基本就是释放进程所有的资源,这些资源包括内存资源、文件资源、信号量资源、共享内存资源,或者引用计数减一,或者彻底释放。…

14届蓝桥杯 C/C++ B组 T5 接龙排序 (最长上升子序列DP+优化)

不难发现这是一个LIS问题&#xff0c;但是如果直接套用LIS的模版&#xff0c;在数据范围到达 1 e 5 1e5 1e5 的情况下&#xff0c;就只能够得到一半的分数&#xff0c;所以我们需要对其进行优化。 首先给出暴力的代码&#xff1a; #include<iostream> using namespace…

python+django教师业绩考评考核评分系统flask

在设计过程中&#xff0c;将参照一下国内外的一些同类网站&#xff0c;借鉴下他们的一些布局框架&#xff0c;将课题要求的基本功能合理地组织起来&#xff0c;形成友好、高效的交互过程。开发的具体步骤为&#xff1a;   第一步&#xff0c;进行系统的可行性分析&#xff0c…

Java 基于微信小程序的校园请教小程序的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

基于单片机手机屏蔽器系统仿真设计

**单片机设计介绍&#xff0c;基于单片机手机屏蔽器系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机手机屏蔽器系统的仿真设计主要涉及到手机信号屏蔽的原理、单片机控制逻辑设计、仿真软件的选择与使用以…

2024北京安全生产展|劳保用品展|安全生产防护用品展会

​作为安全生产与防护用品领域的行业盛会&#xff0c;2024北京安全生产与防护用品展览会将于2024年6月26日至28日在北京.首钢国际会展中心隆重举行。展会紧跟安全生产与防护用品行业发展&#xff0c;充分调研行业需求&#xff0c;以前瞻性的技术研讨、产品展示、产学研对接、需…

VSCode输入花括号{}}会多一个解决方案

打开设置 搜索Closing Brackets 选择BeforeWhitespace 选完后重启下VSCode即可

rust学习(tokio中tcp_stream调用的问题)

问题&#xff1a; 我们涉及了一个socket连接的类&#xff0c;每次收到数据以后&#xff0c;我们都会把tokio::net::TcpStream对应的tcp_stream传递给其他线程。 起初设计如下&#xff1a; pub struct TarNetStream {stream:TcpStream, //1... }pub trait TarListener {fn on…

【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

目录 前言 什么是面向对象&#xff1f; 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 前言 最早的C版本&#xff08;C with classes&#xff09;中&#xff0c;最先加上的就是类的机制&#xff0c;它构成…

【大数据】大数据概论与Hadoop

目录 1.大数据概述 1.1.大数据的概念 1.2.大数据的应用场景 1.3.大数据的关键技术 1.4.大数据的计算模式 1.5.大数据和云计算的关系 1.6.物联网 2.Hadoop 2.1.核心架构 2.2.版本演进 2.3.生态圈的全量结构 1.大数据概述 1.1.大数据的概念 大数据即字面意思&#x…

tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

文章目录 前言一、实现步骤1. 获取所需特征点的索引2. 使用opencv.js 计算俯仰角、水平角和翻滚角cv.solvePnP介绍cv.solvePnP原理运行代码查看效果 3.绘制姿态示意直线添加canvas元素计算姿态直线坐标并绘制 总结 前言 在计算机视觉领域&#xff0c;估算脸部姿态是一项具有挑…

基于大数据的汽车信息可视化分析预测与推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本项目通过集成网络爬虫技术&#xff0c;实时获取海量汽车数据&#xff1b;运用先进的ARIMA时序建模算法对数据进行深度挖掘和分析&#xff1b;结合flask web系统和echarts可视化工具&#xff0c;…

vue做游戏vue游戏引擎vue小游戏开发

Vue.js 是一个构建用户界面的渐进式JavaScript框架&#xff0c;它同样可以用于游戏开发。使用 Vue 开发游戏通常涉及以下几个关键步骤和概念&#xff1a; 1. 了解 Vue 的核心概念 1 在开始使用 Vue 进行游戏开发之前&#xff0c;你需要理解 Vue 的一些核心概念&#xff0c;如…

Python可视化之seaborn

文章目录 seaborn介绍1.解决坐标轴刻度负号乱码2. 解决中文乱码问题3. 忽略警告4.风格选择5.自定义坐标轴6.自定义绘图元素比例7.一元分布图8.二元分布图9.多元矩阵图10.其他常见图形散点图线图柱状图计数图 seaborn介绍 seaborn是在matplotlib基础上开发的一套API&#xff0c…

网络驱动器设备:ISCSI服务器

文章目录 使用ISCSI服务部署网络存储ISCSI技术介绍创建RAID磁盘整列配置ISCSI服务端配置Windows端配置Linux客户端iSCSI服务器CHAP单向认证配置Linux端具体步骤Windows端具体步骤 使用ISCSI服务部署网络存储 主机名IPISCSI服务端192.168.200.10ISCSI客户端192.168.200.20Windo…