ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache Doris入门指南:架构原理、部署实操与分桶设计

Apache Doris入门指南:架构原理、部署实操与分桶设计 这几年的数据基础设施建设里Apache Doris 已经从一个不太起眼的国产分析型数据库逐步变成了不少公司实时数仓的默认选择。无论是做用户行为分析、实时大屏还是替代传统报表引擎Doris 的名字总会出现在方案选型的讨论里。我最早接触 Doris 还是在它叫 Palo 的时代当时只是抱着试试看的心态搭了个单机实例跑了几张表没想到后来陆续在好几个项目里把它用成了生产环境主力。这个系列就是想从最基础的概念说起一步步把 Doris 的原理、部署、建模、查询优化和周边生态讲清楚做到不吹不黑、能落地的程度。第一篇咱们先把“Doris 是什么、能做什么、适合谁用”这些问题聊透同时也把部署、分桶、Presto 集成这些被问得最多的话题做一个整体预告和基础拆解给后面的实操篇打个底。1. 项目定位为什么是 Doris它到底解决了什么1.1 从一个真实需求说起先从一个我经手的项目场景讲起。当时业务方提出一个需求数据更新的延迟要控制在分钟级前端报表要能直接查到明细和聚合结果并且高峰期要有几千个查询并发不卡死。老一套的做法是“Lambda 架构”用 Kafka 接实时流Flink 算完写进 Redis 或 HBase 供实时查询离线部分再用 Hive 跑定时任务最后合并结果。这套方案能跑但维护成本实在高得离谱一套逻辑要在两套链路里各写一遍对账对到心态崩溃。换 Doris 之后情况变得简单多了。Kafka 里的数据直接通过 Routine Load 导入 Doris 的明细表Doris 内部通过聚合模型或者物化视图把实时和离线的查询统一到一份数据上。不再需要维护两条链路查询响应时间也基本控制在一秒以内。这个变化的核心并不是某一条 SQL 调优调得多好而是 Doris 的架构设计在“实时写入”和“高效查询”之间找到了一个平衡点。这也是我想把这个系列写下来的原因。Doris 不是那种文档很完善、社区引导很强的老牌项目很多经验散落在各种 issue 和博客里。对于一个刚开始接触的人最痛苦的是连“如何正确理解它的数据模型”都没有头绪。所以这个系列第一篇文章先把 Doris 的定位和基本结构讲清楚再引入后面章节会展开的关键技术点让读者在正式动手之前先建立一张认知地图。1.2 核心架构FE 与 BE 的分工Doris 的整体架构可以用两个角色来概括FEFrontend和 BEBackend。FE 负责的是“脑子”的活包括查询解析、规划、调度、元数据管理以及用户权限控制。当客户端连接 Doris 时先访问的通常是 FE 的 MySQL 协议端口 9030。FE 把 SQL 解析成执行计划再把任务分发给后端的 BE 去执行。BE 则负责“身体”的活它存储数据执行查询算子也负责副本复制和本地数据的 compaction 等工作。数据表的数据被水平切割成一个个 Tablet 存储在 BE 上每个 Tablet 默认有多个副本副本分布在不同的 BE 节点上这样单台机器挂了也不会直接丢数据。这种设计和 Hadoop 时代的“NameNode DataNode”思路有点类似但区别在于 FE 和 BE 之间的通信更加紧密BE 内部也直接实现了向量化执行引擎而不是走 MapReduce 那套重流程。它更像一个分布式关系型数据库——在保证分布式扩展能力的同时还能提供标准 MySQL 协议接入和 SQL 语义。这一点在工程上非常讨喜因为业务开发不需要学习新的查询语言直接用 MySQL 客户端或者 JDBC 就能操作。1.3 与 ClickHouse、Presto 的区别很多人在选型时会问Doris 跟 ClickHouse 到底怎么选跟 Presto 又是什么关系这里我需要结合使用体验做一个直观对比而不是罗列一大堆架构术语。ClickHouse 的强项在于单表查询性能和列式存储压缩比它在做宽表聚合分析时速度非常快。但在多表 Join 场景下ClickHouse 的表现就比较挑姿势对不同表之间 join 的支持方式和执行效率都需要额外花心思去调。而 Doris 的设计更偏向标准数仓的使用习惯支持包括多表 Join、子查询、窗口函数在内的复杂 SQL执行引擎对这些场景做了比较多针对性的优化。换句话说ClickHouse 像是一台马力很大的跑车在直线赛道上表现优秀Doris 更像是一辆兼顾舒适性和复杂路况的城市 SUV虽然直线加速不一定能赢但在大多数实际业务道路上更稳。Presto 则完全是另一种东西。它是一个分布式 SQL 查询引擎本身不存数据靠连接各种数据源来做查询。Doris 的角色是存储引擎加查询引擎既可以作为 Presto 的数据源被查询也可以自己接受客户端直连查询。在实际生产中很多团队会用 Presto 做统一 SQL 入口然后通过 Connector 去查询 Doris 的数据。这也是“presto doris 错误的 missing”这类问题出现得多的原因之一——两个系统的 SQL 方言和元数据映射细节上总有那么一些微妙的不兼容。后面我会专门用一章把这些问题拆开讲清楚。所以我的选型建议是如果你需要一个能直接承载业务报表和实时数据服务的平台优先考虑 Doris如果你的场景是“已经有 Hadoop/Hive想要一个统一查询层”Presto 加上 Doris 作为其中的存储引擎之一也是一种很合理的组合。两者不是简单的替代关系而是可以协同工作的搭档。2. 精髓提炼Doris 的关键设计理念2.1 为什么 OLAP 场景更适合列式存储Doris 的数据存储整体采用列式存储这一点是与传统关系型数据库最大的不同。传统 MySQL 这类 OLTP 数据库数据按照“行”的方式顺序存放每一条记录的所有字段都连着写在一起。这种设计对点查询、按主键更新很友好但在做“统计某个时间段的销售额总和”这类分析时每次都要把整行所有字段读出来再丢弃不需要的列磁盘 I/O 浪费非常大。列式存储的思路反过来把一张表按列分开存放同一列的数据连续存储在一块。当执行SELECT SUM(amount) FROM orders WHERE create_time 2024-01-01这样的查询时Doris 只需要读取amount和create_time这两列的数据块其他列完全不用触碰。分析型查询往往只在几列上做聚合因此这种设计能带来数十倍的 I/O 削减。再加上列式存储天然对压缩友好相同类型的数据放在一起压缩率通常能到 5:1 甚至更高对省磁盘空间也有很大帮助。2.2 MPP 架构让所有节点一起算光有列式存储还不够Doris 的查询处理采用了 MPPMassively Parallel Processing架构。MPP 的核心思想是一个大查询来了不要只让一台机器去算而是把它拆成很多小任务分发到所有 BE 节点上同时计算最后再把结果汇总起来。想象一个处理 10 亿行数据的聚合任务。如果单机执行可能要扫描几个小时MPP 架构把数据分散在 10 个 BE 节点上每个节点只扫描自己负责的那 1 亿行期间各节点并行跑最后汇总的只是一个很小的中间结果。理论上节点的数量和查询的吞吐量可以近似线性扩展这也是 Doris 敢说自己适合大规模数据场景的底气。在实际优化中Doris 还会做很多执行计划层面的优化比如尽量下推过滤条件、选择合理的 Join 顺序、对数据做局部聚合之后再传输等。这些优化的最终目的都是减少数据在节点间流动的量也就是俗称的“Shuffle”。一个执行计划设计得好不好最直接的观察点就是数据 Shuffle 多不多。2.3 导入机制实时与批量一把抓Doris 在数据导入层面提供了非常丰富的通道。首先是 Stream Load通过 HTTP 协议从本地文件或者内存数据中直接导入适合程序里实时推送数据。其次是 Routine Load可以持续订阅 Kafka 消息并自动导入是实时链路中最常用的方式。还有 Broker Load通过 Broker 进程读取 HDFS、对象存储上的大批量文件适合离线导入场景。外加一个 MySQL 协议下的 Insert Into适合小数据和临时数据的写入。这里的关键设计是 Doris 对这些导入任务提供了至少一次的保证和一定程度的原子性。导入过程中如果有部分数据出错你可以指定错误容忍率超标的导入会被回滚或标记失败这就避免了很多数据不一致的隐患。我之前在一个项目里踩过“重复导入导致数据翻倍”的坑后来通过合理设置导入的 Unique Key 模型和定期去重才把这个风险控制住。这块内容后面的篇幅里会展开讲。3. 动手之前官网资源与版本选择3.1 从哪里获取最新信息和下载包Doris 的官方网站是doris.apache.org这是最权威的信息来源。网站上提供了下载页面、官方文档、博客以及社区相关的链接。这些年 Doris 的文档质量提升非常明显从早期很多内容要靠猜到现在基本的安装部署、数据导入、查询优化都有完整说明新手照着文档操作大部分环境问题都能解决。不过我还是建议不要只依赖在线文档。Doris 的发行版本更新节奏比较快有些功能可能只在特定版本可用文档里标注的版本号需要特别留意。你在官网下载页会看到类似2.0.x、2.1.x这样的版本号选择版本时尽量不要追新而是选择当前社区主推的稳定版本。生产环境尤其要克制追新版的冲动等新版本发布两三个月之后再看社区的反馈情况才决定要不要升级。3.2 环境准备JDK、操作系统与内存Doris 的部署对环境的要求不算太苛刻但有一些硬性条件需要注意。首先FE 进程依赖 Java 环境建议使用 JDK 8 或 JDK 11版本太老会有一些安全漏洞版本太新又可能遇到不兼容的问题。BE 进程是 C 实现的不依赖 Java但整个集群里 FE 和 BE 都需要跑在 Linux 系统上Windows 并不方便做生产部署。内存方面Doris 对内存的需求可以用“贪得无厌”来形容。BE 会利用尽可能多的内存做数据缓存和查询执行默认配置下它会占用机器很大比例的内存。如果机器内存不大比如只有 8GB你又想同时跑 FE 和 BE那么必须手动调整 JVM 堆大小和 BE 的内存限制否则系统很容易 OOM。我在单机测试环境里就遇到过 BE 进程把内存吃满导致 FE 也无法响应的情况后来在be.conf里设置了mem_limit才稳定下来。3.3 一套推荐的学习路径如果你是第一次接触 Doris我的建议是先不要碰复杂的集群方案不要一上来就搞 3 FE 加 5 BE 的标准集群。先在单机上把 FE 和 BE 跑起来用 MySQL 客户端建库建表导入一份几百 MB 的测试数据执行几条聚合查询感受一下整个流程。单机能跑通之后再去理解集群模式下 FE 的 Follower/Observer 角色以及 BE 扩容缩容的原理。这个系列也会按相同的节奏来写第一篇文章先讲概念和架构后面几篇依次覆盖单机部署、集群部署、数据模型、导入实战、查询调优和运维监控。学 Doris 最忌讳的就是一开始陷入各种细微的配置参数结果连最基本的数据通路都没建立起来。先把一条“数据从文件到查询结果”的链路走通再逐步深入效率会高得多。4. 部署实操单机快速跑起来4.1 下载解压与基础配置这里以 Linux 单机环境为例演示一遍最小化的部署流程。下载对应版本的二进制包并解压后你会看到fe和be两个目录。先进入fe目录编辑conf/fe.conf。首次部署时最关键的两个配置是meta_dir和priority_networks。meta_dir指定 FE 元数据存储的目录需要确保它有足够的磁盘空间和 IO 能力。priority_networks则用来指定 FE 监听哪个网段的 IP当机器有多块网卡时尤其重要不配置的话 FE 可能选错 IP后面 BE 和其他客户端根本连不上。启动 FE 的方式很简单在fe目录下执行./bin/start_fe.sh。启动后可以通过http://localhost:8030访问 FE 的 Web 管理页面默认用户名密码是root和空密码。同时 FE 会在 9030 端口监听 MySQL 协议连接也就是说你可以直接用mysql -h127.0.0.1 -P9030 -uroot来登录 Doris这种“用 MySQL 客户端连分布式数据库”的感觉对很多 DBA 来说非常亲切。4.2 BE 节点的添加BE 的启动同样直接。在be目录下编辑conf/be.conf关键配置是storage_root_path也就是数据存放目录。可以配置多个目录并用分号分隔例如storage_root_path/data1/doris/be; /data2/doris/be。配置完成后执行./bin/start_be.sh。但注意BE 启动之后并不会自动加入集群你需要通过 MySQL 协议连接到 FE执行一条 SQL 命令把 BE 节点注册进来ALTER SYSTEM ADD BACKEND 127.0.0.1:9050;这里的9050是 BE 的 heartbeat 服务端口。执行完后再用SHOW BACKENDS查看 BE 状态。如果状态显示alive说明 BE 已经成功加进集群数据表就能在上面创建了。坦白说我第一次部署时就是漏了这条 ADD BACKEND 命令然后花了一个小时排查为什么建表报错教训就是Doris 的 FE 和 BE 是独立的进程不会自动发现对方必须显式地把 BE 注册给 FE。4.3 端口说明与防火墙部署 Doris 时还会遇到大量端口相关的问题。FE 主要涉及 8030Web 管理界面、9030MySQL 协议查询端口、9010FE 内部通信端口。BE 主要涉及 9050心跳端口、8040BE 的 Web 端口、8060数据导入端口、9060数据传输端口。如果你按照官网文档配置了端口但客户端就是连不上十有八九是防火墙没有放行。这里给一个实用的经验用telnet 127.0.0.1 9030从本机先测一遍本机能通再考虑跨机器访问。跨机器通不了时的排查顺序是先看监听地址是否为0.0.0.0或者正确的内网 IP再看防火墙和云安全组最后再怀疑 Doris 配置本身。端口问题占了 Doris 部署问题的一半以上养成从底层链路对照排查的习惯会省下不少时间。5. 关键概念分桶与分区别把两者搞混5.1 分区按时间切“大块”在 Doris 里一个表的数据在物理上是按照“分区Partition”和“分桶Bucket”两层结构来组织的。分区是逻辑上的第一层划分最常见的用法是按时间列做范围分区。比如一张订单表可以按order_date每个月建一个分区每个分区在物理上对应一批独立的文件。这样当查询只访问最近一个月的数据时Doris 可以直接跳过其他分区的数据对于按时间删除过期数据的场景也极其便利——直接删除对应的分区比一行行 DELETE 高效得多。使用分区的最佳实践是如果数据有明显的时间属性并且查询中经常带时间范围条件那就尽量使用分区。分区的粒度可以根据数据量来确定日增量在百万级以上的可以按天分区量小一些的按月分区即可。分区数量并不需要太多几百到一两千个分区在 Doris 中都是可控的。5.2 分桶数据打散的“小块”分桶是第二层划分决定了数据在 BE 节点之间如何分布。建表时可以指定分桶列Doris 会根据分桶列的值做哈希计算把数据均匀地分配到多个 Tablet 中。每个 Tablet 是一个独立的存储和管理单元它会有若干副本分布在不同的 BE 上。查询处理时Doris 会尽量做到每个 BE 上只有与任务相关的 Tablet 参与计算这个机制既是水平扩展的基础也是并发能力提升的关键。分桶分为“哈希分桶”和“随机分桶”。哈希分桶需要指定一个或多个列作为分桶键适合能明确找到分布均匀的列的场景。随机分桶则不需要指定分桶键数据导入时直接轮询分配到各个分桶但随机分桶在后续数据查询裁剪上不如哈希分桶精准。大多数场景下我建议选择哈希分桶并且分桶列尽量选择基数大且分布均匀的列比如用户 ID 或者订单 ID如果选了性别、状态这种只有几个取值的列数据就会集中在几个桶上分桶的意义就完全丧失了。5.3 只有几 MB 数据还需要分桶吗关于分桶我收到过最多的一个问题是“如果表只有几 MB 数据是不是不需要分桶”这个问题的答案是数据量小、导入又不频繁的话可以不拆分太多分桶但建表语法必须有分桶这是 Doris 的硬性要求。我说一个实际经验。之前有一个配置表数据量不到 5MB最早建表时我机械地按照默认规则设置了 10 个分桶结果每个 Tablet 平均才几百 KB 的数据量却要各自占一份内存和元数据开销。后来我把分桶数减小到 1查询响应时间几乎没变化但整个集群的 Tablet 数量少了元数据和副本管理的负担明显降低。所以对于小表完全不需要为了“看起来很分布式”而强行设置大量分桶。合理做法是让小表只有一个分桶配合一个分区把它当作一个普通的单分片表来管理反而更清爽高效。那么什么时候需要增加分桶数呢核心判断标准是单 Tablet 的数据量是否过大。Doris 社区建议单个 Tablet 的数据量在 100MB 到 1GB 之间比较理想太小的 Tablet 浪费资源太大的 Tablet 在做均衡和查询剪枝时又不方便。比如一张表有 10GB 数据、10 个分桶每个 Tablet 大约 1GB如果你觉得查询性能有瓶颈且数据分布均匀可以考虑把分桶数提高到 20 或 40让每个 Tablet 变小从而增加查询并行度。但分桶数的调整需要重建表所以最好在建表前就把增量预估进去后面尽量避免频繁改动。我特意把“分桶”这个看起来很小的概念拿出来单独讲是因为它直接决定了数据在集群中的分布形态。很多查询慢的问题根因往往不是 SQL 写得烂而是分桶键选得不好导致数据倾斜到了某几个节点上。这一点在后面的调优篇里还会展开。6. 生态集成Presto 连 Doris 的那些 missing 坑6.1 为什么会遇到 missing 错误Presto 连接 Doris 来查询数据在架构上是用 Presto 作为统一 SQL 引擎Doris 作为底下的一个数据源。你会在网络上看到不少关于 “presto doris 错误的 missing” 的讨论这里我从实际踩坑经验做一个统一解释帮助大家少走弯路。这类报错在现象上通常是 Presto 执行查询时抛出类似“Column xxx missing”或者“Catalog xxx missing”的异常。第一反应不要看成是 Doris 的问题绝大多数情况是两者对 SQL 语义或 Catalog 映射的处理不一致导致的。Presto 有自己的 Catalog、Schema 概念默认情况下 Connector 需要把 Doris 的库表映射到 Presto 的 Schema 结构。如果你的 Doris 表名或者列名带有大写字母、特殊字符而 Presto 在默认配置下大小写不敏感就会导致查询时找不到对应的列进而报 missing 错误。另一个常见原因是 SQL 方言差异。比如 Doris 支持某些特有的函数Presto 并不支持直接在 Presto 里执行就会找不到对应的“function”这种错误在提示信息里也可能表现为 “missing functionCatalog”。或者反过来Presto 的某些语法在 Doris 里走不通即使连接没问题查询结果也不是你想要的那样。6.2 正确连接姿势与排查建议要正确地在 Presto 里查询 Doris首先需要确认你的 Doris 版本和 Presto 的 Connector 版本是否互相兼容。社区提供的 Doris Connector 通常需要安装在 Presto 的插件目录中配置里要指明 Doris 的 FE 节点地址、端口、用户名密码以及连接到哪个数据库。连接示例大致如下connector.namedoris doris.fe.nodes127.0.0.1:8030 doris.fe.query.port9030 doris.usernameroot doris.password doris.databasetest_db这个配置的意思是让 Presto 把test_db这个库映射为一个 Catalog。配置好以后再写 SQL前面通常要带上 Catalog 前缀。如果你新建的表和 Doris 里的表名不完全一致Presto 就会找你 Presto 侧的元数据找不到自然报 missing。排查这类问题我的经验是先绕开 Presto直接用 MySQL 客户端连 Doris 执行同样的 SQL。如果 Doris 能正常执行问题定位到 Presto 侧的语法或 Catalog 映射如果 Doris 也报错那就是 Doris 的 SQL 写法本来就不对。这个“分步验证法”看起来简单但真的能避免很多因为环境交叉带来的迷惑。再不行就打开 Presto 的 debug 日志看它真正下发给 Doris 的那条 SQL 是什么所有 missing 问题在日志面前都会真相大白。对于那种确实同时被两边支持的复杂 SQL比如多表 Join 配合窗口函数我会建议尽量把计算下推到 DorisPresto 只做最外层的汇总。反之如果 Doris 不支持某个复杂查询宁可改逻辑用两段式查询把数据拉回到 Presto 里用内存计算也不要硬写一个两边都读不懂的 SQL。7. 集群部署从单机到高可用的关键差异7.1 FE 的角色分配Follower 与 Observer单机跑通以后生产环境很快会面临高可用的问题。Doris 集群部署的核心在于 FE 不是简单地把多台机器分别启动就好它区分了两种不同的角色Follower 和 Observer。Follower 节点参与元数据的主节点选举也就是说真正写入元数据时Follower 之间会通过一致性协议达成共识。通常建议部署 3 个 Follower 节点这样在少数节点故障的情况下元数据仍然可用。Observer 节点不参与选举只同步元数据并提供查询服务它主要用来扩展查询吞吐量但增加 Observer 并不会提升元数据写入的容错能力。理解了这一点你在规划集群节点数量时就知道3 个 FE Follower 是生产环境的最低安全配置如果还要应对更多查询并发再额外挂 Observer。BE 节点的扩展相对简单多为多分。新的 BE 加入后Doris 并不会立刻把旧节点的数据自动重新分配给它而是通过后续的 Tablet 均衡机制慢慢迁移数据。这意味着刚扩容完的一段时间内新节点上的数据量是偏少的承载的压力也偏小需要等集群状态均衡之后才能逐步切流量。我遇到过有人扩容后立刻压测结果新节点没数据、老节点被打到瓶颈这是对均衡机制不太了解造成的误判。7.2 目录与容灾规划部署目录规划上给 FE 的meta_dir和 BE 的storage_root_path做单独的磁盘挂载很重要。Doris 本身实现了多副本机制但这不代表你可以忽略单机磁盘故障。如果同一批副本恰好多份都落在同一块物理磁盘上一旦磁盘故障数据恢复就只能靠另一批 BE 的副本恢复时间会比较长。规划容灾时我会优先保证 FE 的元数据有独立的备份机制至少要做到定时对 FE 的meta_dir目录做快照或同步。BE 的数据则可以依赖多副本机制生产环境通常建议至少 2 副本核心库表可以设成 3 副本。副本越多容错性越好但存储成本和写入开销也会相应增加这是一个需要根据业务重要性来权衡的选择。7.3 集群运维的核心指标集群部署完成不等于万事大吉。日常运维中你需要重点观察几个指标BE 节点的Tablet 数量这个值反映了数据分布的均衡程度FE 的 JVM 堆使用率元数据增长过快时会导致 GC 频繁以及SHOW BACKENDS里显示的磁盘使用率。如果某台 BE 的磁盘使用率明显高于其他节点说明数据倾斜或者 Tablet 均衡没有及时生效需要手动排查。我可以分享一个我自己的管理习惯每两周用SHOW PROC /statistic看一眼集群的整体状态记录下 Tablet 数量和磁盘使用率的变化趋势。这种“随手观测”的习惯能帮你把很多潜在风险消灭在没有影响到业务的阶段。8. 常见问题速查与避坑记录8.1 部署与连接问题汇总我把过去踩过的和同行交流过的典型问题整理成一个速查表方便遇到异常时快速对照。现象可能原因解决建议9030 端口连不上FE 未启动或防火墙未放行先本机 telnet再检查防火墙和安全组BE 状态显示falseBE 和 FE 网络不通或心跳端口错误检查priority_networks和端口配置建表报错 Tablet not foundBE 刚加入集群数据还没均衡用SHOW BACKENDS确认 alive 后再建表扩容后查询慢新 BE 数据偏少压力未均衡等待自动均衡或手动迁移部分 Tablet内存持续走高BE 内存限制未设置在be.conf中设置mem_limit合理阈值这张表只是入门级问题的汇总更细的问题排查需要结合当时的架构、版本和日志。排查的核心原则永远是“从链路底层向上看”网络不通就先解决网络端口不通就先解决端口不要一上来就怀疑 Doris 内部坏了。8.2 查询性能的初步排查思路Doris 查询慢时我的第一步不是改 SQL而是先看这个查询是否走了分区分桶裁剪。可以通过EXPLAIN或者EXPLAIN VERBOSE查看执行计划确认过滤条件下能否落实到具体的 Partition 和 Tablet。如果执行计划显示扫描了大量不需要的分区说明 SQL 的过滤条件写法有问题或者表结构缺少合适的分区设计。第二步是看是否存在数据倾斜。如果某个 BE 节点的 CPU 使用率明显高于其他节点而你的查询又是分布执行那很可能是分桶键选得不好导致某些 Tablet 的数据量远大于其他 Tablet。这种情况下单纯加 BE 节点也解决不了根本问题需要分析数据分布特征选出分布更均匀的列重新设计分桶。第三步才去看具体的 SQL 写法。比如是不是用了SELECT *拉回所有列是不是在 Join 条件里对字段做了函数处理导致无法下推索引是不是小表没有用 Broadcast Join 而走了昂贵的 Shuffle Join。这些调优细节我会在后续专门写一篇这里先给大家一个从大到小的排查顺序避免一上来就陷入 SQL 微调的泥潭。8.3 我强烈建议你避开的几个坑最后说几个压箱底的避坑经验。第一不要在 BE 的存储目录上使用网络盘。很多人在容器化或虚拟化场景下会把storage_root_path指向网络存储结果性能波动极大甚至出现副本同步卡死的情况。Doris 的设计假定本地磁盘是可靠的给出高性能的保证建立在本地 IO 之上。第二不要轻易修改 FE 的priority_networks。这个参数一旦设置错误最典型的结果就是 BE 能注册但永远不上线或者 FE 之间互相找不到对方。修改时要结合机器的实际网卡 IP并在所有 FE 上保持一致。第三导入数据时一定要先在小数据集上验证导入参数的合理性和正确性尤其是 Stream Load 和 Routine Load 的批次大小。我见过有同事直接把生产 Kafka 的大批次配置拿到测试环境用结果测试环境内存被打满光一堆小问题就排查了好几天。参数这个问题必须结合机器实际配置来设定别盲目照搬网上的最佳实践。个人实操体会写了这么多我想以自己这些年上手 Doris 的真实经历收个尾。Doris 真正让我满意的地方是它在复杂的分布式环境下依然保持了相对简单的使用体验不要求你把大数据生态里那一整套组件全装齐才能干活。同时它的坑也确实需要实际踩过才知道如何避开。本篇虽然还没深入到具体表达式和大型集群的细节但从部署到分桶再到 Presto 集成这些基础问题的整体脉络已经铺开。接下来这个系列会一篇一篇地深入把单机部署、集群搭建、数据模型选择、导入调优、查询优化这些内容全部落到实处。如果你正准备在项目里用 Doris或者已经在用但总感觉哪里差点意思请把这个系列当作一份实操笔记来读遇到问题随时往回翻会有很多从前没注意到的细节带给新的启发。
返回列表