<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Doris on FXIO 技术博客</title><link>https://fxio.site/tags/doris/</link><description>Recent content in Doris on FXIO 技术博客</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Tue, 04 Aug 2026 19:30:15 +0800</lastBuildDate><atom:link href="https://fxio.site/tags/doris/index.xml" rel="self" type="application/rss+xml"/><item><title>Presto 与 Doris 企业应用场景研究：一个「借灶炒菜」，一个「自建中央厨房」</title><link>https://fxio.site/posts/ai/2026-08-04-presto-vs-doris-enterprise/</link><pubDate>Tue, 04 Aug 2026 19:30:15 +0800</pubDate><guid>https://fxio.site/posts/ai/2026-08-04-presto-vs-doris-enterprise/</guid><description>&lt;h1 id="presto-与-doris-企业应用场景研究一个借灶炒菜一个自建中央厨房"&gt;Presto 与 Doris 企业应用场景研究：一个「借灶炒菜」，一个「自建中央厨房」&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;同为 OLAP 赛道的明星项目，Presto 和 Doris 却代表了两种截然不同的企业数据架构路线。本文从真实企业场景出发，拆解两者的架构基因、适用边界与组合打法，给选型一个不模棱两可的答案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="一先说结论它们根本不是同一类物种"&gt;一、先说结论：它们根本不是同一类物种&lt;/h2&gt;
&lt;p&gt;很多企业选型时的第一个错误，是把 Presto 和 Doris 放进同一张跑分表里比快慢。这就像拿「外卖平台」和「自建中央厨房」比出餐速度——&lt;strong&gt;它们解决的不是同一个问题&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一句话定性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Presto（含 Trino）是「查询引擎」&lt;/strong&gt;：自己不存数据，靠 Connector 对接 Hive/S3/MySQL 等存储，强项是跨源联邦与即席分析。借灶炒菜，灶台是别人的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Doris 是「实时数仓」&lt;/strong&gt;：自带存储引擎（列存 + 索引），数据要导进来，换来的是高并发、低延迟、可更新的全套数仓能力。自建中央厨房，从采购到出餐全包。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个「存不存数据」的分野，决定了后面所有场景的适配差异。&lt;/p&gt;
&lt;h2 id="二架构基因对照"&gt;二、架构基因对照&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;Presto/Trino&lt;/th&gt;
&lt;th&gt;Apache Doris&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;定位&lt;/td&gt;
&lt;td&gt;联邦查询引擎（计算层）&lt;/td&gt;
&lt;td&gt;MPP 实时分析型数据库（存算一体，3.0 起支持存算分离模式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据形态&lt;/td&gt;
&lt;td&gt;不存数据，Connector 现拉&lt;/td&gt;
&lt;td&gt;数据导入自有存储（列存 + 排序键 + 倒排索引）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;执行模型&lt;/td&gt;
&lt;td&gt;内存流水线，失败整体重跑&lt;/td&gt;
&lt;td&gt;MPP + Pipeline 向量化执行，支持落盘容错&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写入能力&lt;/td&gt;
&lt;td&gt;基本只读（INSERT 有限）&lt;/td&gt;
&lt;td&gt;支持实时更新（Unique Key）、流批一体导入（Kafka/Flink/Routine Load）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;并发能力&lt;/td&gt;
&lt;td&gt;中低并发大查询&lt;/td&gt;
&lt;td&gt;高并发短查询友好（数千 QPS 点查场景可扛）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生态协议&lt;/td&gt;
&lt;td&gt;ANSI SQL + JDBC/BI 全兼容&lt;/td&gt;
&lt;td&gt;MySQL 协议兼容，BI 工具直连&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运维形态&lt;/td&gt;
&lt;td&gt;无状态计算集群 + 外部存储&lt;/td&gt;
&lt;td&gt;有状态集群，3.0 存算分离模式后亦云原生化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意 Doris 3.0 这个变量：&lt;strong&gt;它也支持了存算分离&lt;/strong&gt;（数据放对象存储、计算节点弹性伸缩、缓存加速），还强化了湖仓一体能力（直接查 Hudi/Iceberg/Paimon）。也就是说，Doris 正在往 Presto 的领地伸手——但底色依然是「有存储、有索引、可更新」的数仓。&lt;/p&gt;</description></item><item><title>Doris 导致 Zuul OOM 排查</title><link>https://fxio.site/posts/java/doris-zuul-oom/</link><pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate><guid>https://fxio.site/posts/java/doris-zuul-oom/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;在开发者的潜意识里，&lt;code&gt;LIMIT&lt;/code&gt; 关键字就是 SQL 查询的安全带。
我们通常认为，只要加了 &lt;code&gt;LIMIT&lt;/code&gt;，无论表多大，数据库都只会吐出少量数据，内存就是安全的。&lt;/p&gt;
&lt;p&gt;然而，最近的一次线上 OOM（内存溢出）事故狠狠地打破了这个认知。
一个看似人畜无害的 &lt;code&gt;UNION ALL&lt;/code&gt; + &lt;code&gt;LIMIT&lt;/code&gt; 组合，竟然避开了doris 的优化器的下推机制，引发了生产环境的连锁崩溃。&lt;/p&gt;
&lt;p&gt;本文记录了这次在受限环境下，如何抽丝剥茧定位 Bug 的过程。&lt;/p&gt;
&lt;h2 id="一高峰期的幽灵崩溃"&gt;一、高峰期的“幽灵”崩溃&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;环境背景：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;部署方式&lt;/strong&gt; Kubernetes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网关：&lt;/strong&gt; Springboot + zuul&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务：&lt;/strong&gt; Spring Boot + MyBatis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;db：&lt;/strong&gt; Apache Doris&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;报错服务：&lt;/strong&gt; 网关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;java版本：&lt;/strong&gt; jdk8, g1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限：&lt;/strong&gt; 无root权限,只能查看基本日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;网关pod报错关键日志&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;netflix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zuul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZuulException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;threw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;postModifyResponseBodyFilter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Caused&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OutOfMemoryError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Java&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;heap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;报错日志关键字: oom&lt;/p&gt;
&lt;h2 id="二-真相误判gc-的烟雾弹"&gt;二、 真相误判：GC 的烟雾弹&lt;/h2&gt;
&lt;p&gt;面对 OOM，作为 Java 开发者的第一直觉往往是：“是不是流量太大，垃圾回收（GC）跟不上了？”
查看存活期间的 JVM 监控，发现 Old Gen（老年代）增长迅速。当时的判断是：CMS 回收器产生内存碎片，导致大对象分配失败。&lt;/p&gt;</description></item></channel></rss>