中通科技数仓数据治理实践

目录

一、背景

1.1 中通数仓架构介绍

1.2 中通数仓层级划分

1.3 中通数据现状

1.4 中通数仓现面临的压力

二、数据仓库具体实践

2.1 时效治理

2.1.1 数据入仓治理

2.1.2 核心模型治理

2.2 存储治理

2.3 内存治理

2.3.1 内存浪费治理

2.3.2 数据倾斜治理

2.3.3 内存不足治理

2.4 指标治理

2.4.1 定义标准

2.4.2 具体执行

2.4.3 推广与使用

三、未来规划


一、背景

1.1 中通数仓架构介绍

   中通数据仓库目前是介于业务系统和数据平台之上,数据应用之下的组件,通过中通的大数据开发工具,构建了覆盖全公司所有业务线的数据仓库,支撑了中通庞大的数据应用,如驾驶舱、C端、智能仲裁等业务系统的数据应用功能,直接为一线业务赋能。

1.2 中通数仓层级划分

  • ODS层:数据引入层ODS(Operation Data Store),存放未经过处理的原始数据至数据仓库系统,结构上与源系统保持一致,是数据仓库的数据准备区。
  • DW 层:数据清洗层(DW),对ODS数据进行异常值数据和对变化数据进行合并,形成包含历史全量,规整的数据明细层,对ODS数据进行Merge,字段异常清洗等操作。
  • DIM层:公共维度层(DIM),基于维度建模理念思想,建立整个企业的一致性维度。降低数据计算口径和算法不统一风险。公共维度层与数据清洗层在一个并列层次。
  • DM层:数据集市层(Data Market),主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标集合,俗称”宽表”。
  • ST 层:数据应用层(ST),存放数据产品个性化的统计指标数据。面向用户应用和分析需求,包括前端报表、分析图表、KPI、仪表盘,OLAP、专题等分析,面向最终结果用户。

1.3 中通数据现状

  • 主题域现状:目前中通数仓主题域主要划分为财务、中转、件量、时效、运营、客户、网络管理等主题。
  • 规模现状:目前核心宽表应用500+,每日调度任务2W+,PB级数据规模,千级集群支撑与服务集团全领域业务线。

1.4 中通数仓现面临的压力

    中通快递从2002年成立至今,业务量的规模正发生着巨大的变化。

   快递业务主要包括收发到派签5大扫描流程,在这个快递转运过程中产生了海量的数据。中通快递日均扫描量从19年初的3.5亿到2022年初日均10亿条扫描记录入库,翻了3倍。

  • 时效方面:面对与日俱增的数据量,核心调度任务的跑批时效捉襟见肘,时时面临业务报表出数不及时或者留存buffer以及紧张的情况。
  • 存储方面:目前已同步的基础数据已达PB级别,大量冗余不活跃的脏数据占据着磁盘存储资源。
  • 内存方面:早期为了尽快从hive切换到spark引擎,内存参数的设置滥用,无节制与规划,历史模型冗余重复,脚本书写不规范。
  • 指标方面:早起大量“烟囱”式开发导致指标混乱不清,下游口径不统一,无法高效输出应用与复用。

   为了更好的进行“数智化”,中通数据仓库的治理就显得尤为紧迫与重要。

二、数据仓库具体实践

2.1 时效治理

2.1.1 数据入仓治理

   规范化的数据入仓需要考虑:数据量的大小,数据变化的频率,数据使用的场景等因素,在业务端源数据同步入仓时采取相应的同步方式【增量/全量】、同步方法【例如DataX/Sqoop/CDC】、数据的分类分级等操作。

   早期为了尽快使下游能够使用基础数据,针对入仓操作简单粗暴,以数据快速入仓为目的进行的一系列操作带来大量的数据问题:

(1)错误的全量或增量同步方式所引起的大量业务侧数据库的慢sql;

     首先在同步工具上面进行改造优化,针对数据同步本身进行初步评估,如下图:

    在新增同步任务时,避免采取不合理的同步方式进行处理,同时通过对元数据的统计分析以及DBA提供的慢sql清单,数仓按照数据量的规模,增量数据的大小,历史数据使用场景,数据变更的周期等因素开始针对历史的同步任务进行改造,大大降低了业务侧数据库抽取压力,同时规范数据同步。

(2)抽取方式繁多不统一,后续维护工作量大

    在抽取方式上面,进行了平台侧改造,新增的普通抽取全部采用datax的方式,取消原先的sqoop,这种考虑主要的因素是要弱化数据同步的复杂性、并且提高数据同步操作的时效性。同时在数据同步选择存储时,优先选用orc格式,尽量避免text格式【目前不推荐】,降低存储与脏数据的容错性。在2022年,中通数仓完成了同步任务的全部切换与改造,同时将原先不合理的同步单层全部进行治理,比如多个ods写入一个dw。大表早期选择textFile的,也进行切换到orcFile上,这个过程主要通过new create table 然后rename的方式完成,而存在大量下游依赖的表,平台侧也开发了一键迁移依赖关系的功能,如下图:

   表格式的切换,大大减少了下游调度任务读取磁盘的量,同时也降低了磁盘写入,时效提升15%,从sqoop同步切换到datax同步,单个同步任务的同步时间节省了80%,大大节省了同步开发的时间成本。

(3)大表同步优化

      大表数仓同步,其实本身是存在历史因素的,基于当初的数据体量与技术选型,完成数据同步时首要目标。随着时间的推移,大表的同步有了更多的选择时,中通数仓积极进行尝试,缩短链路过程,强力保证核心应用时效,拥抱中通快递日新增亿级体量的数据规模,这里主要从具有实时性的订单数据以及超级大表账单数据进行实践分享介绍。

 a.订单数据同步优化:

       中通快递的业务量主要来自于电商平台,所以订单是个超级大表,订单数据本身又需要进行实时的跟踪统计分析,所以早期在数据同步时,数仓选择了大数据hbase组件进行同步。先通过binlog解析工具进行日志解析,解析后变为JSON数据格式发送到Kafka 队列中,通过Spark Streaming 进行数据消费写入hbase,然后将订单在hbase中的快照通过datax工具同步到数仓ods层,再由ods处理后到数仓dw层,总共需要经历4步,流程长,链路耗时高,存在多份冗余的存储,资源消耗大。

   为了提高订单数据入仓的时效,又要保证数据能够进行实时的统计分析,中通数仓开始尝试引入hudi,构建了一套新的入仓流程。

   hudi入仓相比与hbase的优势在于,hudi表能与hive,spark,presto关联查询,直接省去了hbase同步到ods的过程,通过对数据的校验以及同步刘海成稳定性的监控,经历了3个月的数据联测跟踪试运行后,进行了任务切换,链路时效直接提升了1hour+,极大提前了一些下游核心任务的启动时间,为链路空余出足够的buffer(缓冲)效用。

b.账单数据同步优化:账单数据在实时统计分析上虽然不及订单要求的及时性,但是中通快递这种加盟形式运营,在网点账单结算上会存在大量的数据。早期的网点账单数据粗暴的通过数据库直接datax增量同步到hadoop,随着业务量的暴增, 账单数据日均已达10亿体量,而账单又存在较长的结算变更周期,所以每次回刷的体量达到100亿+的数据规模,耗时严重。为了满足下游核心应用时效。数仓尝试将大体量的数据同步,采用消息同步的方式分小时批次入仓,最后再统一处理。通过将T-1日数据提前到T日处理的方式,直接将链路时效提升到2hour,同时大大减轻了源库抽取的压力。

