Flink + Iceberg 本地环境搭建实战:版本选型、Catalog 配置与常见问题排查
1. 为什么值得搭一套 Flink Iceberg 的本地环境大数据圈子里有个很现实的现象很多团队用着 Hive 或者纯对象存储做数据湖白天跑批还凑合一到近实时场景就露馅——写入延迟高、小文件泛滥、Schema 变更要停服、回溯历史数据得全量重跑。Flink 加 Iceberg 这套组合恰好是冲着这些痛点来的。Flink 负责流式写入和增量计算Iceberg 负责在文件层面提供表级别的 ACID、快照隔离、隐藏分区和时间旅行。两者拼在一起你能得到一张既能流写、又能批读、还能随时回滚的表。这篇文章面向的是想在自己机器或测试集群上把 Flink Iceberg 跑通的人。你可能已经会写 Flink SQL也听说过 Iceberg但真正动手时卡在依赖冲突、Catalog 配置、Jar 包版本对不上这些琐碎环节上。我会把整套搭建流程拆开讲清楚包括每一步为什么这么做、参数怎么算、踩过的坑怎么绕。环境以本地单机加对象存储或本地文件系统为主这套思路平移到测试集群同样适用。需要先说明一点Flink 和 Iceberg 的版本耦合非常紧。Iceberg 官方为每个 Flink 大版本单独维护一个 runtime jar比如 Flink 1.17 对应iceberg-flink-runtime-1.17Flink 1.18 对应iceberg-flink-runtime-1.18。你如果拿 1.17 的 runtime 去配 1.18 的 Flink大概率在提交作业时报NoSuchMethodError或者ClassNotFoundException。所以第一步不是急着下载而是先把版本矩阵定下来。我个人的习惯是Flink 选一个稳定的次版本比如 1.18.xIceberg 选与之匹配的最近一个 releaseHadoop 依赖统一到 3.3.x 这一档避免和 Flink 自带的 shaded hadoop 打架。下面从整体设计思路开始一步步把环境搭起来再把常见问题逐个拆解。2. 整体设计与版本选型思路2.1 组件角色划分与数据流向先把这套系统里每个角色干什么说清楚不然后面配参数容易懵。Flink计算引擎。它通过 Iceberg 提供的 Connector 读写表SQL 层面对用户暴露的就是一张普通表。流作业持续写入批作业做全量或增量读取。Iceberg表格式层。它不存数据本身而是管理哪些数据文件属于这张表的哪个快照。元数据用 manifest 文件加 metadata.json 组织数据文件可以是 Parquet、ORC、Avro。Catalog表的注册中心。Iceberg 支持 Hive Catalog、Hadoop Catalog、REST Catalog 等。本地测试用 Hadoop Catalog 最省事生产上 Hive Catalog 或 REST Catalog 更常见。存储层可以是 HDFS、S3 兼容对象存储或者本地文件系统。本地测试直接file://就行。数据流向是这样的Flink 作业写入时先写数据文件到存储层然后提交一次 snapshot更新 metadata.jsonCatalog 里记录最新 metadata 位置。读取时Flink 先问 Catalog 要 metadata 位置再根据 snapshot 找到对应的 manifest最后定位到数据文件。理解这条链路后面排查表读不到数据就有方向了。2.2 版本矩阵怎么定才不翻车版本选型是这套环境里最容易翻车的地方。我整理了一张实际验证过的对照表你可以直接参考组件推荐版本说明Flink1.18.1次版本稳定社区资料多Iceberg1.4.3与 Flink 1.18 匹配的 runtimeHadoop3.3.6统一依赖避免 shaded 冲突JDK11Flink 1.18 官方支持 8/1111 更省心Scala2.12如果用 Scala API 需注意选 Flink 1.18 而不是更新的 1.19、1.20是因为 Iceberg 对最新 Flink 版本的适配往往滞后一两个季度。你追新版本很可能发现对应的 runtime jar 还没发布只能自己编译那又是另一堆坑。1.18 这个档位Iceberg 1.4.x 已经提供了官方 runtime拿来即用。Hadoop 依赖这块要特别小心。Flink 发行包里自带了一份 shaded 的 Hadoop但 Iceberg 的 runtime jar 里也可能带 Hadoop 相关类。如果两边版本不一致运行时会报类加载冲突。我的做法是在FLINK_HOME/lib下只放 Iceberg runtime jarHadoop 相关依赖通过HADOOP_CLASSPATH环境变量引入保持单一来源。2.3 本地环境与集群环境的差异本地搭和集群搭核心差异在三点存储路径、Catalog 类型、资源分配。本地用file:///tmp/iceberg-warehouse这种路径最直接不需要额外起 HDFS。Catalog 用 Hadoop Catalog配置里指定 warehouse 路径即可不需要 Hive Metastore。资源上单机 JVM 内存给到 2G 到 4G 就够跑 demo。集群环境则要考虑warehouse 放在 HDFS 或对象存储上Catalog 换成 Hive 或 RESTTaskManager 内存和 slot 数要按数据量算。但配置项的名字和结构是一样的本地跑通后改几个路径和地址就能迁移。所以我的建议永远是先在本地把最小闭环跑通再上集群。3. 环境搭建的完整实操步骤3.1 基础依赖安装与目录规划先规划目录避免文件到处乱放。我习惯这样组织/opt/bigdata/ ├── flink-1.18.1/ ├── iceberg/ │ └── iceberg-flink-runtime-1.18-1.4.3.jar ├── hadoop-3.3.6/ └── warehouse/JDK 11 装好后设置环境变量export JAVA_HOME/usr/lib/jvm/java-11-openjdk export FLINK_HOME/opt/bigdata/flink-1.18.1 export HADOOP_HOME/opt/bigdata/hadoop-3.3.6 export HADOOP_CLASSPATH$HADOOP_HOME/bin/hadoop classpath export PATH$FLINK_HOME/bin:$HADOOP_HOME/bin:$PATH这里HADOOP_CLASSPATH是关键。Flink 启动时会读取这个变量把 Hadoop 的类路径加进来。如果你不设Iceberg 写 HDFS 时会报No FileSystem for scheme hdfs。本地文件系统虽然不依赖它但设上没坏处方便后续切换。下载 Iceberg runtime jar 时文件名里的版本号要对上。以 Flink 1.18 为例去 Iceberg 的 release 页面找iceberg-flink-runtime-1.18-1.4.3.jar放进$FLINK_HOME/lib/。注意是 runtime 这个 shaded 包不是iceberg-flink那个普通模块后者缺依赖放进去跑不起来。3.2 Flink 配置调整要点Flink 默认配置跑 demo 够用但有几个地方建议改一下省得后面出问题。编辑$FLINK_HOME/conf/flink-conf.yamljobmanager.rpc.address: localhost jobmanager.memory.process.size: 1600m taskmanager.memory.process.size: 2048m taskmanager.numberOfTaskSlots: 4 parallelism.default: 2内存别给太小。Iceberg 写入时会缓存 manifest 和文件元数据内存不够容易 OOM。本地测试 2G 的 TaskManager 是底线。还有一个容易忽略的点classloader.resolve-order。默认是child-first这在大多数情况下没问题但如果遇到 Iceberg 和 Flink 的类冲突可以临时改成parent-first试试。不过改这个要谨慎可能引入其他问题我一般只在排查阶段用。启动集群$FLINK_HOME/bin/start-cluster.sh访问http://localhost:8081能看到 Web UI 就说明 Flink 起来了。这时候 Iceberg 的 jar 还没被加载需要提交作业时才会用到。3.3 Catalog 配置与建表验证Flink SQL Client 是验证环境最快的方式。启动它$FLINK_HOME/bin/sql-client.sh在 SQL Client 里创建 CatalogCREATE CATALOG iceberg_catalog WITH ( type iceberg, catalog-type hadoop, warehouse file:///opt/bigdata/warehouse );这里catalog-type选hadoop表示用 Hadoop Catalog元数据直接存在 warehouse 路径下不需要额外的 metastore 服务。warehouse路径要写绝对路径且带file://前缀否则可能被解析成相对路径。切换到这个 Catalog建库建表USE CATALOG iceberg_catalog; CREATE DATABASE IF NOT EXISTS demo; USE demo; CREATE TABLE orders ( order_id BIGINT, user_id BIGINT, amount DECIMAL(10,2), order_time TIMESTAMP(3), dt STRING ) PARTITIONED BY (dt);建表成功后去 warehouse 目录下看应该能看到demo.db/orders/metadata/下有 metadata.json 文件。这一步验证了 Catalog 和存储层是通的。3.4 流式写入与批读验证建完表插几条数据试试INSERT INTO orders VALUES (1, 1001, 99.50, TIMESTAMP 2024-01-01 10:00:00, 2024-01-01), (2, 1002, 150.00, TIMESTAMP 2024-01-01 11:00:00, 2024-01-01);然后查询SELECT * FROM orders;能查到数据说明写入和读取链路都通了。这时候可以进一步验证 Iceberg 的特性比如看快照SELECT * FROM orders.snapshots;这个元数据表会列出每次写入产生的 snapshot。再试试时间旅行SELECT * FROM orders VERSION AS OF snapshot_id;把 snapshot_id 换成上一步查到的值能看到那个时间点的数据。这就是 Iceberg 相比普通 Hive 表的核心优势之一。流式写入的话可以用 datagen connector 模拟CREATE TABLE orders_stream ( order_id BIGINT, user_id BIGINT, amount DECIMAL(10,2), order_time TIMESTAMP(3), dt STRING ) WITH ( connector datagen, rows-per-second 10 ); INSERT INTO orders SELECT * FROM orders_stream;提交后去 Web UI 看应该有一个持续运行的流作业。等几秒再查orders表数据在增长说明流式写入 Iceberg 也通了。4. 常见问题与排查技巧实录4.1 类冲突与依赖问题排查这是最高频的问题没有之一。典型报错长这样java.lang.NoSuchMethodError: org.apache.iceberg.Table.snapshots()Lorg/apache/iceberg/Snapshot;或者java.lang.ClassNotFoundException: org.apache.iceberg.flink.TableLoader出现这类错误九成是版本不匹配或者 jar 放错位置。排查顺序如下确认$FLINK_HOME/lib/下只有一份 Iceberg runtime jar且版本与 Flink 匹配。确认没有把iceberg-flink非 runtimejar 也放进去两个一起放必然冲突。检查HADOOP_CLASSPATH是否引入了不同版本的 Hadoop 依赖。如果用了 Flink 的lib和plugins两套加载机制确认 Iceberg jar 放在lib下。我整理了一张速查表报错关键词可能原因解决方向NoSuchMethodError版本不匹配核对 Flink 与 Iceberg 版本ClassNotFoundExceptionjar 缺失或路径错检查 lib 目录No FileSystem for schemeHadoop 依赖未引入设置 HADOOP_CLASSPATHClassCastException多份同类 jar清理重复依赖提示排查类冲突时用jar tf xxx.jar | grep 类名确认类在哪个 jar 里比盲目猜测快得多。4.2 写入失败与元数据异常处理写入阶段常见的问题有两类文件写不进去和元数据提交失败。文件写不进去报错通常是权限或者路径问题。本地文件系统下检查 warehouse 目录的读写权限。如果是 HDFS检查当前用户对目标路径是否有写权限。对象存储的话检查 access key 和 endpoint 配置。元数据提交失败报错可能是org.apache.iceberg.exceptions.CommitFailedException: Cannot commit, found new snapshots这是并发写入冲突。Iceberg 用乐观锁提交两个作业同时写一张表后提交的会失败。解决办法是给写入作业加锁或者用write.upsert.enabled之类的配置减少冲突。生产上更推荐的做法是让同一张表只有一个写入作业通过 Flink 的并行度控制而不是多作业并发。还有一种情况是提交超时TimeoutException: Committing snapshot timed out这通常是存储层响应慢或者 snapshot 太大。可以调大commit.retry.num-retries和commit.retry.min-wait-ms。但根本解法是控制单次提交的文件数量避免一次写太多小文件。4.3 小文件问题与性能调优小文件是数据湖的老大难。Flink 流式写入 Iceberg默认每次 checkpoint 都会产生一批文件checkpoint 间隔短的话小文件会爆炸式增长。控制手段有几个调大 checkpoint 间隔比如从 10 秒改成 1 分钟减少提交频率。开启 Iceberg 的write.distribution-mode设为hash或range让数据按分区键分布减少文件数。定期跑 compaction。Iceberg 支持rewrite_data_files动作可以合并小文件。Flink SQL 里执行 compactionCALL iceberg_catalog.system.rewrite_data_files( table demo.orders, options map(target-file-size-bytes, 134217728) );134217728就是 128MB这是比较通用的目标文件大小。太小起不到合并效果太大又影响读取并行度。注意compaction 本身也是写操作会消耗资源建议放在低峰期跑或者用独立的批作业调度。4.4 时间旅行与 Schema 演进的实操坑时间旅行用起来很爽但有两个坑。第一snapshot 过期。Iceberg 默认会清理旧 snapshothistory.expire.max-snapshot-age-ms默认是 5 天。你想回溯更早的数据得提前调大这个值或者关掉自动清理。但关掉之后元数据会一直增长需要自己管理。第二Schema 演进后读旧数据。Iceberg 支持加列、删列、改类型但读旧 snapshot 时新加的列会返回 null删掉的列读不出来。这是预期行为但如果你没意识到会以为数据丢了。改类型更要小心比如 int 改 long 一般没问题但 string 改 int 可能直接报错。Schema 演进的操作ALTER TABLE orders ADD COLUMN channel STRING; ALTER TABLE orders DROP COLUMN channel;加列之后旧数据查这一列是 null新写入的数据才有值。这个行为在文档里写了但实际用的时候还是容易懵。5. 生产化改造的几个关键点5.1 Catalog 从 Hadoop 换成 Hive 或 REST本地用 Hadoop Catalog 方便但生产上它有个硬伤不支持多客户端并发访问同一张表因为元数据没有集中管理。生产环境一般换 Hive Catalog 或 REST Catalog。Hive Catalog 配置CREATE CATALOG iceberg_hive WITH ( type iceberg, catalog-type hive, uri thrift://metastore-host:9083, warehouse hdfs:///warehouse/iceberg, hive-conf-dir /opt/hive/conf );REST Catalog 是更新的方案把元数据管理抽象成一个服务客户端通过 HTTP 交互。它的好处是解耦存储和元数据可以分开扩展。配置上把catalog-type改成rest再指定uri即可。切换 Catalog 时要注意已有的表元数据不会自动迁移。要么重新建表要么用 Iceberg 的register_table把已有表注册到新 Catalog。这一步操作前务必备份 metadata 目录。5.2 Checkpoint 与写入一致性配置Flink 写 Iceberg 的一致性依赖 checkpoint。只有 checkpoint 成功snapshot 才会提交。所以 checkpoint 配置直接决定了数据可见性和容错能力。关键配置execution.checkpointing.interval: 60s execution.checkpointing.mode: EXACTLY_ONCE execution.checkpointing.timeout: 10min state.backend: rocksdb state.checkpoints.dir: hdfs:///flink/checkpointsEXACTLY_ONCE模式下Iceberg 的提交和 checkpoint 绑定保证不丢不重。但代价是延迟数据要等 checkpoint 完成才可见。如果业务能接受 at-least-once可以放宽换取更低延迟。state.checkpoints.dir一定要配到可靠的存储上本地路径在作业重启后就没了。生产上用 HDFS 或对象存储。5.3 监控与日常维护清单跑起来之后日常要盯几个指标snapshot 数量增长过快说明提交太频繁或者清理没生效。小文件比例文件平均大小低于 32MB 就要考虑 compaction。checkpoint 时长持续变长可能是状态膨胀或存储变慢。写入延迟从数据产生到可查询的时间反映端到端性能。维护动作我一般按这个节奏每天检查 snapshot 和文件数每周跑一次 compaction每月 review 一次表的分区策略和文件大小目标。这些不是硬性规定但按这个节奏走表不会失控。提示Iceberg 的metadata表族snapshots、files、manifests是排查问题的金矿养成查这些表的习惯很多问题不用翻日志就能定位。6. 我在实际搭建中的几点体会这套环境我从头搭过好几遍每次都会在某个环节卡一下但卡的点越来越靠后说明经验确实在积累。最开始是 jar 放错后来是 Catalog 路径写错再后来是 checkpoint 配置不合理导致数据不可见。每一个坑背后其实都是对某个机制理解不到位。如果让我给刚上手的人一句建议那就是先把最小闭环跑通再逐层加复杂度。不要一上来就配 Hive Catalog、上集群、开 EXACTLY_ONCE那样出问题你根本不知道是哪一层的事。本地 Hadoop Catalog 加文件系统把建表、写入、查询、时间旅行这条链路走通再换 Catalog、换存储、调参数每一步只改一个变量问题范围就锁死了。另外版本这件事再怎么强调都不为过。Flink 和 Iceberg 的版本对应关系官方文档里有矩阵表动手前花五分钟对一下能省下后面几小时的排查。我见过太多人栽在版本上包括我自己早期也是。

相关新闻

OWASP Top 10实战指南:从注入防御到安全左移的开发者必修课

OWASP Top 10实战指南:从注入防御到安全左移的开发者必修课

1. 为什么每个开发者的书架上都该有一份OWASP Top 10如果你写过哪怕一个带登录功能的页面,或者调过任何一个对外暴露的接口,那你其实已经在网络安全的风险敞口里了。很多刚入行的朋友觉得“安全”是安全工程师的事,自己只要把业务逻辑跑通就行…

2026/10/17 17:26:23 阅读更多 →
Flink流处理实战:状态管理、时间语义与生产调优指南

Flink流处理实战:状态管理、时间语义与生产调优指南

1. 这不是“又一篇Flink教程”,而是一份流处理老兵的实战手记Flink流处理框架总结——这七个字背后,藏着过去五年里我参与过的12个实时数仓项目、7套IoT设备告警系统、3个金融风控实时决策链路的真实沉淀。它不是教科书式的概念罗列,也不是AP…

2026/10/17 17:25:23 阅读更多 →
CTF Web题实战:JWT弱密钥与zip软链接攻击组合getshell

CTF Web题实战:JWT弱密钥与zip软链接攻击组合getshell

某 CTF 收集平台上有一道 Web 题,出题方我姑且隐去名字,年份标注 2019,题号是 Web3。第一次打的时候,我在上面卡了一个多小时,不是题目有多难,而是两个知识点我都有印象,但始终没串起来&#xf…

