尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HBase 2.0上安装Phoenix 5.0.0:选包、配置与生产避坑全指南
简介这份压缩包是 Apache Phoenix 5.0.0 针对 HBase 2.0 的官方编译二进制发行版面向需要在大数据平台上通过标准 SQL 对 HBase 数据做低延迟查询的架构师、运维与开发人员。Phoenix 以 JDBC 驱动形式提供关系型数据库访问层会把 SQL 自动编译为 HBase 底层的 scan 操作配合协处理器与自定义过滤器小范围查询可达毫秒级千万行数据也能在秒级返回元数据以带版本号的形式存放于 HBase 表中查询时自动匹配正确 Schema避免手动维护映射关系。安装包共 117 个文件解压后约 416.63MB核心为 42 个 jar涵盖 client、server、pig、hive 等连接组件另有 4 个 SQL 脚本与多份 CSV 样例数据可快速验证建表与查询36 个 py 辅助脚本、properties/ini/yml 配置及 Dockerfile 等文件便于构建自定义部署环境。拿到压缩包后可直接解压部署省去自行编译的麻烦配合样例数据与工具脚本可快速验证 Phoenix 的 SQL 与 JDBC 访问链路适合用于开发测试环境搭建、性能对比实验及基于 Phoenix 的应用开发。目前已有 1303 人浏览学习适合希望直接上手 Phoenix 的 HBase 使用者和相关平台开发者。1. 在 HBase 2.0 上装 Phoenix先认准这个二进制包再谈配置在 HBase 2.0 集群上跑 Phoenix最容易翻车的一步其实是选包。apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz 是 Apache Phoenix 5.0 针对 HBase 2.0 主版本编译的二进制发行包把“SQL on HBase”这层能力做成了可以直接落地的形态。标题里的两个数字说明一切Phoenix 5.0.0 这条版本线绑定的接口是 HBase 2.0不是 1.x。HBase 1.x 和 2.x 在 RPC、协处理器接口、WAL 实现上差异巨大jar 装错一个主版本建表、读写、二级索引都会以诡异的方式失败。下面的内容写给两类人准备把 Phoenix 引入现有 HBase 2.0 集群的运维或数仓同学以及想用 SQL 接口替代一部分原生 API 数据服务的开发。全文会按“包装了什么 → 怎么装 → 怎么用 → 坑在哪 → 能带进生产的技巧”展开命令都按可复现标准写。2. 版本对应与包内结构为什么 5.0.0 必须绑定 HBase 2.02.1 从 4.x 到 5.0.0HBase 2.0 的接口变化决定了版本线HBase 2.0 是一个分水岭版本。它把 WAL 默认实现换成了 AsyncFSWAL把 Region 内部接口大规模重写Procedure 框架也换成了 V2RPC 层的兼容策略比 1.x 严格得多。Phoenix 并不是一个独立的数据库它以协处理器的形式深度嵌进 RegionServer建表要动 meta、查询要下推、索引要靠 RegionServer 侧的 observer 接口。HBase 一换接口Phoenix 必须跟着重新编译否则协处理器加载时直接报方法签名找不到。这也是为什么 Apache Phoenix 的下载页上同一个版本号会拆出多个带 HBase 主版本后缀的构建。5.0.0 不是对 4.x 的小修小补它是接替 4.x 的独立版本线目标就是 HBase 2.0 的 API。你在 HBase 2.0 集群上硬塞一个 Phoenix 4.x 的 jar运气好能起来但建表大概率抛 NoSuchMethodError这类错误不看日志几乎定位不出来属于最典型的版本绑定问题。我一般会先确认集群的 HBase 主版本再选包命令是hbase version主版本是 2.0.x才用标题里这个包。顺带说清楚 Phoenix 的定位它让你用标准 JDBC 和 SQL 语法读写 HBase还提供二级索引、视图映射、批量导入工具。这不只是给开发省事更大的价值在数据团队可以直接用 BI 工具连 HBase而不必为每个报表写一遍 Java API。但要记住SQL 层再顺底层还是 HBase 的 rowkey 和 Region 模型设计表和调优时思维不能完全切换到关系型数据库。2.2 解压后里面有什么server jar 与 client jar 的职责解压 apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz 后核心是 bin 和 lib 两个目录。bin 下是 sqlline.py 和 psql.py前者是交互式 SQL Shell后者是批量导入 CSV 的脚本。lib 下最容易搞混的两类 jar一类是服务端用的 phoenix-server一类是客户端用的 phoenix-client文件名里都带 HBase-2.0 前缀。server jar 要放进 HBase 集群每一个 RegionServer 的 lib 目录它提供协处理器、索引相关的 observer 以及服务端侧的 SQL 执行组件client jar 是给应用进程用的 JDBC 驱动sqlline.py 启动时实际加载的就是它。两者装反或只装一边现象完全不同只装 client 不装 server建表时 RegionServer 端找不到协处理器日志里全是 ClassNotFound只装 server 不装 clientsqlline 根本起不来。所以部署清单里我永远把「server jar 入集群、client jar 入应用」这句话放第一行。tar -xzf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz cd apache-phoenix-5.0.0-HBase-2.0-bin ls bin lib参数说明解压后直接进入该目录后续所有命令都基于这个目录。ls bin lib只是为了确认解压完整lib 下依赖很多不要手工删减Phoenix 5.0 的查询优化依赖 Calcite 相关组件少一个 jar 都可能影响 SQL 解析。2.3 动手之前先对照版本HBase 安装与配置里的 JDK、Hadoop 与 ZooKeeperHBase 安装与配置这一步往往决定 Phoenix 能不能顺利跑起来。我先说结论HBase 2.0 基于 JDK 8 编译集群的 Java 最好就停在 8别用 11 硬跑虽然能启动但 Phoenix 内部一些反射和字节码逻辑会出现诡异行为。Hadoop 版本上2.7、2.8 和 3.x 都能和 HBase 2.0 配合但要注意 HDFS 的 RPC 版本兼容混搭时优先查 HDFS 客户端和服务端的版本协商日志。ZooKeeper 方面HBase 2.0 的常见配套是 3.4.x。这里有个很多人忽略的点ZK 集群的节点数、会话超时时间直接决定 Phoenix 建表和查询的稳定性。ZK 会话超时设得太短RegionServer 频繁失联Phoenix 的元数据表也会跟着受影响表层现象是 sqlline 里!tables卡住。还有人会在 CDH 或 HDP 这类发行版上直接装 Apache Phoenix我建议先查发行商自带的 HBase 版本和补丁列表发行版通常改了部分内部接口直接拿 Apache 的二进制包有可能在协处理器加载阶段失败。环境组合上一个常见稳定组合是 JDK 8 Hadoop 2.8.5 ZK 3.4.13 HBase 2.0.x Phoenix 5.0.0但这不代表唯一可行关键是每一步都用hbase version、java -version、zkServer.sh status确认实际值而不是看装机文档。3. 最小部署到 HBase 2.0拷贝 jar、重启 RegionServer、用 sqlline 验证3.1 把 server jar 放进 HBase lib为什么必须重启 RegionServerPhoenix 的 server jar 要进入每台 RegionServer 的类路径而这个类路径是在 RegionServer 进程启动时确定的。所以拷贝 jar 之后必须重启 RegionServer不是热加载也不是等它自动生效。很多人在这步图省事只把 jar 拷到 Master 节点结果 RegionServer 上的 region 打开时加载不到 Phoenix 协处理器建表报错还误以为是 SQL 语法问题。PHOENIX_HOME/opt/apache-phoenix-5.0.0-HBase-2.0-bin HBASE_HOME/opt/hbase-2.0.x # 换成你实际的 HBase 安装路径 cp $PHOENIX_HOME/phoenix-server-hbase-2.0-5.0.0.jar $HBASE_HOME/lib/逻辑说明cp把 server jar 复制到 HBase 的 lib 目录所有 RegionServer 启动时都会扫描该目录。注意这个 jar 文件名是形如 phoenix-server-hbase-2.0-5.0.0.jar不同构建的后缀可能略有差异以你解压出来的实际文件名为准。$HBASE_HOME/bin/hbase-daemon.sh stop regionserver $HBASE_HOME/bin/hbase-daemon.sh start regionserver参数说明如果有多台 RegionServer逐台滚动重启不要一次性全停否则 meta 表短暂不可用Phoenix 建表时可能直接报 NotServingRegionException。Master 也建议跟着重启一轮因为 Phoenix 的部分系统级协处理器在 Master 侧也需要加载。重启后先确认进程活着$HBASE_HOME/bin/hbase shell里执行status必要时看 RegionServer 日志里有没有加载 Phoenix 相关类的记录。3.2 sqlline.py 连接集群最小命令与第一个表部署完成后的第一件事是用 sqlline.py 连一次集群。sqlline.py 连接的是 ZooKeeper 地址后续的数据读写由 Phoenix 客户端自己解析到对应 RegionServer。所以连接参数的核心是 ZK quorum而不是 HBase Master 地址。export HBASE_CONF_DIR/etc/hbase/conf # 让 sqlline.py 读到集群的 hbase-site.xml $PHOENIX_HOME/bin/sqlline.py zk1:2181,zk2:2181,zk3:2181逻辑说明sqlline.py 启动时会读取 HBASE_CONF_DIR 指向的 hbase-site.xml因此hbase.zookeeper.quorum和zookeeper.znode.parent这两个属性会直接被继承。命令行里的 ZK 列表是显式连接串适用于配置里没写 quorum 的情况。如果你的 HBase 在 ZK 里的根节点不是默认的 /hbase务必保证 hbase-site.xml 里的zookeeper.znode.parent正确否则连接上了却找不到表。进入 sqlline 后先执行!tables这会触发 Phoenix 首次初始化系统表。第一次可能等十几秒正常现象。然后建一张测试表并写入CREATE TABLE IF NOT EXISTS demo_user ( id INTEGER PRIMARY KEY, name VARCHAR, created TIMESTAMP ); UPSERT INTO demo_user (id, name, created) VALUES (1, phoenix, NOW()); SELECT id, name, created FROM demo_user;参数说明PRIMARY KEY必须存在Phoenix 靠它映射 HBase rowkey。UPSERT 是 Phoenix 的写入语法有则覆盖、无则插入对应 HBase 的 put 语义。NOW() 是 Phoenix 内置函数写入当前时间戳。如果这三条 SQL 都执行成功说明 server jar 已生效部署链路是通的。3.3 建表之后去 HBase Shell 看Phoenix 的表在 HBase 里长什么样很多用过 Phoenix 的人第一次在 HBase Shell 里list时都会愣一下因为看到的表结构和预期不完全一样。我们用 HBase Shell 观察刚才建的表$HBASE_HOME/bin/hbase shell describe DEMO_USER你会发现表名变成了大写 DEMO_USER。Phoenix 默认把不带引号的 SQL 对象名转成大写这是第一个容易踩的地方。再看列族name 和 created 没有显式指定列族Phoenix 会把它们放进默认列族0里。也就是说SQL 层你感觉在建一张关系表落到底层实际是 HBase 的一张单列族表每个字段是 0 列族下的不同 qualifier。另一个值得记住的现象是直接用 HBase Shell scan 这张表看到的值是一段带长度前缀的二进制不是明文。这是 Phoenix 的类型序列化结果VARCHAR 有长度标记、TIMESTAMP 是固定字节宽度不代表数据写坏了。如果你需要让 HBase 侧也能直接读明文建表时就别用 Phoenix 的默认类型而是把字段定义成 VARCHAR 并接受它的序列化格式或者干脆走 HBase API 反序列化。这里没有完美的两全方案关键是根据你的消费方决定哪一侧先妥协。4. 从 SQL 到 HBase 的实际映射主键、upsert 与二级索引设计4.1 rowkey 就是主键Phoenix 建表时怎么设计主键Phoenix 建表时PRIMARY KEY 直接映射到 HBase rowkey。单一主键时rowkey 就是该字段按 Phoenix 类型序列化后的字节复合主键则按声明顺序拼接。这意味着在 Phoenix 里做主键设计本质上就是在做 HBase 表设计只是换了一层 SQL 皮。HBase 面试题里常问的 rowkey 热点、散列、前缀设计在 Phoenix 里全都要重新面对一遍。CREATE TABLE orders ( order_id VARCHAR NOT NULL, user_id VARCHAR NOT NULL, status VARCHAR, ts TIMESTAMP, CONSTRAINT pk PRIMARY KEY (order_id, user_id, ts) );参数说明主键字段必须声明 NOT NULL因为 HBase rowkey 本身不允许为空。复合主键的顺序就是 rowkey 字节顺序最左侧字段变化最频繁最容易形成热点。比如 order_id 如果是随机 UUID那 rowkey 前缀完全是散的写入会均匀但要小心 region 数量增长是否跟得上。我见过的最常见错误是把随机主键放在第一位然后每条插入都跨 region导致写入毛刺明显。解决办法有两个方向一是把查询频次最高的等值字段移到主键最左侧比如先 user_id 再 ts二是建表时加 SALT_BUCKETS 参数让 Phoenix 在 rowkey 前加盐值均匀打散到指定数量的桶里。但盐化会牺牲 range scan 的效率所以加不加取决于你的查询是点查多还是范围查多。建表时要想清楚之后加盐要重建表没有后悔药。4.2 upsert 与 deletePhoenix 的写入语义和 HBase 的 put/deletePhoenix 没有 INSERT只有 UPSERT语义和 HBase put 完全一致同一个 rowkey 再写一次就是覆盖。DELETE 在 HBase 侧也不是立刻物理删除而是写 tombstone 标记后面 major compaction 才真正清掉。这个底层机制决定了两个使用习惯频繁 upsert 会产生大量版本数据记得设置合理的列族版本数delete 之后表空间不会马上掉下来看 disk 容量别在生产上做实时判断。DELETE FROM demo_user WHERE name phoenix;参数说明这条 SQL 不带主键条件Phoenix 只能走全表扫描逐个匹配 name 列。小表无所谓生产大表这么写会拖垮 RegionServer。传统数据库里 delete 带非索引条件是常规操作在 Phoenix 里属于高危写法线上必须保证 where 至少覆盖主键前缀或者走二级索引。Phoenix 的 DML 全部走 HBase 的 WAL。HBase 2.0 默认 WAL 是 AsyncFSWAL日志落在 HDFS 的 /hbase/WALs 目录下。你看到 HBase WAL 预写日志异常时Phoenix 的写入必然也在失败这不是两个独立故障是同一个底层问题在两层分别报错。排查时先看 HBase 侧别在 SQL 层浪费时间。另外如果你本来想用 sqoop 直接往 Phoenix 灌数据我先劝你冷静sqoop 操作 HBase 时走的是原生客户端语义绕过了 Phoenix 的 SQL 层很容易踩 classpath 和协处理器的双份坑批量导入更稳的路径是用 Phoenix 自带的 psql.py 或先落 HFile 再 bulkload。4.3 二级索引与 WAL 编码global index 的隐藏配置Phoenix 的二级索引是它区别于纯 HBase API 的关键能力但索引不是建了就完事。global index 适合读多写少的场景索引表独立存储查询时如果条件能命中索引就不扫主表local index 适合写多读少的场景索引数据存在本地 region写入代价小但查询可能要聚合多个 region。CREATE INDEX idx_orders_user ON orders (user_id);参数说明这条语句创建全局索引。如果只建索引不调配置你会在写入时遇到 WAL 相关报错。原因是 Phoenix 的全局索引写入也要走 WAL而 HBase 默认的 WAL codec 不理解 Phoenix 索引产生的 WALEdit所以必须在 hbase-site.xml 里显式声明 codecproperty namehbase.regionserver.wal.codec/name valueorg.apache.hadoop.hbase.protobuf.regionserver.WALEditCodec/value /property参数说明这个配置要放在每一台 RegionServer 的 hbase-site.xml 里改完重启。加了它HBase 才能正确解码 Phoenix 索引写入。很多新手建完索引发现数据对不上排查半天最后是漏了这行配置。local index 则不受这个限制因为它不走独立索引表的 WAL 路径但覆盖字段的能力不如 global index。选择标准我一般就一句话你的写入 QPS 高不高查询能不能接受一次索引表回表。5. 部署与运行避坑WAL 异常、Master initialing、版本混用排查5.1 RegionServer 反复重启并报 WAL 预写日志异常现象RegionServer 起来后几分钟就挂日志高频出现 AsyncFSWAL 相关的 Sync 失败、HDFS 写入异常与此同时 Phoenix 的任何 DML 都报超时或写入失败。原因HBase 2.0 默认的 WAL provider 是 asyncfs它在某些文件系统组合下会出现同步异常比如本地磁盘 inode 打满、HDFS NameNode 抖动、或者和某些云存储的 flush 语义不兼容。Phoenix 本身没有独立的 WAL 实现它完全复用 HBase 的写路径所以问题不在 SQL 层。解决先查 HDFS 上的 WAL 目录是否可写hdfs dfs -ls /hbase/WALs再确认磁盘空间和 inode。如果都没有异常做一个对照试验在 hbase-site.xml 里把hbase.wal.provider从 asyncfs 临时改为 filesystem重启 RegionServer 观察。切回 filesystem 后写入稳定基本可以断定是 AsyncFSWAL 与底层存储的兼容问题再考虑是否长期切换或给 HDFS 做调优。这类黑匣子问题我的习惯是先改配置再查代码能省半天时间。5.2 sqlline 连不上集群先核对 HBase 端口清单再怀疑 Phoenix现象sqlline.py 启动后卡在 connecting或直接拒绝连接hbase shell 可能正常也可能同样连不上。原因sqlline 客户端先连 ZooKeeper 拿 meta 信息再连 RegionServer 的 RPC 端口。很多集群只对外开放了 2181RPC 端口在防火墙里没放行于是 ZK 能连上后续 RPC 全部失败。先按端口清单逐项确认再决定是否排查 Phoenix 配置。端口默认服务说明2181ZooKeeper clientPhoenix 连接串入口16000HBase Master RPC2.0 默认16010HBase Master Web UI看集群状态用16020RegionServer RPCPhoenix 实际读写走这里16030RegionServer Web UI查看 region 分布排查时分别 telnet 这三个地址zk 的 2181、RegionServer 的 16020、Master 的 16010。如果集群内 telnet 通了但客户端通不了是防火墙如果集群内也通不了是 HBase 服务本身没起来。不要在没确认端口可达的情况下去调 Phoenix 的超时参数方向就错了。5.3 HBase Master initialing 卡住系统表、ZK 会话与 Phoenix 协处理器现象Master Web UI 长期显示 Initializing Master 状态Phoenix 建表报 meta 相关异常比如 NotServingRegionException 或 ZK 连接超时。原因HBase 2.0 的 Master 启动依赖 hbase:meta 和 hbase:namespace 系统表可用。ZK 会话超时、RegionServer 没完全注册、Phoenix 系统表所在 region 卡住都会让 init 卡在那里。还有一种隐蔽情况phoenix-server jar 拷进 lib 后只重启了 RegionServer 没重启 MasterMaster 进程里还是旧类启动阶段加载协处理器失败但不直接报错只是卡住。解决按顺序做三件事。第一确认所有 RegionServer 进程都在hbase zkcli里看在线节点数。第二用 hbck 检查 meta 表状态。第三看 Master 日志最后 50 行明确卡在哪个步骤。如果日志里出现 Phoenix 类加载异常重启所有 Master 和 RegionServer让新 jar 完整生效。血泪经验是这种问题别反复点 Web UI 刷新日志才是唯一可信的进度条。5.4 版本混用翻车ClassNotFound 与 NoSuchMethodError现象协处理器加载失败日志抛 ClassNotFoundException 指向 org.apache.phoenix 包或者建表能成功但一执行查询就 NoSuchMethodError偶尔还能看到建表成功但索引数据不完整。原因HBase lib 目录下混入了多个 Phoenix 版本或者客户端 CLASSPATH 里同时放了 client-hbase-1.x 和 client-hbase-2.x 的 jar。Phoenix 4.x 时代很多教程让你拷贝 phoenix-core-xxx.jar这个习惯带到 HBase 2.0 上会直接冲突。解决先清点。ls -l $HBASE_HOME/lib/phoenix*.jar每台 RegionServer 上只保留一个和 HBase 主版本匹配的 phoenix server jar其余全部删除。客户端同理检查启动脚本里的 CLASSPATH不要混放多个 client 版本。这种问题最玄学的地方在于 jar 顺序不同不同进程加载到的类不同行为完全随机。排查时先看启动命令的-cp参数逐个 jar 核对通常能找到两个 phoenix 版本并存。别凭记忆删把 lib 目录ls -l的完整输出保存一份再动手。5.5 Windows 开发机上跑 sqlline.py 连集群现象Windows 上直接执行 sqlline.py 连不上集群或连上后中文乱码中文写入后读出来是问号。原因sqlline.py 本质是 Unix shell 脚本Windows 裸环境下要额外依赖 winutils相当于还要把 Hadoop 环境在 Windows 上配一遍这是 Window 安装 HBase 场景里最常见的一层额外成本。乱码则是 sqlline 默认使用平台编码Windows 中文环境是 GBK而 HBase 侧的 Phoenix 元数据按 UTF-8 处理两边对不上。解决不要试图在 Windows 上硬跑 sqlline.py。常见做法是开发机装 WSL在 WSL 里跑客户端或者直接在 Linux 跳板机上跑。如果只是连集群查数据用 DBeaver 这类 JDBC 图形工具会更省事注意 JDBC URL 填 ZK 地址而不是 Master 地址。另外Windows 上即使跑通了也别把 Phoenix 解压目录里的 hadoop 相关 jar 放进系统 PATH会污染本机其他 HBase 工具。6. 进阶把已有 HBase 表映射成 Phoenix 视图与性能验证习惯6.1 已有 HBase 表用 CREATE VIEW 映射大小写和列族必须带引号迁移数据永远比映射表结构重。如果你的 HBase 表已经上线不想动数据Phoenix 能用 CREATE VIEW 直接映射。视图不占额外存储所有读写都指向原表但注意它不能建二级索引。CREATE VIEW raw_event ( rk VARCHAR PRIMARY KEY, f.url VARCHAR, f.ts BIGINT );参数说明这里的双引号不是装饰。HBase 表名如果是小写 raw_event不加双引号Phoenix 会转成大写 RAW_EVENT然后告诉你表不存在。列族名 f 同样必须加双引号。定义视图字段时类型要和 HBase 侧实际存储的字节对得上否则查询出来的数据会是乱码或类型转换异常。视图映射适合查询模式简单的场景比如给报表工具暴露几张固定表如果查询复杂还是老老实实建 Phoenix 表再回填数据。6.2 每次改动后的验证路径EXPLAIN 与超时参数调整每次改表结构、加索引、调完参数我都建议先跑一遍 EXPLAIN再验证真实查询。不要直接拿着生产语句试那样出了问题也不好区分是数据问题还是索引没生效。EXPLAIN SELECT id FROM orders WHERE user_id u1;看输出里是 SKIP SCAN 还是 FULL SCAN就能判断二级索引有没有被优化器选中。这是不依赖任何监控面板的最快验证方式适合写进发布检查单。超时参数也是必调项。Phoenix 的查询超时由phoenix.query.timeoutMs控制单位毫秒默认值偏小复杂聚合很容易被中断。放进 hbase-site.xml 后重启 RegionServer 生效property namephoenix.query.timeoutMs/name value120000/value /property另一个常见参数是hbase.client.scanner.timeout.period它影响扫描阶段的超时长任务查询要同步调大。我自己的习惯是把这两项写在部署文档里和索引是否命中一起作为每次上线的固定检查项。更新 Phoenix 版本之前先在测试集群完整跑一遍 EXPLAIN 脚本因为优化器规则在新版本里可能有变化同一个查询的索引选择会变别等上了生产才发现 full scan。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