2.1.2 核心模型治理

   传统的模型优化治理都是重构代码,横向扩大指标的使用,纵向剪裁不活跃的指标。但是,中通数仓采用了一些其他的代码重构策略:

  • 早期,调度平台还未引入step开发模式,后续升级平台开发功能后,将指标重新分模块与批次,加大代码内部的并行度,充分利用cpu资源:比如快件跟踪轨迹宽表中使用的收,发,到,派,签等基础扫描数据,统一放在相同的 step中进行并行提取
  • 中通数仓从构建到目前,随着硬件资源的扩充,内存的瓶颈阶段性的解决后,数仓将tmp表适时的切换成view视图形式,充分使用内存,减少磁盘IO的读写;
  • 自从大数据平台进行了spark小文件治理后,原先需要回刷1个月以上的分区脚本,因为分区写入过大导致失败而拆分多次插入的动作,可以一律切换成使用spark引擎,一次插入,淘汰旧的hive写入方式,在时效上得到大大改善;
  • 从数据业务场景优化数据的读取,比如一般的快递扫描操作的生命周期都是在一周内,那么在提取扫描数据时,按照不同的扫描数据业务周期提取适当的数据分区范围,避免过度数据,大大减少IO,提升整体跑批时效;
  • 通过统计分析下游不同对象对于模型时效的诉求,针对性的构建模型,而不是一味追求宽表的复用性,比如数仓专门为分析部门构建全链路轨迹宽表,突出分析实用性而非时效,而将原有冗余的宽表进行大幅度的指标裁剪突出核心指标的时效,从而大大改善不同对象对于模型易用性与时效性的平衡;
  • 另外中通数仓部分模型采用离线与实时融合的方式,充分利用实时性计算的能力提高时效,又结合离线数仓数据覆盖范围广,保证数据质量

    通过中通数仓个性化的重构与优化代码,模型宽表的时效得到大大的提升,计算任务6点前总体完成80%,关键任务完成100%,日常任务时效能够达到业务期望目标。

2.2 存储治理

    构建于大数据平台上的中通数仓,随着中通业务量的高增长,对于有限的存储资源面对每日同步TB级别的数据进行数据仓库,存储于运维都日趋进展。如何进行降本增效,真正将高热点数据进行专业化处理,有效提高数据的加工能力,将大数据化为实用的大数据才能更好实现数据的增值。那么中通数仓是如何有效甄别高热点数据来实现降本增效?

   从数据的生命周期进行切入,中通数仓采取对表的访问进行活跃度监控,分别从周期角度【近30天、近60天、近90天】 与操作角度【调度层级(优先级:低中高,状态:测试、试运行,上线)】两大数据特征,持续性的进行表使用情况的监控,从而达到有效准确的删除过期无效数据,通过利用表活跃度进行存储治理,中通数仓节省了PB级别的存储空间。

2.3 内存治理

    中通数仓在调度开发使用引擎方面,经历了从单一的Hive引擎到Hive、Presto以及Spark自有切换,从大面积开始使用Spark引擎,在内存的使用上面,任务开发人员为了完成开发任务,而未有效关注内存参数的正确使用,故而出现大量滥用内存的情况。同时,部分任务频繁的出现失败重跑,究其因普遍是由于内存不足与数据倾斜。内存资源的不合理使用,导致核心报表的时效经常不能稳定输出,特别是面对大促期间,营运效率提升更加突出。那么中通数仓具体的内存治理该如何进行?

2.3.1 内存浪费治理

   第一步,内存浪费治理的关键是如何识别内存资源浪费,那么调度任务如何打上浪费内存的标签?这里我们进行了实际的物理参数的统计分析。中通数仓的物理机内存是256G,实际参与内存调度有220G,CPU是50个core,所以⼀个CPU理想情况下是最好使⽤220/50=4.4G内存,这个样子数仓整个集群的cpu与内存资源占比是均衡的,如果大量任务申请的内存资源超过4.4G,就会导致我们整个集群的内存资源已完全占⽤,但是CPU资源还有很⼤的富裕,导致集群利用率降低,从而导致任务时效无法保障。

   在集群层面进行了内存参数的限额配置后,中通数仓分批次从20G->16G->10G->8G开始进行有计划的管控,资源严重浪费的TOP任务优先进行整治,成效显著。