2026/10/17 17:25:23 阅读更多 →

最新新闻

Pod生命周期管理:Init容器、探针与优雅终止配置实战

Pod生命周期管理:Init容器、探针与优雅终止配置实战

很多人写Pod配置,习惯从网上抄一份YAML就往集群里丢,表面上跑得挺正常,可一遇到发布、故障、流量抖动,问题就全冒出来了。这些年我排查过的线上事故里,至少有一半的根因都能归结到Pod生命周期管理上——要么Init容器卡…

2026/10/17 18:31:58 阅读更多 →
UE5 MovieRenderQueue 黑块条纹故障根因与修复指南

UE5 MovieRenderQueue 黑块条纹故障根因与修复指南

简介:本资源是一份面向Unreal Engine 5中高级开发者与影视渲染工程师的实战型技术指南,聚焦MovieRenderQueue(MRQ)在实际项目中高频出现的渲染异常问题,如图像条纹、黑块、场景多出物体、全黑输出、相机偏移及着色器编…

2026/10/17 18:31:58 阅读更多 →
Claude Code 模板库实战:npm 一键配置 MCP 与 CLI 环境

Claude Code 模板库实战:npm 一键配置 MCP 与 CLI 环境

1. 这个模板库到底解决了什么问题第一次接触 Claude Code 的人,十有八九会卡在同一个地方:装完了 CLI,敲开终端,面对一个空荡荡的对话框,不知道下一步该干什么。官方文档告诉你它能读文件、能跑命令、能连 MCP&#xf…

