从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
导读:日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度,规模达到 50 台服务器, 倒排索引将全文检索性能提升7倍,2PB 数据,每天新增日志量超过万亿条,峰值写入吞吐 6GB/s 。
网易云音乐每天都会产生大量用户行为数据、业务数据及日志数据,这些数据在异常行为跟踪、客诉问题定位、运行状态监控、性能优化等方面扮演守护者的角色。面对每日万亿级别数据的增量,网易云音乐早期的日志库以 ClickHouse 为核心构建,但面临运维成本高、并发查询能力不足、写入性能不稳定、使用费用高昂等问题,在新需求的满足上稍显吃力。
为寻找更优质解决方案,结合当前的业务需求, 网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度,规模达到 50 台服务器, 倒排索引将全文检索性能提升7倍,2PB 数据,每天新增日志量超过万亿条,峰值写入吞吐 6GB/s 。 本文将介绍从 ClickHouse 到 Apache Doris 的迁移思考及调优实践,并分享网易云音乐如何在运维效率、并发能力、查询响应以及存储性能上实现全方位提升。
早期架构及挑战
云音乐数据平台主要包括客户端日志、服务端日志、数据平台相关组件运行日志这几类:
- 客户端 / 服务端日志: 客户端 / 服务端产生的日志是数据体系的核心基础数据之一,日增数据达万亿级别,存储占用数百 TB。几乎所有业务场景均由该类数据构建。
- 数据平台相关组件运行日志: 任务及相关组件日志是数据平台内部的核心数据之一,每天约 1TB 的数据规模。这些日志能够及时反映数据平台的运行状态、性能指标、异常情况等,是实现平台智能化运维的核心资产。
对于上述日志数据的处理,早期以 ClickHouse 为核心构建了日志库、并设计了如下两条数据处理链路。这些数据通过日志采集、清洗、加工后写入日志库中,由日志库进行明细和聚合查询,为异常用户行为、社区热点监控、任务异常分析、任务预警、大盘监控业务场景提供服务。
上述两类日志数据,均要求在实时任务加工处理后写入到日志库,这对日志库的稳定性、可用性、性能、容错等能力都提出了较高要求。而之前日志库以 ClickHouse 为核心构建,在使用中暴露出一些痛点问题,在性能及稳定性的满足上稍显吃力:
- 运维成本高:早期为两条处理链路,同时也带来了双倍维护成本,此外,早期链路在面对坏盘、宕机、扩容等场景时,需要手动进行数据均衡和数据恢复,有些场景甚至需要在写入任务时配合重启操作。
- 使用门槛高:ClickHouse 除了有基本的本地表和和分布式表概念外,还提供了 MergeTree/ReplacingMergeTree/SummingMergeTree 等多个引擎,需根据不同情况选择不同的引擎,比如多副本需要使用 ReplicatedXX 引擎,这对于新人而言使用门槛及成本均比较高。
- 并发查询能力不足:在并发查询较多场景下,查询性能下降明显,无法支持业务需求。
- 写入稳定性较差:当单节点宕机或坏盘时,写入任务会出现 Failover,个别场景还需要人工介入对写入任务进行重启。
- 收费较高:由于历史原因,ClickHouse 使用的相关云服务,成本高昂。
Apache Doris 日志场景调研
基于上述问题、技术栈痛点,结合当前的业务需求,网易云音乐最终选择 Doris 作为日志库的新方案,替换原先架构中的 ClickHouse。 Apache Doris 具备运维便捷、高并发能力优异、大规模数据写入性能稳定等特点,非常符合选型要求。不仅如此,Apache Doris 所提供的冷热存储以及数据湖能力也与后续重点技术发展方向高度契合。
- 简单易用运维难度低:工程师和数据分析师对于 SQL 非常熟悉,经验可以复用,不需要学习新的技术栈即可快速上手。同时 Doris 具备完善的分布式集群管理,集群本身易于运维、支持横向拓展的存储方案。
- 高吞吐、低延迟日志写入:支持每天百 TB 级、GB/s 级日志数据持续稳定写入,同时保持延迟 1s 以内, 确保数据的实时性和高效性。
- 高性能日志全文检索分析: 支持倒排索引和全文检索,对于日志场景中常见的查询(如关键词检索明细、趋势分析等)能够实现秒级响应,为用户提供极致的查询体验。
- 海量日志数据低成本存储:支持 PB 级海量数据的存储,并支持将冷数据存储到 S3 或 HDFS 等低成本存储介质,存储成本进一步降低。
- 开放、易用的上下游生态:上游通过 Stream Load 通用 HTTP API 对接常见的日志采集系统和数据源 Logstash、Filebeat、Fluentbit、Kafka 等,下游通过标准 MySQL 协议和语法对接各种可视化分析 UI,比如可观测性 Grafana、BI 分析 Superset、类 Kibana 的日志检索 SelectDB WebUI ,为用户打造全方位的日志存储与分析生态。
基于 Apache Doris 的日志平台实践
01 整体架构
由于 ClickHouse 和 Doris 均采用关系数据库模型及 SQL,因此架构变化很小、迁移也比较简单。在新架构中,使用 Apache Doris 替代 ClickHouse 作为日志存储和分析引擎,只需调整上游 Flink 写入程序,将日志写入 Doris,并更新下游日志查询的 SQL 语句即可。
在实际上线过程中,网易云音乐进行了 Doris 和 ClickHouse 为期两周的双跑测试。在此期间,针对最近两周的数据进行了记录数、用户等字段的统计,以及实际明细查询的抽样对比,以验证数据的一致性。经过校验,Doris 能够安全地替代原有的 ClickHouse。
02 存储设计
表结构设计是日志平台的关键因素,其中排序、分区、分桶、压缩、索引等设计将对性产生显著影响。
- 分区:基于
dt
字段按天分区,使用 Dynamic Partition 功能自动创建和删除分区。 - 分桶:采用 RANDOM 随机分桶,既保证了各分桶的数据均衡,也能大幅提升写入性能。
- 排序:使用
application_id
、log_type
、container_id
、logs_timestamp
、log_level
、host_name
作为排序键。这是由于大多数查询会指定application_id
、log_type
、container_id
,排序后能快速定位到所需数据,跳过不必要的数据。 - 索引:对需要全文检索的日志文本字段
message
和exception_message
创建倒排索引,加速关键词检索。 - 压缩:采用 Doris ZSTD 压缩算法,相比 ClickHouse 默认的 LZ4 压缩算法,能够节省 30% 以上的存储空间。
- Compaction:因为日志也是一种特殊的时序数据,因此采用
time_series compaction
策略,利用时序数据局部性特点减少 Compaction 写放大,节省 CPU 和 IO 资源。
具体的建表语句参考如下:
CREATE TABLE log_table (application_id VARCHAR(*) NULL COMMENT '应用id',log_type VARCHAR(*) NULL COMMENT '日志类型/jm/tm',container_id VARCHAR(*) NULL COMMENT 'container_id',logs_timestamp BIGINT NULL COMMENT '日志产生时间',log_level VARCHAR(*) NULL COMMENT '日志级别',host_name VARCHAR(*) NULL COMMENT '主机名',exception_log TEXT NULL COMMENT '异常日志',job_id INT NULL COMMENT '任务id',message TEXT NULL COMMENT '日志内容',tag TEXT NULL COMMENT '日志关键指标',log_file_path TEXT NULL COMMENT '日志存储路径',exception_class_name TEXT NULL COMMENT '异常类名',exception_type TEXT NULL COMMENT '异常类型',exception_message TEXT NULL COMMENT '异常msg',exception_caused_by TEXT NULL COMMENT '异常caused_by',dt date NULL COMMENT '天',hh TEXT NULL COMMENT '小时',mm TEXT NULL COMMENT '分钟',INDEX idx_exception_message (exception_message) USING INVERTED PROPERTIES("parser" = "english"),INDEX idx_message (message) USING INVERTED PROPERTIES("parser" = "english")
) ENGINE=OLAP
DUPLICATE KEY(application_id, log_type, container_id, logs_timestamp, log_level, host_name)
COMMENT 'OLAP'
PARTITION BY RANGE(dt)()
DISTRIBUTED BY RANDOM BUCKETS 100
PROPERTIES ("dynamic_partition.enable" = "true","dynamic_partition.time_unit" = "DAY","dynamic_partition.start" = "-7","dynamic_partition.end" = "3","dynamic_partition.prefix" = "p","dynamic_partition.buckets" = "100","dynamic_partition.create_history_partition" = "true","compression" = "ZSTD","compaction_policy" = "time_series"
);
03 写入改造和优化
原来架构中,日志数据通过 Flink 写入 ClickHouse。新的架构中,由于 Doris 提供了 Doris Flink Connector,仍然可以沿用 Flink 来写数据,只需要进行少量调整。
客户端写入性能调优
目前使用 Apache Flink 1.12 版本,Doris Flink Connector 使用的是 branch-for-flink-before-1.13
分支。写入流程如下图:
每条上游数据写入 ArrayList 中,当 ArrayList 中数据的条数 sink.batch.size
或大小 sink.batch.bytes
达到阈值后,触发 flush 操作,同时还会启动 daemon 线程,定时 sink.batch.interval
做 flush
操作。在 flush 操作中,会将 ArrayList 中的数据按 JSON 或 CSV 的方式序列化为 String 格式,如果开启压缩 compress_type
(只有 csv 格式支持 gz 压缩),可将 String 序列化为压缩后的字节数组,最后将数据通过 StreamLoad 的方式写入到 BE 节点。
基于该写入流程,网易云音乐进行了稳定性及性能压测,在压测过程中,发现几个问题:
- 默认
batch size
太小,会导致吞吐量较低,数据延迟问题严重;而如果将batch size
设置太高(500MB 等),又会导致 Flink TM 端 OOM。 - 写入 tablet 太多时,元数据产生也较多,不仅影响写入性能,还可能出现
txn
数超限等问题。 - Flink 的 subTask 在初始化后,所写入的 BE 是确定的,除非产生异常需要重新选择 BE,否则不会主动变更 BE,这就导致 BE 间负载不均衡。
- BE 在进行滚动变更重启时,Flink 任务会失败。
- 监控指标缺失,无法量化客户端各阶段耗时。
基于上述问题,网易云音乐进行了如下优化:
- 在 append 数据操作时,直接写入压缩流,无需经过 ArrayList 中转。这种方式可大幅降低内存的使用,相比之前,TM 内存的占用从 8G -> 4G。
- 开启单 tablet 导入功能(要求表必须使用 random bucket 策略),可极大提升写入性能。
- 每个 batch flush 完成后,随机选择一个 BE 节点写入数据,解决 BE 写入不均衡问题,相较之前导入性能有 70% 的提升。(效果见下图 ,4/30 起为优化后数据)。
- 调整 failover 策略,同时优化重试逻辑,并增加每次重试的时间间隔,提高系统容错能力。
- 添加客户端全链路监控指标,监测 addBatch/压缩/flush/发送等各阶段耗时,可快速定位主要耗时过程。
HDD 硬盘元数据性能调优
Flink 写入 Doris 任务偶尔会出现延迟告警,查询日志发现 Stream Load 耗时从 5s 突增到 35s 左右。通过 Doris 大盘监控发现 Be Alive 指标抖动严重,接着通过 FE 的日志 grep "finished to handle tablet report from backend" log/fe.log | tail -n 100
查看 FE 处理 BE 心跳耗时情况,发现处理 BE 的耗时超 20s。
通过分析 FE 处理 BE 心跳的各步骤,发现大部分处理逻辑都是异步的,只有同步 tablet 元数据的逻辑是同步的。我们通过 grep "tablets in db" log/fe.log | tail -n 100
查看相关耗时日志,发现该阶段耗时超 20s,基本可确定是在同步元数据阶段出现的严重耗时。
进一步的,通过 jstack 打印 FE 的线程栈,可发现 ReportHandler 在处理心跳时,只有 sync meta
一个地方是同步的,正在等待锁、获取锁的逻辑是 flush 元数据。同时,FE 磁盘的 ioutil 达到 50%以上。因此,基本确定问题是由于刷元数据导致性能降低。
在查阅源码和 bdbje 数据库的优化措施后,决定对 3 台 Follower FE 调整为异步刷盘:master_sync_policy=WRITE_NO_SYNC
和 replica_sync_policy=WRITE_NO_SYNC
,最终实现 4 倍性能的提升。
04 查询改造和优化
由于 ClickHouse 和 Doris 都支持 SQL,查询的变化不大,主要区别在于,Doris 支持倒排索引和全文检索的函数,可用全文检索代替 LIKE 字符串匹配。
- 普通的查询
select logs_timestamp,message from log_table
where dt>= '2024-07-29'
and application_id='sloth-f52a7cda-50f8-4092-b6e7-6c9d8ce82c7b'
and log_type='jobmanager'
and container_id='sloth-f52a7cda-50f8-4092-b6e7-6c9d8ce82c7b-6457b684bf-vcrjb'
and logs_timestamp>=1722241811000 and logs_timestamp < 1722241819000
order by logs_timestamp desc limit 500 offset 0;
- 全文检索的查询,
message MATCH_ANY 'Exception Failed'
匹配 Exception 或者 Failed 关键词。
-- match 全文检索查询:
SELECT logs_timestamp,message FROM log_table
WHERE dt>= '2024-07-29'
and application_id='sloth-f52a7cda-50f8-4092-b6e7-6c9d8ce82c7b'
and log_type='jobmanager'
and container_id='sloth-f52a7cda-50f8-4092-b6e7-6c9d8ce82c7b-6457b684bf-vcrjb'
and message MATCH_ANY 'Exception Failed'
and logs_timestamp>=1722241811000
and logs_timestamp < 1722241819000
order by logs_timestamp desc limit 500 offset 0-- like 模糊匹配查询:
message LIKE '%Exception%' OR message LIKE '%Failed%'
05 其他调优实践
使用 partition balance 策略让 BE 之间数据更加均衡
随着导入任务的不断增多,系统在高峰期开始出现了延迟。通过监控发现,个别 BE 的出入流量远高于其他 BE,进一步分析脚本得知,是由于当天分区的 tablet 在 BE 之间分布不均衡导致。
为解决这一问题,网易云音乐决定改用 Partition 策略 tablet_rebalancer_type=partition
。该策略可将每天的分区 tablet 均匀分布到各 BE 上,避免局部负载过高的问题。这也要求写入任务必须保证数据在单分区内的 bucket 是均匀分布的,而当前的日志场景正好满足这一要求。下图为优化后数据(6 月 11 日在进行滚动变更,抖动较为严重,6 月 13 日后为稳定数据):
调整参数让磁盘之间更加均衡
-
重度不均衡
从下图可以看出,个别 BE 的 Compaction Score 非常高,同时这些 BE 的某些磁盘 I/O 利用率持续保持在 100%。与社区同学交流后得知,这主要是由于 BE 磁盘选择策略与 trash 清理机制之间的相互影响所致。
具体来说,尽管 BE 选择磁盘的策略是 round-robin,但当磁盘空间使用率超过 80% 时,系统会强制触发 trash 清理机制,这会导致某些磁盘的使用率急剧下降,从而使新的 tablet 更多地被分配到这些“低负载”磁盘上,导致这些磁盘负载持续升高。
进一步的,通过 BE 提供的查询 tablet 分布 OpenAPI,发现该 BE 上大流量表当天分区的 tablet 分布情况如下图所示,存在磁盘之间不均衡问题。
通过调整以下参数,来解决该问题:
trash_file_expire_time_sec = 0
:关闭 trash,日志场景中每天数据量级非常大,且 trash 恢复比较困难,没有必要使用 trash。high_disk_avail_level_diff_usages = 0.8
:BE 选择磁盘时,先根据磁盘的空间使用率划分级别,每个级别使用 round-robin 的方式分配,提升分级别的参数,可以将使用率高和低的盘强制放在一个级别中(风险提示:如果不确定是 trash 导致,可能存在个别盘打满的风险)
-
轻度不均衡
压测过程中,还发现存在轻度磁盘不均衡问题。这是由于 FE 的 balancer 机制,会选择 BE 磁盘使用率最小的 disk 进行迁移,从而导致存在部分不均衡问题。可暂时通过设置参数
disable_balance=false
关闭 balancer 解决此问题。
监控运维
在落地过程中,运维方面主要进行以下三方向的建设:
- 可观测性:基于社区提供的的 Grafana 监控模版,对相关指标进行完善,构建了全面的可观测体系,实现对集群运行状况、关键指标的实时监控与分析。
- 自动化运维:依托内部的运维平台,构建了自动化告警、自动拉起、问题处理等逻辑。当系统出现异常时,系统可自动检测并采取相关措施,极大减轻了运维人员的工作负担。
- 自动化均衡:采取了自动化探测 tablet 磁盘是否分配均衡的策略,并针对不均衡的情况进行自动化迁移。这一能力确保了集群在扩容或停机维护时,能够自动达到最佳的负载均衡状态。
通过这三个方向的建设,进一步强化了 Doris 在运维层面的自动化和智能化能力,极大提升了整体的运维效率和可靠性。这不仅大幅减轻了运维人员的工作负担,也为系统稳定运行提供了有力保障。
升级收益
网易云音乐使用 Apache Doris 替换 ClickHouse 构建了新的日志平台,已经稳定运行三个季度,规模达到 50 台服务器、2PB 数据量。这次架构升级带来查询响应、并发能力、稳定性和运维效率等多方面可观的收益。
- 查询响应提升:整体 P99 查询延迟降低了 30%。特别是通过倒排索引加速,Doris 的全文检索 MATCH 查询性能比 LIKE 查询提升了 3-7 倍(在查询约 6TB 数据时,LIKE 查询耗时 7-9 秒,而 MATCH 查询仅需 1-3 秒)。此外,倒排索引的全文检索具备自动的大小写和单复数归一化能力,能够高效检索出更多相关日志。
- 查询并发提升:ClickHouse 并发查询数超过 200 时就会经常出现
Too many simultaneous queries
错误,而 Apache Doris 能够支撑 500+ 并发查询。Doris 还可以对单次查询的数据量和并发数进行调整,以灵活应对不同场景下的并发要求。 - 写入稳定性提升:FE / BE 发生单点故障时,都能自动感知和重试恢复,保证服务高可用。
- 运维成本降低:在坏盘和宕机场景下,Doris 的自恢复能力结合进程自动拉起脚本,降低人工干预的运维成本。扩容或停机维护场景下,Doris 的自动均衡能力很强,扩容后随着 tablet 的自动均衡和老数据的清理,集群会自动达到均衡状态。
此外,网易云音乐在技术能力上也有良好的积累,积极与 Doris 社区同学深入沟通、解决关键性问题,同时也积极向社区提交相关 Issue 和 PR,共同推动 Doris 社区的建设与发展。
未来规划
当前,网易云音乐内部所应用 Doris 集群已达 100 余台(包括日志存储和其他数据分析场景),后续还将在更多场景中推广落地。未来还将着重从以下几方面发力:
- 利用 Doris 冷热分层存储等能力,在提高查询性能的同时进一步降低成本。
- 使用 Doris Workload Group能力,进行相关资源隔离,提升集群稳定,按优先级保障业务使用。
- 增加在线查询等更多应用场景,Doris 出色的并发查询能力将为这些场景提供强有力的支持。
- Doris 的数据湖扩展能力也是网易云音乐非常看重的能力,这为规划中的 One-SQL 数据架构奠定了坚实基础。
更多关于日志场景应用实践及优化经验已经沉淀到的《日志存储与分析解决方案白皮书》 中,感兴趣的同学可以下载参考。
相关文章:
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
导读:日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度,规模达到…...
Linux执行一条命令并自动重试直到成功,自动化脚本
编辑filename.sh文件 sudo vim filename.shi 插入模式,编辑文件 # 定义函数来执行并重试每个命令 execute_with_retry() {local cmd"$1"while true; do# 执行命令,并将返回状态存储在STATUS变量中eval $cmdSTATUS$?# 检查命令是否成功&…...
洛谷 acwing刷题 有关图的存储形式和djstra算法的例题
在以往的408学习中,我们 往往采用邻接表和邻接矩阵解决图的存储问题, 但是经过刷题过程发现也有一种新的存储形式值得我们学习,废话不多说,直接上代码 讲解 初始的数组 int e[N], w[N], ne[N], h[H], idx; 算法过程 void add…...
SQL 大厂面试题目(由浅入深)
今天给大家带来一份大厂SQL面试覆盖:基础语法 → 复杂查询 → 性能优化 → 架构设计,大家需深入理解执行原理并熟悉实际业务场景的解决方案。 1. 基础查询与过滤 题目:查询 employees 表中所有薪资(salary)大于 10000…...
用 Python 实现 DeepSeek R1 本地化部署
DeepSeek R1 以其出色的表现脱颖而出,不少朋友想将其本地化部署,网上基于 ollama 的部署方式有很多,但今天我要带你领略一种全新的方法 —— 使用 Python 实现 DeepSeek R1 本地化部署,让你轻松掌握,打造属于自己的 AI…...
ToDesk远程打印详细设置步骤教学
很多小伙伴常有打印、远程打印的需求,特别是对于电商人、跨境电商、教师、产品经理、实验人员等群体来说掌握这项技能可谓是能够在很多场景下带来便捷,大幅提升做事效率!那么是否有方法可以随时随地实现这样需求呐?答案是肯定的&a…...
spring 学习 (注解)
目录 前言 常用的注解 须知 1 Conponent注解 demo(案例) 2 ControllerServiceRepository demo(案例) 3 ScopeLazyPostConstructPreDestroy demo(案例) 4 ValueAutowiredQualifierResource demo(案例) 5 Co…...
【学术投稿-第四届智能电网和绿色能源国际学术会议(ICSGGE 2025)】CSS基本选择器详解:掌握基础,轻松布局网页
可线上 官网:www.icsgge.org 时间:2025年2月28-3月2日 目录 前言 一、基本选择器简介 1. 元素选择器(Type Selector) 基本语法 示例 注意事项 2. 类选择器(Class Selector) 基本语法 示例 注意…...
5种解决方式来应对deepseek暂时无法回答
在工作中,你是否常常遇到deepseek回复“暂时无法回答”的情况?根据某权威机构的调研数据显示,约73%的用户在使用此类工具时遇到过类似问题,这严重影响了工作效率和体验。本文将为你提供5种实测有效的解决方法,帮助你快…...
【C/C++算法】从浅到深学习--- 二分查找(图文兼备 + 源码详解)
绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是算法篇章的第三章二分算法,本章主要是通过题目的形式来进行学习&…...
HTML之JavaScript使用JSON
HTML之JavaScript使用JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是JavaScript对象的字符串表示法,它使用文本表示一个js对象的信息,可以将json字符串转换…...
elementui:element中el-dialog点击关闭按钮清除里面的内容和验证
问: element中el-dialog点击关闭按钮清除里面的内容和验证 回答: 在el-form中设置:before-close取消的回调函数就可以了...
从零搭建微服务项目(第5章——SpringBoot项目LogBack日志配置+Feign使用)
前言: 本章主要在原有项目上添加了日志配置,对SpringBoot默认的logback的配置进行了自定义修改,并详细阐述了xml文件配置要点(只对日志配置感兴趣的小伙伴可选择直接跳到第三节),并使用Feign代替原有RestT…...
传输层协议TCP (上)
文章目录 前言TCP报文格式TCP连接管理连接建立与中止三次握手三次握手的状态变化为什么是三次握手 四次挥手四次挥手的状态变化FIN_WAIT_2 状态可能导致连接长时间不释放的问题TIME_WAIT状态作用 复位报文段非法连接请求其他异常情况 半打开连接同时握手同时关闭 参考资料 前言…...
Proxmox 更新软件包数据库(TASK ERROR: command ‘apt-get update‘ failed: exit code 100)
1、连接自己报错的物理机Shell,编辑文件 vi /etc/apt/sources.list.d/pve-enterprise.list 2、注释文件的第一行在开头加上# 按I进入编辑模式后 开头添加# 然后shift: 输入wq或者wq!进行保存 3、注释后执行两个命令apt-get update 和 apt…...
java程序员进阶之路需要的学习过程
http://blog.csdn.net/qq_37267015/article/details/77108692...
C#01项目——计算器
实现需求: 可以连续相加,并记录计算表达式。 实现逻辑 1、利用字符串加减原则,获取相加的数值。 2、将数值存入到列表中,需要计算最终结果时,遍历列表中数值,全部相加 数字键 判断计算式长度是否超出上限根据运算…...
windows蓝牙驱动开发-在蓝牙配置文件驱动程序中接受 L2CAP 连接
L2CAP 服务器配置文件驱动程序会响应来自远程设备的传入逻辑链接控制和适应协议 (L2CAP) 连接请求。 例如,PDA 的 L2CAP 服务器配置文件驱动程序将响应来自 PDA 的传入连接请求。 接收传入 L2CAP 连接请求 1. 若要接收来自特定 PSM 的任何远程设备的传入 L2CAP 连…...
如何下载AndroidStudio的依赖的 jar,arr文件到本地
一、通过jitpack.io 下载依赖库 若需要下载 com.github.xxxxx:yy-zzz:0.0.2 的 jar则 https://jitpack.io/com/github/xxxxx/yy-zzz/0.0.2/ 下会列出如下build.logyy-zzz-0.0.2.jaryy-zzz-0.0.2.pomyy-zzz-0.0.2.pom.md5yy-zzz-0.0.2.pom.sha1jar 的下载路径为https://jitpack…...
QT笔记——QRadioButton
文章目录 1、概要2、实际的应用2.1、创建多个QRadioButton,只可同时选中其中一个,点击后实现对应的槽函数 1、概要 实现QRadioButton相关的应用;2、实际的应用 2.1、创建多个QRadioButton,只可同时选中其中一个,点击后实现对应的槽函数 创建…...
Vue 2 + Vite 项目集成 ESLint 和 Prettier
在 Vue 2 Vite 项目中集成 ESLint 和 Prettier 可以帮助你规范代码风格并自动格式化代码。以下是详细的步骤: 1. 安装 ESLint 和 Prettier 相关依赖 在项目根目录下运行以下命令,安装 ESLint、Prettier 和相关插件: npm install --save-de…...
uniapp canvas 生成海报并保存到相册
前言: 之前写过一篇canvas小程序画图只要是canvas各种方法的实际应用,有兴趣的小伙伴也可以看看 微信小程序:使用canvas 生成图片 并分享_小程序canvas生成图片-CSDN博客 上一篇文章是小试牛刀,这次是更加全面的记录生成海报的…...
无人机不等同轴旋翼架构设计应用探究
“结果显示,对于不等组合,用户应将较小的螺旋桨置于上游以提高能效,但若追求最大推力,则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中,Max Miles和Stephen D. Prior博士深入探讨了不同螺…...
C语言中隐式类型转换 截断和整型提升
C的整形算数总是至少以缺省整形类型的精度来进行的 为了获得这个精度 表达式中的字符和短整形操作数在使用之前被转换为普通整形 这种类型转换成为整型提升 给出代码实例↓ #include<stdio.h> int main() {//char signed charchar a 3;char b 127;char c a b;pri…...
R语言学习计划启动
R语言入门课 生信基地已然落地,我们希望能够给大家提供系统性、形成性、规范性的生信教学。前面几次活动中同学们表示希望能够有线下集中学习以及针对性的指导、答疑。所以,此次我们计划于2025年02月22日~23日(周六周日)推出"生信R语言入门课"…...
AI写代码工具时代:前端开发技能迭代的挑战与应对
近年来,人工智能(AI)技术飞速发展,深刻地改变着各个行业,前端开发领域也不例外。AI技术不仅带来了新的开发模式,也显著加快了前端开发技能的迭代速度,给前端工程师带来了巨大的挑战。本文将深入…...
消息队列之-springcloud-mq-stream 学习
背景: 开发中我们往往需要用到mq中间件进行消息处理,但是市面上的mq中间件实在太多了,导致我们在集成过程中困难重重,尤其在微服务当中,比如我们有一个订单模块、物流模块 他们都用到了mq,订单用的是rabbitmq 物流用的是kafka 导致当我们需要向这两个模块推送mq消息时,需…...
数据结构(考研)
线性表 顺序表 顺序表的静态分配 //线性表的元素类型为 ElemType//顺序表的静态分配 #define MaxSize10 typedef int ElemType; typedef struct{ElemType data[MaxSize];int length; }SqList;顺序表的动态分配 //顺序表的动态分配 #define InitSize 10 typedef struct{El…...
【16届蓝桥杯寒假刷题营】第1期DAY4
5.倍数区间 - 蓝桥云课 5. 倍数区间 问题描述 给定一个长度为 n 的数组 a,定义 f(i) 表示包含 ai 的最长区间长度,要求该区间中的所有数都是 ai 的倍数。请计算不同的 f(i) 的个数,其中 1≤i≤n。 输入格式 第一行包含一个正整数 n …...
「软件设计模式」适配器模式(Adapter)
软件设计模式深度解析:适配器模式(Adapter)(C实现) 一、模式概述 适配器模式(Adapter Pattern)是结构型设计模式中的"接口转换器",它像现实世界中的电源适配器一样&#…...
进阶版MATLAB 3D柱状图
%% 1. 数据准备 % 假设数据是一个任意形式的矩阵 % 例如:5行 x 7列的矩阵 data [3 5 2 6 8 4 7;7 2 6 9 3 5 8;4 8 3 7 2 6 9;6 1 5 8 4 7 2;9 4 7 3 6 2 5];% 定义行和列的标签(可选) rowLabels {Row1, Row2, Row3, Row4, Row5}; % 行标签…...
【Elasticsearch】token filter分词过滤器
以下是Elasticsearch中常见的分词过滤器(Token Filter)的详细说明,基于搜索结果中的信息整理: 1.Apostrophe • 功能:处理文本中的撇号(apostrophe),例如将“OReilly”转换为“ore…...
一天急速通关SpringMVC
一天急速通关SpringMVC 0 文章介绍1 介绍1.1 MVC架构与三层架构1.2 Spring MVC介绍1.3 入门程序 2 请求的映射3 请求数据的接收3.1 RequestParam接收3.2 POJO/JavaBean接收3.3 RequestHeader和CookieValue接收 4 请求数据的传递5 视图5.1 视图的理解5.2 请求转发和响应重定向的…...
MongoDB 7 分片副本集升级方案详解(下)
#作者:任少近 文章目录 1.4 分片升级1.5 升级shard11.6 升级shard2,shard31.7 升级mongos1.8重新启用负载均衡器1.9 推荐MongoDB Compass来验证数据 2 注意事项: 1.4 分片升级 使用“滚动”升级从 MongoDB 7.0 升级到 8.0,即在其他成员可用…...
如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍
如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍 引言问题描述实现步骤1. 计算每本书在每个季度的累计销量2. 找到每个季度的最高累计销量3. 匹配最高销量的书籍 总结扩展练习 引言 在数据分析和业务报表中,经常需要对数据进行分组统计,并找到每…...
JAVA生产环境(IDEA)排查死锁
使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤: 1. 编写并运行代码 首先,我们编写一个可能导致死锁的示例代码: public class DeadlockExample {private static final Obj…...
群体智能优化:粒子群算法(PSO)详解与实战
一、引言:从鸟群行为到优化算法 1995年,社会心理学家James Kennedy和电气工程师Russell Eberhart通过观察鸟群觅食行为,提出了著名的粒子群优化算法(Particle Swarm Optimization, PSO)。这一算法仅用不到30年时间&am…...
k8s集群搭建参考(by lqw)
文章目录 声明配置yum源安装docker安装 kubeadm,kubelet 和 kubectl部署主节点其他节点加入集群安装网络插件 声明 由于看了几个k8s的教程,都存在各种问题,自己搭建的时候,踩了不少坑,最后还是靠百度csdnchatGPT才搭建…...
vue3+vite项目引入electron运行为桌面项目
一、安装electron npm install --save-dev electron二、项目根目录添加electron文件 在此文件夹中添加两个js文件:main.js、preload.js main.js: // Modules to control application life and create native browser window const { app, BrowserWindow } requ…...
教育小程序+AI出题:如何通过自然语言处理技术提升题目质量
随着教育科技的飞速发展,教育小程序已经成为学生与教师之间互动的重要平台之一。与此同时,人工智能(AI)和自然语言处理(NLP)技术的应用正在不断推动教育内容的智能化。特别是在AI出题系统中,如何…...
使用 Flask 构建流式返回服务
使用 Flask 构建流式返回服务是一个很常见的应用场景,特别是在需要逐步传输大数据或进行长时间操作的场景下(比如下载大文件、实时日志等)。Flask 中可以通过 Response 对象来实现流式响应。以下是一个简单的例子,展示了如何在 Fl…...
Redis 集群相关知识介绍
Redis 集群详解:从入门到实战 Redis 是一个高性能的开源数据库,支持多种数据结构,广泛应用于缓存、消息队列、实时分析等领域。随着业务规模的增长,单机 Redis 的性能和容量往往无法满足需求,因此 Redis 集群…...
宏基传奇swift edge偶尔开机BIOS重置
电脑是acer swift edge, SFA16-41,出厂是Win11系统, BIOS版本出厂1.04,更新到了目前最新1.10。 问题是 会偶尔开机ACER图标变小跑到屏幕左上方,下次开机BIOS就会被重置,开机等待很长时间。 因为是偶尔现象的…...
DeepSeek是如何通过“蒸馏”技术打造自己的AI模型
1 引言: 最近,外媒对中国公司——DeepSeek进行了猛烈抨击,指控其采用了所谓的“蒸馏”(Distillation)技术,涉嫌抄袭甚至作弊。那么,什么是“蒸馏”技术? 在人工智能领域,…...
你如何利用SIMD(如SSE/AVX)优化图像处理的性能?
SIMD优化问题 1. SIMD 在图像处理中的优化方式2. 典型应用场景3. SIMD 的常见优化技巧4. 总结 利用 SIMD(Single Instruction, Multiple Data) 指令集(如 SSE/AVX/AVX2/AVX-512)优化图像处理的性能,可以极大地提升计算…...
支付宝 IoT 设备入门宝典(上)设备管理篇
相信不少朋友最近都被支付宝“碰一下”广告刷屏,“不用打开 APP 支付就碰一下”几个字一出简直自带BGM……其实“碰一下”就是支付宝 IoT 设备的一种,趁着热度还在,我会分为设备管理和设备经营上下两篇,简单介绍一下支付宝 IoT&am…...
Go语言 Web框架Gin
Go语言 Web框架Gin 参考 https://docs.fengfengzhidao.com https://www.liwenzhou.com/posts/Go/gin/#c-0-7-2 返回各种值 返回字符串 package mainimport ("net/http""github.com/gin-gonic/gin")func main() {router : gin.Default()router.GET("…...
蓝桥杯-洛谷刷题-day5(C++)(为未完成)
1.P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 i.题目 ii.代码 #include <iostream> #include <string> using namespace std;int N, Na, Nb; //0-"剪刀", 1-"石头", 2-"布", 3-"蜥", 4-"斯"࿱…...
【Unity3D优化】使用ASTC压缩格式优化内存
在Unity3D手游开发中,合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程,重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。 1. 现状分析:从ETC2到ASTC 6x6 block 在项目…...
NO.13十六届蓝桥杯备战|条件操作符|三目操作符|逻辑操作符|!||||(C++)
条件操作符 条件操作符介绍 条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下: exp1 ? exp2 : exp3条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算, exp2 计算的结果是整个表达式的结果&am…...