2.3.2 数据倾斜治理

  第二步,通常当我们查看长时效调度任务的时候,在具体到step SQL时,明显看到该段SQL跑批异常慢,再结合对应的stage,可以准确的找出发生数据倾斜的SQL,进而通过Join的条件找出发生倾斜的Key.

                   图-发现数据倾斜的STAG

                  图-发生数据倾斜的SQL DAG图

  中通数仓在处理数据倾斜这一常见的SQL问题有几点思考:

  • 1.什么样的业务数据会导致数据倾斜?
  • 2.如何避免不必要的数据倾斜而编写大量的group by 语句?

    针对以上两点,中通数仓进行业务数据调研,以扫描操作数据为例,当中心或者网点进行新设备引进时可能会因为操作人员的误操作而导致大量扫描重复数据的上传,针对这种业务场景,及时的透传设备问题,止血脏数据,避免更多重复数据上传至关重要,为此中通数仓联合产研团队进行了相关业务治理,通过对设备端的监控,将问题设备直接透传到网点或者中心,高效的解决热点数据,从而避免此类问题导致的数据倾斜

   当然,从业务数据视角去探查规避数据倾斜是一方面,本身数据倾斜也是常见的SQL问题,开发人员如何定期定点的进行处理优化SQL,只有将数据倾斜的SQL标签化,才能省去费时费力的定位key。目前中通数仓,SQL数据倾斜通过shuffle等一些列实际运行值进行统计分析标签化。

2.3.3 内存不足治理

  大多数时候,开发人员完成SQL脚本后,只要开始任务正常完成上线后,日后的关注度会随着上线时间的推移,渐渐降低,那么核心关键任务如何保证在促阶段,随着时间量的徒增而不会因为内存不足连续失败重试?
   显然有了前面的内存指标使用的监控,内存不足的标签也打在的任务治理上。当然,内存整理还有其他一些重要指标项,比如全局排序、多对多Join等等。

                     图-内存异常监控指标分析list图

     通过一系列的内存资源治理,集群的内存使用基本保持一个稳定的状态,充分保证集群资源的高效使用,任务时效大幅度提升。

2.4 指标治理

  指标管理的难度随着数据规模与复杂度的攀升,特别是达到PB级时,在复杂的业务分析场景中如何保证输出的数据指标是高质量的?中通数仓是如何进行指标治理的呢?

2.4.1 定义标准

   中通数仓指标如何构建一套标准?老旧的方式是采用原始表格达成一套约定俗成的定义,而这带来的最大问题是低效的执行度。所以,今年中通数仓借助线上化的指标字典来进行指标规范化。

                图-指标规范化定义及样例图

             图-基础指标与衍生指标公式图

    在指标主题域方面:为了更好的组织和分类各种指标,根据业务过程,或者业务对象划分了客服,财务,中转,件量,时效,运营,客户,网络管理等不同的指标主题,同时又将一级主题细分到二级主题。

  在指标的具体定义上,将指标进行业务定义与技术定义双标准规划。

  • 业务口径包括如下要素:指标解释+指标目的+主要维度说明+公式
  • 技术口径包括如下要素:包含涉及到的表,取什么信息,关联条件,过滤条件等。

基础指标定义后如何维护衍生指标也是很关键的。

2.4.2 具体执行

   指标的管理上,主要强化开发流程,审批流程,指标数据质量监控。

  • 开发流程:从产品需求对接到具体分析评估,设计及开发,数据检验测试,最后上线,强管控6大步。
  • 审批流程:通过拆分三大指标管理的对象,字典管理员,DBA,数仓进行指标的录入。

  • 指标数据质量监控:保证指标的准确率与使用率,必须有一套完整的数据质量监控体系平台。

  通过数据质检规则红绿灯模式干预调度流程,当指标监控处于强规则校验模式下,异常指标直接阻塞任务执行,发出任务失败告警,强人工干预检查;当指标监控处于弱依赖规则校验模式下,出现指标异常告警,则对应开发人员可以在白天进行异常指标分析,确认详细的情况后再进行指标监控的优化以及下游指标使用情况的输出反馈。

2.4.3 推广与使用

  由于原先的指标混乱,定义不清晰,统计口径模糊,数据质量等问题,下游使用对象在指标定位查找以及使用上存在较大的难度,另外很多核心宽表的指标都是通过数仓开发人员进行“翻译”推广的,从而进一步造成指标的复用度低下,反复构建相似指标,冗余突出

   为了提高指标的推广与正确使用,中通数仓搭建了一套元数据管理系统。这套元数据管理系统打通了表,SQL、报表、指标四维关系,使用者想要查询某个业务系统某个报表的某个具体指标的来源与口径,可以通过元数据管理系统精准搜索,高效定位,准确捕获,完成数据一体化查询服务。

 如何清晰描述指标的来龙去脉,离不开元数据管理系统的血缘能能力,通过明确当前指标的来源去向,更好地进行指标的正确使用与推广

三、未来规划

  • 目前元数据的内容建设还要持续进行,通过数据质量的监控逆向反馈到业务系统进行数据治理预警还欠缺,还不能进行智能化调整质检任务,比如大促与日常订单量趋势的监控能否通过订单量的预测分析进行质检规则的调整。
  • 目前元数据平台提供的血缘分析局限于调度任务级别,热度停留在表的收藏,点赞,关注,后续考虑进行指标层级的血缘分析,比如将指标进行热,温,常,冰四维一体的热度值标签,精准指标颗粒度的使用场景分析,进行提供模型优化及新增下线的智能建议。
  • 基于元数据,从资源消耗,价值等方面实现数据资产价值评估等。

参考文章:

中通数仓在数据治理方面的实践

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

C语言操作符详解(三)

一、表达式求值 1.1整型提升 C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。 如何进行整型提升呢? 1. 有符号整数提升是按…

高并发高性能接口中,异步打印并采集业务日志的实现方案

一、背景 高并发接口中,为了提高接口的高性能,在需要保存审计及操作记录的时候,往往有以下常见方案: 保存到redis数据库异步保存到mysql/mongodb/es等数据库logger打印业务日志,采集与展示则交由elk模块 对于第一种…

基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

【web开发01】前端开发HTML、CSS-新浪新闻的实现

前端开发HTML、CSS-新浪新闻的实现 1 实现标题排版1.1图片连接的三种方式1.2 具体代码1.3 总结1.< h1>到< h6>是标题从大到小 2 实现标题样式2.1 css的三种引入方式2.2 颜色的三种表示2.3 css选择器2.4 超链接 3 实现正文排版3.1 视频标签 video3.2 音频标签 audio…

Spring高手之路17——动态代理的艺术与实践

文章目录 1. 背景2. JDK动态代理2.1 定义和演示2.2 不同方法分别代理2.3 熔断限流和日志监控 3. CGLIB动态代理3.1 定义和演示3.2 不同方法分别代理&#xff08;对比JDK动态代理写法&#xff09;3.3 熔断限流和日志监控&#xff08;对比JDK动态代理写法&#xff09; 4. 动态代理…

功能强大:JMeter 常用插件全解析

JMeter 作为一个开源的接口性能测试工具&#xff0c;其本身的小巧和灵活性给了测试人员很大的帮助&#xff0c;但其本身作为一个开源工具&#xff0c;相比于一些商业工具&#xff08;比如 LoadRunner&#xff09;&#xff0c;在功能的全面性上就稍显不足。这篇博客&#xff0c;…

Java学习42-Java 流(Stream)、文件(File)和IO - FileReader\FileWriter的使用

IO流 IO流的概述&#xff0c;分类等 Java程序中&#xff0c;对于数据的输入输出以stream方式进行&#xff0c;可以看作是一种数据的流动。 IO流中的IO是Input和Output的缩写&#xff0c;是非常实用的技术&#xff0c;用于处理设备之间的数据传输。读写文件&#xff0c;网络通…