2026/10/17 18:31:58 阅读更多 →
用mprotect定位踩内存:三个保护模式与实战技巧

用mprotect定位踩内存:三个保护模式与实战技巧

踩内存这种故障,恐怕是C/C项目里最让人挠头的一类问题。它不像空指针那样干脆利落——空指针崩了就崩了,栈上清清楚楚;踩内存则是延迟引爆的,某处代码把不该写的内存写坏了,但现场不会立刻暴露,往往要等到另…

2026/10/17 18:31:58 阅读更多 →
星界战略:多法域出海合规与数据主权架构实战指南

星界战略:多法域出海合规与数据主权架构实战指南

1. 从“星界战略”这个名字说起:它到底要解决什么问题 第一次看到“星界战略”这个词,很多人会以为是个游戏项目或者科幻设定。但在出海圈子里摸爬滚打几年之后,我越来越觉得这个名字取得很准确——它描述的是一种 跨法域、跨文化、跨监管体…

2026/10/17 18:31:58 阅读更多 →
TensorFlow BaselineClassifier踩坑复盘:从数据管道到模型导出的全链路避坑指南

TensorFlow BaselineClassifier踩坑复盘:从数据管道到模型导出的全链路避坑指南

1. 从一次模型上线事故说起:为什么我盯上了BaselineClassifier去年冬天,团队接了一个用户流失预测的需求。数据量不大,几十万条样本,特征也就二十来个,业务方要得急,三天内要看到第一版可解释的基线结果。当…

2026/10/17 18:30:57 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →