<?xml version="1.0" encoding="UTF-8" ?>
    <rss version="2.0">
      <channel>
        <title>Luminary · 大数据技术博客</title>
        <link>https://zl4629.xyz</link>
        <description>Leomeie 的大数据工程实践笔记，记录 Hive、Spark、Doris、湖仓一体与真实项目踩坑。</description>
        <language>zh-CN</language>
        <lastBuildDate>Mon, 05 Oct 2026 17:07:20 GMT</lastBuildDate>
        
        <item>
          <title>HWLens：硬件行情湖仓数据平台复盘</title>
          <link>https://zl4629.xyz/posts/hwlens-hardware-market-platform</link>
          <guid>https://zl4629.xyz/posts/hwlens-hardware-market-platform</guid>
          <pubDate>Wed, 30 Sep 2026 16:00:00 GMT</pubDate>
          <description>多源采集电脑硬件的在售条目与挂牌价格，经 HDFS / Spark / Iceberg / Doris 建一条湖仓一体的离线数仓，对外提供行情大屏、业务后台和智能体问答。这篇写清整体链路、模块边界，以及哪些部分我明确没有做完。</description>
          <category>数据仓库</category><category>湖仓一体</category><category>Spark</category><category>Doris</category><category>Iceberg</category><category>Kafka</category>
        </item>
        <item>
          <title>删掉旧 chunk 之后，浏览器开始加载两套代码</title>
          <link>https://zl4629.xyz/posts/hwlens-frontend-cache-incident</link>
          <guid>https://zl4629.xyz/posts/hwlens-frontend-cache-incident</guid>
          <pubDate>Mon, 21 Sep 2026 16:00:00 GMT</pubDate>
          <description>一次前端发布引发的连环事故：清掉旧 hash 产物让老入口 404、&quot;同名换内容&quot;的补丁造成混搭缓存、给 HTML 引用加 query 反而让入口脚本执行两次。记录这两天里所有的误判、真因，以及最后那套&quot;全新目录 + 单独覆盖 index.html&quot;的发布规范。</description>
          <category>部署与缓存</category><category>Caddy</category><category>故障排查</category>
        </item>
        <item>
          <title>湖仓一体不是一次切换：旁路双写、直连湖与读路径的回滚设计</title>
          <link>https://zl4629.xyz/posts/hwlens-lakehouse-phases</link>
          <guid>https://zl4629.xyz/posts/hwlens-lakehouse-phases</guid>
          <pubDate>Fri, 04 Sep 2026 16:00:00 GMT</pubDate>
          <description>把 Parquet 目录升级成 Iceberg 表，再让 Doris 直连湖、最后把后端读路径切过去——每一步都能独立验证、独立回滚。记录阶段划分理由、&quot;读回刚写分区再入湖&quot;保的三件事，以及 warehouse 路径被序列化成单斜杠导致 scheme null 的那个坑。</description>
          <category>湖仓一体</category><category>Iceberg</category><category>Doris</category><category>Spark</category><category>架构设计</category>
        </item>
        <item>
          <title>开源供应链数仓：从公开数据到可解释风险大屏</title>
          <link>https://zl4629.xyz/posts/oss-supply-chain-dw</link>
          <guid>https://zl4629.xyz/posts/oss-supply-chain-dw</guid>
          <pubDate>Sun, 23 Aug 2026 16:00:00 GMT</pubDate>
          <description>用 OSV、deps.dev 和 npm 下载量搭一条离线供应链主题域：分层建模、版本化指标、质量门禁，并导出静态大屏到 oss.zl4629.xyz。重点是口径和证据，不是再堆一个爬虫。</description>
          <category>数据仓库</category><category>DuckDB</category><category>Python</category><category>OSV</category><category>数据质量</category>
        </item>
        <item>
          <title>Doris Stream Load 的假成功：label、三态判定与&quot;先确认再破坏&quot;</title>
          <link>https://zl4629.xyz/posts/hwlens-doris-load-idempotency</link>
          <guid>https://zl4629.xyz/posts/hwlens-doris-load-idempotency</guid>
          <pubDate>Wed, 19 Aug 2026 16:00:00 GMT</pubDate>
          <description>一批脚本执行完毕、退出码全零，数据却一行都没进。原因全在装载语义里：label 幂等把重跑变成 SKIP、UNIQUE KEY 只覆盖本次出现的键、全量替换的顺序写反、staging 平铺目录跨日期污染。记录这四处以及我最后定下的装载规范。</description>
          <category>Doris</category><category>ETL</category><category>数据质量</category><category>数据仓库</category>
        </item>
        <item>
          <title>Spark 执行模型笔记（二）：宽窄依赖、Shuffle 与 Stage</title>
          <link>https://zl4629.xyz/posts/spark-shuffle-stage</link>
          <guid>https://zl4629.xyz/posts/spark-shuffle-stage</guid>
          <pubDate>Sat, 15 Aug 2026 16:00:00 GMT</pubDate>
          <description>继续 Spark 执行模型：窄依赖&quot;原地算&quot;，宽依赖&quot;要搬家&quot;（Shuffle），Stage 以 Shuffle 为界翻篇。用一张因果链把 Partition、依赖类型、Shuffle、Stage、Job、repartition/coalesce 串起来，附综合例题。</description>
          <category>Spark</category><category>执行模型</category><category>Spark 源码</category>
        </item>
        <item>
          <title>把供应链大屏静态部署到子域名：Caddy 与博客共存</title>
          <link>https://zl4629.xyz/posts/oss-static-screen-deploy</link>
          <guid>https://zl4629.xyz/posts/oss-static-screen-deploy</guid>
          <pubDate>Thu, 13 Aug 2026 16:00:00 GMT</pubDate>
          <description>在已有 zl4629.xyz 博客的服务器上，用纯静态方式上线 oss.zl4629.xyz 数据大屏：导出 JSON、Caddy file_server、自动 HTTPS，不和 blog 抢资源。</description>
          <category>Caddy</category><category>部署与缓存</category><category>ECharts</category>
        </item>
        <item>
          <title>Spark 执行模型源码笔记：从懒执行到 QueryExecution</title>
          <link>https://zl4629.xyz/posts/spark-execution-model</link>
          <guid>https://zl4629.xyz/posts/spark-execution-model</guid>
          <pubDate>Sat, 08 Aug 2026 16:00:00 GMT</pubDate>
          <description>学习 Spark 源码的第一站：DataFrame 为什么是懒执行的？逻辑计划经过哪几层才变成真正的计算？带着 Day 1 的疑问去读 QueryExecution.scala 和 LazyTry.scala，把&quot;懒执行&quot;从概念落到代码。</description>
          <category>Spark</category><category>执行模型</category><category>Spark 源码</category>
        </item>
        <item>
          <title>供应链指标为什么容易吵：范围级高危、代表版本和种子闭包</title>
          <link>https://zl4629.xyz/posts/oss-metric-semantics</link>
          <guid>https://zl4629.xyz/posts/oss-metric-semantics</guid>
          <pubDate>Wed, 05 Aug 2026 16:00:00 GMT</pubDate>
          <description>做供应链看板时，最容易翻车的不是图表，而是口径。记录 M01/M03/M07/M08 的定义、误读方式和我最终怎么写进指标字典。</description>
          <category>指标口径</category><category>数据质量</category><category>数据仓库</category><category>OSV</category><category>维度建模</category>
        </item>
        <item>
          <title>改一个键定义，为什么要重放全部历史</title>
          <link>https://zl4629.xyz/posts/hwlens-canonical-id-regeneration</link>
          <guid>https://zl4629.xyz/posts/hwlens-canonical-id-regeneration</guid>
          <pubDate>Tue, 04 Aug 2026 16:00:00 GMT</pubDate>
          <description>商品身份 ID 是组键的确定性哈希，所以收紧对齐键会让所有 ID 换代：历史分区和新分区连不上，含 ID 的跨日特征必须全量重放。记录重放前的断点水位清理、字段宽度契约、旧分区 schema 冲突，以及&quot;补完历史要再重载最新一天&quot;这条铁律。</description>
          <category>数据仓库</category><category>数据质量</category><category>Doris</category><category>Spark</category>
        </item>
        <item>
          <title>Kafka 可靠性语义笔记：从分区到 Exactly-Once</title>
          <link>https://zl4629.xyz/posts/kafka-exactly-once</link>
          <guid>https://zl4629.xyz/posts/kafka-exactly-once</guid>
          <pubDate>Sun, 02 Aug 2026 16:00:00 GMT</pubDate>
          <description>整理 BigData-Notes 中 Kafka 分区、副本、生产者确认、消费者 offset 和 Exactly-Once 语义，重点理解“Kafka 保证了什么，以及没有保证什么”。</description>
          <category>Kafka</category><category>架构设计</category><category>Kafka 投递语义</category>
        </item>
        <item>
          <title>口径只能有一个来源：spec_ontology、when 链和那条匹配空串的正则</title>
          <link>https://zl4629.xyz/posts/hwlens-single-source-of-truth</link>
          <guid>https://zl4629.xyz/posts/hwlens-single-source-of-truth</guid>
          <pubDate>Wed, 29 Jul 2026 16:00:00 GMT</pubDate>
          <description>同一个&quot;容量&quot;在采集侧、计算侧、后台各解析一遍，迟早出问题。记录把单位折算、键别名、正则常量收进一个纯 Python 模块的过程，以及两条代价很高的教训：可选单位的正则把 TB 当 GB 落库，十几层 when 链让 executor 被 OOM 杀掉。</description>
          <category>指标口径</category><category>Spark</category><category>数据质量</category><category>Python</category>
        </item>
        <item>
          <title>数仓里常用的 SQL：代表版本、窗口聚合与入仓对账</title>
          <link>https://zl4629.xyz/posts/oss-sql-metrics-dq</link>
          <guid>https://zl4629.xyz/posts/oss-sql-metrics-dq</guid>
          <pubDate>Tue, 28 Jul 2026 16:00:00 GMT</pubDate>
          <description>用供应链项目里的真实表，整理代表版本选取、直接依赖聚合、7 日下载滑动、高危榜和条数对账等 SQL。</description>
          <category>SQL</category><category>数据质量</category><category>指标口径</category><category>DuckDB</category><category>ETL</category>
        </item>
        <item>
          <title>供应链主题域怎么分层：事实粒度、维度表和代理键</title>
          <link>https://zl4629.xyz/posts/oss-dimensional-modeling</link>
          <guid>https://zl4629.xyz/posts/oss-dimensional-modeling</guid>
          <pubDate>Tue, 21 Jul 2026 16:00:00 GMT</pubDate>
          <description>围绕开源供应链项目，记录 ODS/DWD/DIM/DWS/ADS 怎么切、依赖边和漏洞 affects 的事实粒度怎么定、包/版本维度如何挂代理键。</description>
          <category>维度建模</category><category>数据仓库</category><category>DuckDB</category>
        </item>
        <item>
          <title>跨源实体对齐：宁可少合并，不可假合并</title>
          <link>https://zl4629.xyz/posts/hwlens-entity-alignment</link>
          <guid>https://zl4629.xyz/posts/hwlens-entity-alignment</guid>
          <pubDate>Tue, 14 Jul 2026 16:00:00 GMT</pubDate>
          <description>把两个站点的同一条商品认成一个，是所有跨源比价的前提。记录从标题归一化到分层确定性键的整段演进：规格键造出的假合并、concat_ws 对 null 跳段、字符多重集键，以及那条支配所有取舍的不对称原则。</description>
          <category>数据质量</category><category>数据仓库</category><category>Spark</category><category>指标口径</category>
        </item>
        <item>
          <title>cron 不是你的登录 shell：PATH、中文路径和 set -u 的静默丢数</title>
          <link>https://zl4629.xyz/posts/hwlens-cron-not-login-shell</link>
          <guid>https://zl4629.xyz/posts/hwlens-cron-not-login-shell</guid>
          <pubDate>Tue, 23 Jun 2026 16:00:00 GMT</pubDate>
          <description>手工跑一切正常、放进 crontab 就失败的三类原因：非登录 shell 的 PATH、POSIX locale 下 Java 解析不了非 ASCII 工作目录、以及只 set -u 不 set -e 带来的&quot;报了成功但没入湖&quot;。附我的验证方法：用 env -i 模拟 cron。</description>
          <category>Linux</category><category>运维</category><category>数据质量</category>
        </item>
        <item>
          <title>第一条离线链路：从 ODS 到 ADS，以及那些写死在提交命令里的参数</title>
          <link>https://zl4629.xyz/posts/hwlens-offline-pipeline</link>
          <guid>https://zl4629.xyz/posts/hwlens-offline-pipeline</guid>
          <pubDate>Thu, 04 Jun 2026 16:00:00 GMT</pubDate>
          <description>把采集数据一路推到可查询的 ADS 表，中间踩的不是 SQL 而是工程细节：executor 的代码从哪来、内存为什么必须显式限、JDK 有缺陷怎么绕、校验为什么要在编排层之外再做一遍。</description>
          <category>Spark</category><category>HDFS</category><category>Doris</category><category>数据仓库</category><category>ETL</category>
        </item>
        <item>
          <title>集群重启之后：那些不会自启的服务和它们各自的怪脾气</title>
          <link>https://zl4629.xyz/posts/hwlens-cluster-restart</link>
          <guid>https://zl4629.xyz/posts/hwlens-cluster-restart</guid>
          <pubDate>Sat, 16 May 2026 16:00:00 GMT</pubDate>
          <description>一次计划外重启让离线链路连着挂了两天：NameNode 没起、BE 没起、Spark Worker 不自启。逐个踩过 swap 检测、代理变量、文件句柄上限、隧道端口残留之后，我才理解&quot;能跑&quot;和&quot;重启后能跑&quot;是两个工程问题。</description>
          <category>HDFS</category><category>Spark</category><category>Doris</category><category>运维</category><category>Linux</category>
        </item>
        <item>
          <title>采集量骤降的归因：先怀疑自己，再怀疑源站</title>
          <link>https://zl4629.xyz/posts/hwlens-crawl-volume-triage</link>
          <guid>https://zl4629.xyz/posts/hwlens-crawl-volume-triage</guid>
          <pubDate>Tue, 28 Apr 2026 16:00:00 GMT</pubDate>
          <description>某天某类目的条数明显变少，第一反应通常是&quot;被反爬了&quot;。记录一套排除顺序：脚本改动、入湖丢数、分页截断、解析效率逐项排掉，最后用归档 HTML 重放证明是源站供给变化；以及一次把代码问题误判成风控的教训。</description>
          <category>数据采集</category><category>故障排查</category><category>数据质量</category>
        </item>
        <item>
          <title>两个源的脾气：编码、兜底页、分页回绕和 503 死循环</title>
          <link>https://zl4629.xyz/posts/hwlens-crawler-source-quirks</link>
          <guid>https://zl4629.xyz/posts/hwlens-crawler-source-quirks</guid>
          <pubDate>Fri, 10 Apr 2026 16:00:00 GMT</pubDate>
          <description>ZOL 和 PConline 一个把规格写成营销长句、一个给结构化键值对；一个超页数返回 200 兜底页、一个直接回绕到首页推荐。记录终止判据、编码、选择器兼容和那次把整晚跑成空转的 503 退避死循环。</description>
          <category>数据采集</category><category>Scrapy</category><category>数据质量</category><category>故障排查</category>
        </item>
        <item>
          <title>爬虫也要有数据契约：price_status、schema_version 与原始页面留档</title>
          <link>https://zl4629.xyz/posts/hwlens-crawler-data-contract</link>
          <guid>https://zl4629.xyz/posts/hwlens-crawler-data-contract</guid>
          <pubDate>Mon, 23 Mar 2026 16:00:00 GMT</pubDate>
          <description>采集层最划算的设计不是选择器写得多稳，而是把&quot;这一行现在处于什么状态&quot;显式写进字段里。记录 price_status / schema_version / parser_version / 行级页面级指纹的设计，以及为什么原始 HTML 必须留档。</description>
          <category>数据采集</category><category>数据质量</category><category>Scrapy</category><category>数据契约</category><category>ETL</category>
        </item>
        <item>
          <title>选题先问数据能不能长出来：硬件行情平台是怎么定下来的</title>
          <link>https://zl4629.xyz/posts/hwlens-topic-and-data-availability</link>
          <guid>https://zl4629.xyz/posts/hwlens-topic-and-data-availability</guid>
          <pubDate>Thu, 05 Mar 2026 16:00:00 GMT</pubDate>
          <description>毕设立题时有四个候选方向：全栈平台、算法深度、数据中台治理、智能体应用。这篇记录我怎么做取舍——把卖点建立在&quot;现有数据当天就能出结果&quot;的能力上，以及为什么&quot;预测&quot;这个词必须从题目里拿掉。</description>
          <category>论文工程</category><category>架构设计</category><category>数据仓库</category><category>数据治理</category>
        </item>
        <item>
          <title>Olist 电商湖仓一体项目复盘</title>
          <link>https://zl4629.xyz/posts/olist-lakehouse</link>
          <guid>https://zl4629.xyz/posts/olist-lakehouse</guid>
          <pubDate>Tue, 03 Mar 2026 16:00:00 GMT</pubDate>
          <description>基于 Olist 数据集搭建 HDFS、Hive Metastore、Spark、Kafka、Doris 的湖仓链路。离线分层、质量门禁和图分析已有验证；Kafka broker 依赖的端到端重放仍明确保留为待补验项。</description>
          <category>HDFS</category><category>Hive</category><category>Spark</category><category>Kafka</category><category>Doris</category><category>Deequ</category><category>GraphX</category><category>数据质量</category>
        </item>
        <item>
          <title>没在集群跑出来的实验，结论该怎么写</title>
          <link>https://zl4629.xyz/posts/olist-unverified-experiment-reporting</link>
          <guid>https://zl4629.xyz/posts/olist-unverified-experiment-reporting</guid>
          <pubDate>Mon, 23 Feb 2026 16:00:00 GMT</pubDate>
          <description>批流一致性的正向证据只来自一次真跑通的回放，后面两轮环境里没有 Kafka、作业没重跑，但服务库里仍然摆着那份对账结果——它是搬运来的。这篇记我给&quot;没验证的结论&quot;记账的方式：哪些是设计、哪些跑过、哪些是历史结果、哪些从没实现。</description>
          <category>论文工程</category><category>湖仓一体</category><category>数据质量</category>
        </item>
        <item>
          <title>门禁里那些假装在检查的规则</title>
          <link>https://zl4629.xyz/posts/olist-quality-gate-false-pass</link>
          <guid>https://zl4629.xyz/posts/olist-quality-gate-false-pass</guid>
          <pubDate>Mon, 02 Feb 2026 16:00:00 GMT</pubDate>
          <description>给湖仓链路加完数据质量门禁，我复核了一遍规则集，找到四类&quot;看起来在跑、实际不判&quot;的规则：没基线就恒过的漂移检查、被喂了常量的膨胀检查、按定义每次必报警所以被移出管道的规则，以及默认不改变退出码的 BLOCK。</description>
          <category>数据质量</category><category>Deequ</category><category>Spark</category>
        </item>
        <item>
          <title>所有卖家的 PageRank 是同一个数</title>
          <link>https://zl4629.xyz/posts/olist-pagerank-collapse</link>
          <guid>https://zl4629.xyz/posts/olist-pagerank-collapse</guid>
          <pubDate>Wed, 14 Jan 2026 16:00:00 GMT</pubDate>
          <description>对卖家-商品二部图跑 PageRank，收敛后所有卖家的分数完全相同；连通分量算法在这张图上跑挂，我退回了&quot;按主品类聚类&quot;。换成四部异构图之后分数依然没有区分度。问题不在算法实现，在图的结构对称。</description>
          <category>GraphX</category><category>Spark</category><category>指标口径</category>
        </item>
        <item>
          <title>一个环境变量让 Doris BE 假死，报错全在下游</title>
          <link>https://zl4629.xyz/posts/olist-doris-be-env-cascade</link>
          <guid>https://zl4629.xyz/posts/olist-doris-be-env-cascade</guid>
          <pubDate>Thu, 25 Dec 2025 16:00:00 GMT</pubDate>
          <description>BE 启动脚本对代理环境变量做&quot;存在即拒绝&quot;的自检，于是进程起不来；FE 心跳连不上就显示 Alive: false；紧接着改副本数会报&quot;replication num should be less than the number of available backends&quot;。三个报错分属三层，起点是一个 `http_proxy`。</description>
          <category>Doris</category><category>故障排查</category><category>运维</category><category>OLAP</category>
        </item>
        <item>
          <title>装环境最难查的那类故障：全程没有报错</title>
          <link>https://zl4629.xyz/posts/olist-python-build-silent-deps</link>
          <guid>https://zl4629.xyz/posts/olist-python-build-silent-deps</guid>
          <pubDate>Wed, 10 Dec 2025 16:00:00 GMT</pubDate>
          <description>在集群机器上从源码编译 Python，`make` 和 `make install` 都成功，然后 pip 连不上 HTTPS、装不了包、PySpark 报缺 `_ctypes`。原因是 configure 检测不到依赖库时只是&quot;跳过那个模块&quot;，而不是失败。Jackson 版本冲突是同一类沉默。</description>
          <category>Python</category><category>故障排查</category><category>Spark</category>
        </item>
        <item>
          <title>淘宝用户行为离线数仓复盘</title>
          <link>https://zl4629.xyz/posts/taobao-data-warehouse</link>
          <guid>https://zl4629.xyz/posts/taobao-data-warehouse</guid>
          <pubDate>Thu, 04 Dec 2025 16:00:00 GMT</pubDate>
          <description>基于淘宝 UserBehavior 行为明细搭建 Landing、ODS、DWD、DWS、ADS、MySQL、Flask/ECharts、Airflow 和质量治理链路，重点是让离线批处理可调度、可校验、可追溯。</description>
          <category>Hive</category><category>Spark</category><category>ECharts</category><category>数据仓库</category><category>数据治理</category><category>淘宝行为数仓</category>
        </item>
        <item>
          <title>Spark 写出的 CSV，Doris 并不认</title>
          <link>https://zl4629.xyz/posts/olist-csv-column-contract</link>
          <guid>https://zl4629.xyz/posts/olist-csv-column-contract</guid>
          <pubDate>Wed, 03 Dec 2025 16:00:00 GMT</pubDate>
          <description>把湖仓结果导出成 CSV 再 Stream Load 进 Doris 这一段，故障都不在计算里：多分区输出会写多次表头，分隔符模式不认 CSV 的引号转义，case class 带出的列名是 camelCase 而表结构是 snake_case，`max_filter_ratio` 默认是 0 所以一行坏数据整批不加载。</description>
          <category>Doris</category><category>Spark</category><category>ETL</category><category>数据契约</category>
        </item>
        <item>
          <title>Hive、Spark 与 Doris 在数仓链路里的分工</title>
          <link>https://zl4629.xyz/posts/doris-realtime-schema</link>
          <guid>https://zl4629.xyz/posts/doris-realtime-schema</guid>
          <pubDate>Thu, 13 Nov 2025 16:00:00 GMT</pubDate>
          <description>基于 BigData-Notes 的学习整理和本地项目文档，梳理 Hive Metastore、Spark SQL、Parquet、Doris 服务层的定位，以及为什么不要把所有表都同步到 Doris。</description>
          <category>Doris</category><category>Hive</category><category>Spark</category><category>OLAP</category><category>架构设计</category><category>淘宝行为数仓</category>
        </item>
      </channel>
    </rss>