JUC并发编程2(高并发,AQS)

JUC AQS核心 当有线程想获取锁时&#xff0c;其中一个线程使用CAS的将state变为1&#xff0c;将加锁线程设为自己。当其他线程来竞争锁时会&#xff0c;判断state是不是0&#xff0c;不是自己就把自己放入阻塞队列种&#xff08;这个阻塞队列是用双向链表实现&#xff09;&am…

聚丙烯PP材料粘接方法?泰达克TADHE专用于PP材料塑料粘接的UV胶水提供了解决方案

PP&#xff08;聚丙烯&#xff09;&#xff0c;简称PP。 PP是一种疏水性的塑料&#xff0c;需要特殊的处理后再和胶水粘接&#xff0c;以确保良好的粘接效果。常用的PP材料粘接方法&#xff1a; ​1.表面处理 因PP表面的疏水性&#xff0c;可以先进行表面处理。使用酒精或丙酮…

完整的项目源码!在线考试完整系统源码(可接私活)

最近有一些读者问我有没有完整的基于SpringbootVue的项目源码&#xff0c;今天给大家整理了一下&#xff0c;并且录制了搭建的教程&#xff0c;无偿分享给大家。 一、系统运行图 1、登陆页面 2、后台管理 3、全套环境资源 ​源码文件部分截图&#xff0c;带视频教程 ​ 在实际…

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

linux的io的知识大全

C语言的io操作 写文件 #include<stdio.h> #include<string.h>#define FILE_NAME "log.txt" int main() {FILE * fp fopen(FILE_NAME, "w");if(fpNULL){printf("fopen error!\n");}const char* msg "hello zk\n";int c…

如何准确测量电源噪声

目录 电源噪声的特点 影响噪声测试的因素 总结 电源噪声的特点 以往电源噪声的幅度规范一般在几十mV&#xff0c;但是随着芯片电源电压的降低&#xff0c;很多芯片的电源噪声的规范已经低至mV的量级&#xff0c;某些对电源噪声敏感的芯片要求甚至到了百uV的量级。 电源上的…

基于Android studio 实现外卖(点)订餐系统-编程乐学最新原创

&#x1f345;文章末尾有获取完整项目源码方式&#x1f345; 目录 一、实现介绍 视频演示 1.1 启动页 1.2登录页 1.3注册页 1.4商家主页 1.5商家发布商品页面 1.6商家我的页面 1.7商家个人信息修改页 1.8商家商品信息修改页 1.9用户首页 1.10用户我的订单页面 1.1…

C++学习进阶:二进制与位运算

目录 1.进制与原反补码 2.位运算 2.1.按位与 2.2.按位或 2.3.异或 2.4.取反 2.5.移位 3.部分面试题 3.1.不创建新的变量&#xff0c;实现两个变量的交换 3.2.求一个整数存储在内存中二进制中1的个数 这一部分本来是C语言的内容&#xff0c;当学习位图时&#xff0c…

期货分账户软件|程序化软件|风控软件|资产管理软件开发用到哪些技术?

期货/股票资管分仓软件分账户系统APP的开发涉及多个技术领域&#xff0c;以确保软件的功能性、安全性和易用性。以下是一些在开发过程中可能需要用到的关键技术&#xff1a; 前端开发技术&#xff1a;前端部分主要负责用户界面的设计和实现。通常使用HTML、CSS和JavaScript等技…

YARN-Client 与 YARN-Cluster 区别

YARN-Client 与 YARN-Cluster 区别 理解YARN-Client和YARN-Cluster深层次的区别之前先清楚一个概念&#xff1a;Application Master。在YARN中&#xff0c;每个Application实例都有一个ApplicationMaster进程&#xff0c;它是Application启动的第一个容器。它负责和ResourceMa…

【HTML】制作一个简单的实时字体时钟

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;两个文件夹&#xff0c;其中HTML的文件名改为[index.html]&am…