ROS移动机器人路径规划:A*与人工势场法融合实战

ROS移动机器人路径规划:A*与人工势场法融合实战

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

📅 2026/9/25 2:06:08
医疗设备电击防护分类详解:B型、BF型、CF型设计与漏电流控制

医疗设备电击防护分类详解:B型、BF型、CF型设计与漏电流控制

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

📅 2026/9/25 2:06:08
GaN栅极驱动设计要点:从器件特性到PCB布局的完整指南

GaN栅极驱动设计要点:从器件特性到PCB布局的完整指南

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

📅 2026/9/25 2:06:08
MORE NEWS

更多资讯

📰

sql-server-samples 中的 SmoSamples:基于单元测试的 SMO 性能优化与网络度量实战

示例工程数据库教程后端 【免费下载链接】sql-server-samples Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge 项目地址: https://gitcode.com/gh_mirrors…

📰

Tftpd64从安装到首次传文件:10分钟搭好Windows轻量级TFTP服务器教程

Tftpd64从安装到首次传文件:10分钟搭好Windows轻量级TFTP服务器教程 【免费下载链接】tftpd64 The working repository of the famous TFTP server. 项目地址: https://gitcode.com/gh_mirrors/tf/tftpd64 Tftpd64 是一款轻量级、多线程的 Windows 服务器软件…

📰

百考通AI实操指南:毕业设计从“肝”到“干”的高效路径

每年三四月份,各大高校的实验室和宿舍里总会准时上演同一出戏:论文查重红字满天飞、代码跑不出结果、开题报告还没动笔、PPT答辩日期已经逼近。我见过太多学生把毕业设计活活完成了一场“肝”的竞赛——熬夜刷夜赶进度、复制粘贴攒章节、对着空白文档发呆…

📰

从线上事故到分层记忆:Agent上下文工程实战指南

1. 从一次线上事故说起:为什么上下文工程比提示词工程更值得投入去年冬天,我负责的一个客服类 Agent 上线第三天就出了状况。用户投诉说,同一个问题问到第五轮,Agent 就开始"失忆",前面确认过的订单号、退款…

📰

WebMCP 声明式 API 终极指南:用 <form> 零 JS 把网页表单变成 AI 可调用工具

WebMCP 声明式 API 终极指南&#xff1a;用 零 JS 把网页表单变成 AI 可调用工具【免费下载链接】webmcp &#x1f916; WebMCP 项目地址: https://gitcode.com/gh_mirrors/webm/webmcp WebMCP 声明式 API 让你无需写一行 JavaScript&#xff0c;只需给现有的 <form&…

📰

基于企业微信API的Python智能聊天机器人开发实践指南

简介&#xff1a;这是一份基于Python的微信智能聊天机器人完整源码&#xff0c;适合Python开发者、AI应用爱好者及需要搭建个人/企业微信机器人的技术人员。项目整合了GPT-3.5、GPT-4、Claude、文心一言、讯飞星火等多款大模型&#xff0c;支持私聊与群聊多轮上下文记忆&#x…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