Hadoop核心架构与集群搭建实战:从基础原理到环境部署
1. 从“尴尬”到“从容”为什么Hadoop是数据工程师的必修课最近在技术社区里看到一个挺有意思的讨论说“不会搭Hadoop集群的大数据开发工程师尴尬了”。这话虽然带点调侃但确实戳中了很多初入大数据领域朋友们的痛点。Hadoop作为大数据生态的基石其地位有点像学编程绕不开的“Hello World”。很多教程一上来就让你执行一堆命令但如果你连Hadoop是什么、为什么需要它、它的核心部件如何协同工作都没搞清楚那么搭建集群的过程就会变成一场充满“ssh: could not resolve hostname”错误的噩梦更别提后续的开发和调优了。这篇文章我就从一个过来人的角度掰开揉碎了讲讲Hadoop那些最基础、但最关键的知识目标就是让你看完之后不仅能看懂别人的搭建教程更能理解每一步背后的逻辑从“萌新”变得“心里有底”。简单来说Hadoop是一个开源框架专门用来处理海量数据我们常说的“大数据”的存储和计算问题。它的核心设计思想是“分而治之”把一个大文件切成很多小块分散存储到一堆普通的、便宜的服务器上同时把计算任务也分发到这些存着数据的服务器上去执行最后汇总结果。这样做的好处是用一群“小蚂蚁”普通PC服务器就能搬动一头“大象”TB/PB级数据既经济又高效。无论你是想在Windows上体验还是在Ubuntu上部署生产环境抑或是想用Docker快速拉起一个学习环境理解这些基础知识都是第一步也是避免后续各种“尴尬”报错的关键。2. Hadoop核心架构解析不只是HDFS和MapReduce提到Hadoop很多人脑子里立刻蹦出两个词HDFS和MapReduce。这没错它们是Hadoop最早期的两大核心。但随着生态的发展现在的Hadoop早已成为一个庞大的项目集合。理解其架构演变能帮你更好地选择和学习相关组件。2.1 经典“三驾马车”HDFS, YARN, MapReduce在Hadoop 2.x之后其架构稳定为三个核心模块这构成了我们常说的Hadoop“三驾马车”。1. HDFS分布式文件系统这是Hadoop的存储基石。你可以把它想象成一个超大规模的、有自动备份功能的“网络硬盘”。它主要由两类角色组成NameNode相当于“图书馆管理员”。它不存实际的书数据但管理着所有书的“目录索引”元数据记录着比如一个文件被切成了几块、每一块分别存放在哪些服务器上。因此NameNode是HDFS的“单点故障”它的高可用配置是生产环境的重中之重。DataNode相当于“书架”。它们就是集群中那些普通的服务器负责实际存储数据块并执行来自客户端的读写请求。一个文件会被默认切成128MB可配置的块并以多副本默认3份的形式分散在不同的DataNode上这样既保证了并行读写速度也确保了数据安全。2. YARN资源管理与调度系统这是Hadoop 2.x引入的革命性组件。在早期MapReduce既要负责计算逻辑又要管理集群资源耦合度很高导致集群利用率低下且无法运行其他计算框架。YARN的出现将资源管理和任务调度这个“管家”的职能剥离了出来。ResourceManager集群资源的“总管家”。它掌握着所有计算资源CPU、内存负责接收应用程序的资源请求并分配给它们。NodeManager每个服务器上的“监工”。它负责启动并监控本机上的资源容器执行具体的计算任务。 有了YARNHadoop集群就从单一的MapReduce计算平台升级成了一个通用的“数据操作系统”可以同时运行MapReduce、Spark、Flink等多种计算框架资源利用率大幅提升。3. MapReduce分布式计算框架这是一种编程模型用于处理海量数据集。其思想非常直观“Map映射”和“Reduce归约”。Map阶段把输入数据分割成独立的片段由多个Map任务并行处理输出一系列的中间键值对。比如统计一篇文章的词频Map任务就是各自统计分配给自己的那部分文本里的单词。Shuffle阶段这是一个幕后但至关重要的过程。系统会将所有Map输出的中间结果按照Key进行排序、分组然后分发给对应的Reduce任务。这个过程涉及大量的网络传输和磁盘I/O是性能优化的关键点。Reduce阶段接收属于同一个Key的所有中间值进行合并计算产生最终结果。接上例Reduce任务就是把分散在各个Map任务里统计的同一个单词的次数加起来。 虽然现在Spark等更快的框架更流行但理解MapReduce模型对于理解分布式计算的思想至关重要。2.2 生态圈扩展Hadoop不只是Hadoop在实际项目中我们很少只使用上述三个组件。Hadoop生态圈就像一棵大树核心是树干周围枝繁叶茂。数据仓库Hive。它提供了类似SQL的查询语言HiveQL可以将结构化数据文件映射为一张数据库表。你写一条SQLHive会将其转换为MapReduce、Tez或Spark任务在集群上执行。对于熟悉SQL的分析师来说这是进入大数据世界的捷径。分布式数据库HBase。这是一个构建在HDFS之上的、面向列的NoSQL数据库。它适合需要实时随机读写超大规模数据集的场景比如用户画像查询。数据采集Flume, Sqoop。Flume用于高效收集、聚合和移动大量的日志数据到HDFS。Sqoop用于在Hadoop和传统关系型数据库如MySQL之间高效传输批量数据。协调服务Zookeeper。这就是热词里提到的“hadoop和zookeeper整合实战”的关键。Zookeeper是一个分布式协调服务用于维护配置信息、命名、提供分布式同步和组服务。Hadoop的高可用HANameNode、YARN的ResourceManager高可用以及HBase等组件的运行都重度依赖Zookeeper来选举主节点、存储元数据确保集群状态一致。理解这个生态圈能帮助你在面对具体业务需求时快速选择合适的技术栈。3. 集群搭建核心思想与前置知识扫盲在真正动手敲命令之前理清思路比盲目操作重要十倍。搭建Hadoop集群尤其是第一次会遇到各种问题其中90%都出在基础环境配置上。3.1 集群角色规划你的集群需要几台机器一个最小的、具备高可用能力的生产概念集群通常包括以下角色主节点至少2台。用于部署NameNode (Active/Standby)、ResourceManager (Active/Standby)。为了保证高可用这两个核心管理节点都需要主备。从节点至少3台。用于部署DataNode和NodeManager。数量越多存储和计算能力越强。Zookeeper集群至少3台。通常独立部署也可以与主节点复用机器但生产环境建议分离。Zookeeper集群节点数必须是奇数以便进行领导者选举。客户端网关1台。用于提交作业、访问HDFS通常不部署常驻服务。 对于学习和测试我们可以进行极端简化单机伪分布式模式所有进程跑在一台机器上模拟分布式和多节点完全分布式模式至少3台1主2从。热词中提到的“hadoop的docker镜像”是搭建学习环境的利器它可以快速在单机上启动一个多节点的虚拟集群。3.2 环境准备避开“ssh: could not resolve hostname”的坑几乎所有分布式系统都依赖SSH进行节点间的免密通信Hadoop也不例外。这一步是新手的第一道坎。1. 主机名与网络配置错误“ssh: could not resolve hostname bigdataflowing: name”的根源在于主机名解析失败。你必须确保为每台机器设置一个有意义且唯一的主机名如node-master,node-slave1。在每台机器的/etc/hosts文件中配置所有节点的IP地址和主机名映射。这是最可靠的方式比依赖DNS更稳定。# 例如在每台机器的 /etc/hosts 文件中添加 192.168.1.101 node-master 192.168.1.102 node-slave1 192.168.1.103 node-slave2使用hostname命令检查当前主机名并用ping node-slave1测试是否能够通过主机名ping通其他节点。2. SSH免密登录配置Hadoop主节点需要能免密登录到所有从节点包括自己用于启动本机进程。在主节点上生成密钥对ssh-keygen -t rsa一路回车。将公钥分发到所有节点包括自己ssh-copy-id node-master,ssh-copy-id node-slave1... 过程中需要输入目标机器的密码。测试在主节点执行ssh node-slave1如果能直接登录而不用密码即成功。3. Java环境Hadoop是Java编写的必须安装相同版本的JDK推荐JDK 8或JDK 11具体看Hadoop版本要求。确保JAVA_HOME环境变量在所有节点上正确配置并且java -version命令可用。注意很多人在Docker或快速安装脚本中忽略了这些基础检查导致后续步骤全盘报错。务必花时间确保主机名解析和SSH免密登录100%正确这是搭建成功的基石。4. 从安装配置到启停手把手走通核心流程这里我们以在3台Ubuntu虚拟机1主2从上搭建Hadoop 3.3.x完全分布式集群为例讲解关键步骤。Windows环境可以通过WSL2或虚拟机实现类似流程。4.1 软件安装与基础配置下载与分发在主节点node-master上下载Hadoop二进制包如hadoop-3.3.6.tar.gz解压到指定目录例如/opt/hadoop。然后将整个目录通过scp同步到所有从节点。scp -r /opt/hadoop node-slave1:/opt/ scp -r /opt/hadoop node-slave2:/opt/核心配置文件详解Hadoop的配置集中在$HADOOP_HOME/etc/hadoop/目录下。以下几个文件是关键hadoop-env.sh设置Hadoop运行环境变量。最重要的是export JAVA_HOME必须指向你的JDK安装绝对路径。core-site.xml核心全局配置。configuration !-- 指定HDFS的默认访问地址和端口 -- property namefs.defaultFS/name valuehdfs://node-master:9000/value /property !-- Hadoop临时数据存储目录 -- property namehadoop.tmp.dir/name value/opt/hadoop/tmp/value /property /configurationhdfs-site.xmlHDFS相关配置。configuration !-- 指定每个数据块的副本数我们集群有3个节点设为2或3 -- property namedfs.replication/name value2/value /property !-- 启用NameNode高可用非必须但生产环境必配 -- !-- 相关配置会涉及nameservices、journal nodes等此处略过 -- /configurationmapred-site.xmlMapReduce框架配置。configuration !-- 指定MapReduce运行在YARN框架上 -- property namemapreduce.framework.name/name valueyarn/value /property /configurationyarn-site.xmlYARN资源管理器配置。configuration !-- 指定ResourceManager的主机名 -- property nameyarn.resourcemanager.hostname/name valuenode-master/value /property !-- NodeManager上运行的辅助服务需配置为mapreduce_shuffle才能运行MR任务 -- property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configurationworkers在旧版本中是slaves这个文件列出了所有DataNode和NodeManager所在的主机名每行一个。node-slave1 node-slave2 # 注意伪分布式模式下这里可能是localhost。完全分布式必须写从节点主机名。配置完成后将这些配置文件同步到所有从节点。4.2 集群初始化、启动与验证格式化HDFS这个操作仅在第一次搭建时在主节点执行一次它会创建HDFS的初始元数据。多次格式化会导致集群ID不一致DataNode无法识别NameNode。# 在 node-master 上执行 hdfs namenode -format看到“successfully formatted”等成功信息即可。启动集群Hadoop提供了脚本一键启动所有服务。启动HDFSNameNode, DataNode, SecondaryNameNodestart-dfs.sh启动YARNResourceManager, NodeManagerstart-yarn.sh执行后用jps命令在各节点检查进程是否正常启动。node-master上应有NameNode, ResourceManager, SecondaryNameNode。node-slave1/2上应有DataNode, NodeManager。访问Web UI验证这是最直观的验证方式。HDFS NameNode UIhttp://node-master:9870(Hadoop 3.x默认端口是98702.x是50070这就是热词里提到的端口变化)。在这里你可以看到集群存储空间、DataNode存活状态、浏览文件系统。YARN ResourceManager UIhttp://node-master:8088。在这里可以查看集群资源使用情况、提交和监控应用程序如MapReduce作业。4.3 集群停止与基本操作停止集群按启动的逆序停止。stop-yarn.sh stop-dfs.shHDFS基本命令体验一下命令行操作。hdfs dfs -mkdir /test # 创建目录 hdfs dfs -put localfile.txt /test/ # 上传文件 hdfs dfs -ls /test # 列出文件 hdfs dfs -cat /test/localfile.txt # 查看文件内容运行一个示例MapReduce作业Hadoop自带了一些示例JAR包。hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 2 10这个命令会运行一个计算圆周率π的MapReduce程序用2个Map任务每个任务采样10次。你可以在YARN的Web UI8088端口上监控这个作业的执行过程。5. 常见问题排查与实战心得搭建和运行过程中你一定会遇到各种问题。这里记录几个最典型的“坑”和解决思路。5.1 启动失败问题速查表现象可能原因排查思路jps命令看不到NameNode或DataNode进程1. SSH免密登录失败。2. 配置文件如core-site.xml中的主机名错误或端口被占用。3. 多次格式化导致clusterID不一致。1. 在主节点ssh localhost和ssh node-slave1测试免密。2. 检查logs/目录下的日志文件错误信息非常详细。3. 比较namenode和datanode的VERSION文件中的clusterID是否一致。DataNode无法启动日志显示“Incompatible clusterIDs”NameNode和DataNode的集群ID不匹配。通常是因为格式化NameNode后未清理旧DataNode的数据目录。1. 停止集群。2. 删除所有节点上hdfs-site.xml中dfs.datanode.data.dir配置的目录内容或hadoop.tmp.dir。3.重新格式化NameNode注意备份再启动。Web UI无法访问端口9870或80881. 防火墙未开放端口。2. 进程未成功启动。3. 配置文件绑定了localhost而非0.0.0.0。1. 用netstat -tlnp检查端口监听状态确认监听在0.0.0.0上。2. 关闭防火墙或添加规则sudo ufw allow 9870/tcp。3. 检查配置文件中的主机名是否为实际IP或可解析的主机名。提交MapReduce作业失败提示连接被拒绝ResourceManager或NodeManager未启动或YARN配置错误。1. 用jps检查ResourceManager和NodeManager进程。2. 检查yarn-site.xml中yarn.resourcemanager.hostname配置是否正确。3. 查看YARN的日志$HADOOP_HOME/logs/下的yarn-*-resourcemanager-*.log。5.2 性能与稳定性调优入门对于新手在保证能跑起来的基础上可以关注两个简单的优化点调整HDFS块大小默认128MB对于海量小文件场景极不友好会造成NameNode元数据压力巨大。如果业务场景是大量大文件如视频、日志归档可以考虑增大dfs.blocksize在hdfs-site.xml中到256MB甚至512MB减少Map任务数量。反之如果小文件多应优先考虑使用HARHadoop Archives或SequenceFile进行文件合并。配置合理的副本数dfs.replication默认是3。在只有3个节点的测试集群中设为3意味着每个数据块会在每个节点上都存一份失去了冗余意义且浪费空间。可以设为2。在生产环境通常根据数据重要性和集群规模设置为2或3。5.3 个人实操心得“慢就是快”在初期不要追求一步到位搭建高可用集群。先用伪分布式模式在单机上把整个流程跑通理解每个配置文件的作用、每个进程的角色。这能帮你建立信心和清晰的认知。日志是你最好的朋友任何错误第一时间查看$HADOOP_HOME/logs/目录下对应的日志文件。Hadoop的日志输出非常详尽95%的问题都能从中找到直接原因。学会看日志是运维任何系统的核心能力。善用Docker进行学习如果被多机环境困扰强烈推荐使用Docker Compose来部署Hadoop学习环境。网上有很多现成的docker-compose.yml脚本可以一键拉起一个包含HDFS、YARN、甚至Hive、Zookeeper的完整迷你集群让你专注于学习Hadoop本身的使用而不是反复折腾系统环境。这就是热词中“hadoop的docker镜像”的价值所在。理解端口而非死记Hadoop 3.x相比2.x很多默认端口都变了如NameNode HTTP UI从50070变为9870。死记硬背容易混淆。最好的方法是启动服务后用netstat -tlnp \| grep java命令查看实际打开的端口或者直接查阅官方文档的默认端口列表。最后回到开头那个“尴尬”的话题。会不会搭建集群确实不是衡量一个大数据工程师能力的唯一标准尤其是在云服务普及的今天。但亲手搭建、配置、排错一遍这个过程中你对HDFS存储机制、YARN调度原理、网络通信、资源配置的理解是只看文档和用现成服务无法获得的。这份理解能让你在后续使用Spark、Flink甚至云上EMR时更能洞悉底层做出更合理的设计和优化。从看懂这篇基础开始动手做一遍那份“尴尬”自然会变成你的“底气”。

相关新闻

济南针灸治腰肩盘突出好又便宜的神州大夫

济南针灸治腰肩盘突出好又便宜的神州大夫

神州 副主任医师 **职称**:副主任医师 ✅ **学历**:山东中医药大学 中医内科学硕士(2011年毕业) ✅ **重磅荣誉**:**2020年山东省卫健委授予【山东基层名中医】**(省级官方中医人才荣誉,基层中医…

2026/10/9 11:08:58 阅读更多 →
腾讯云免费SSL证书续期与Nginx部署全流程详解

腾讯云免费SSL证书续期与Nginx部署全流程详解

1. 项目概述:当免费午餐到期时 手里有个小项目或者个人博客,当初为了省事,直接在腾讯云申请了一年的免费SSL证书。用起来是真香,浏览器那个小绿锁看着就安心。但最近服务器时不时抽风,一看日志,好家伙&…

2026/10/9 22:16:39 阅读更多 →
基于CH348L的USB转8路TTL串口模块设计与实战应用

基于CH348L的USB转8路TTL串口模块设计与实战应用

1. 项目概述:从单通道到多通道的跃迁如果你玩过单片机、路由器刷机或者调试过各种嵌入式板卡,那么“USB转TTL”这个小玩意儿对你来说肯定不陌生。它就像一座桥梁,一头连着电脑上通用的USB接口,另一头连着设备上常见的TTL电平串口&…

2026/10/10 18:39:38 阅读更多 →

最新新闻

C#调用WebService获取PDF转图片:选型与踩坑实战

C#调用WebService获取PDF转图片:选型与踩坑实战

做C#开发这几年,遇到“调用WebService获取PDF文件再转换为图片”这种需求不算少。可能是一个审批系统需要预览合同,也可能是一个报表平台需要把服务端生成的文件转成缩略图展示。总之核心工作就两件事:把远程文件拿下来,再在本地转…

2026/10/14 6:40:29 阅读更多 →
Unity Spark实战:在浏览器中用AI自然语言快速做游戏原型

Unity Spark实战:在浏览器中用AI自然语言快速做游戏原型

看到“Unity Spark 正式发布”这条消息的时候,我第一反应是:又来了。这年头但凡和 AI 沾边的工具都在喊“原生支持 AI”,口号早就被用烂了。但等我真正在浏览器里打开这个基于 AI 的游戏开发环境,亲手生成一个场景、跑通一次跳跃、…

2026/10/14 6:40:29 阅读更多 →
仓颉语言属性(prop)完全指南:getter/setter 定义、抽象属性与继承覆盖实战

仓颉语言属性(prop)完全指南:getter/setter 定义、抽象属性与继承覆盖实战

文档编程语言 【免费下载链接】cangjie_docs 仓颉编程语言开发者文档。 项目地址: https://gitcode.com/Cangjie/cangjie_docs 点击查看 免费下载 属性(Properties)是仓颉语言中用于间接获取和设置值的语言机制:它通过一个 gette…

2026/10/14 6:40:29 阅读更多 →
从Node到Bun:JavaScript运行时与工具链的工程效率革命

从Node到Bun:JavaScript运行时与工具链的工程效率革命

1. 为什么我把重心从 Node 切到了 Bun先说结论:Bun 不是又一个跑得更快的 Node,它是一整套重新设计过的 JavaScript 运行时和工具链。我最初对它的态度是观望,因为这类"下一代运行时"的宣发见过太多次了,但真正在几个中…

2026/10/14 6:40:29 阅读更多 →
C#对接WebService拉取PDF并转图片:从接口调到部署避坑

C#对接WebService拉取PDF并转图片:从接口调到部署避坑

前一阵接手一个对接任务,对方是个运行了十多年的老系统,只对外暴露SOAP风格的WebService接口。业务要求很直接:通过这个接口把PDF文件拉到我们这边,再转成图片,放到Web端做在线预览和打印存档。这类需求在C#开发里非常…

2026/10/14 6:40:29 阅读更多 →
纯Python实现猜数字游戏:从零到避坑的完整指南

纯Python实现猜数字游戏:从零到避坑的完整指南

猜数字游戏大概是很多人的第一个编程项目。它不像计算器那样枯燥,也不需要复杂的界面,但一套完整流程走下来,变量、输入输出、条件判断、循环、异常处理这些编程入门核心概念全部能练到。我最近又把这个小项目从头写了一遍,用最基…

2026/10/14 6:39:29 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →