简介《EMR StarRocks 白皮书》面向数据分析师、数据仓库工程师与架构选型人员系统梳理新一代极速全场景 MPP 数据仓库 StarRocks 的产品全貌帮助读者理解其架构设计、核心特性与落地路径。资源包共 1 个 PDF 文件约 13.78MB内容涵盖 StarRocks 简介、FE 与 BE 两类进程的简洁架构、全面向量化引擎与 CBO 优化器、现代化物化视图、MySQL 协议兼容及联邦查询等关键技术点并展开数据迁移、数据摄入、湖仓一体与 Flink 生态等模块。白皮书还结合固定报表、实时看板、实时风控、末端运营、用户画像与自助 BI 等场景给出解决方案附携程、顺丰、Airbnb、滴滴、京东、众安保险等百余家用户的实践背景便于读者对照自身业务评估选型与建设思路。目前已有 244 人学习适合作为团队内部技术分享与方案论证的参考材料。1. 从一份白皮书到一套可交付的数仓方案很多同学做数据仓库方向的毕设或课程设计第一反应是打开文档抄架构图结果交上去的东西自己都讲不清 FE 和 BE 到底谁管什么。我见过一个典型的翻车现场某同学用单机 MySQL 硬扛千万级明细的实时看板答辩时被问“并发上来怎么办”当场卡壳。这份 EMR StarRocks 白皮书解决的正是这个问题——它把一套已经在生产环境跑过的新一代极速全场景 MPP 数据仓库方案完整摊开从 FE/BE 双进程架构、三种数据模型到数据摄入、湖仓一体和六类业务场景适合要交完整设计的学生也适合要出一份能落地交付方案的从业者。下面我按“需求立住 → 架构设计 → 模块实现 → 避坑 → 验收答辩”的顺序把它拆成一份可以直接照着搭的方案。2. 需求与选型为什么是 MPP 而不是继续堆 MySQL2.1 先把业务需求翻译成技术指标做方案最怕一上来就选型。我一般会先把业务语言翻译成可量化的技术指标再拿指标去卡产品。以白皮书里提到的几类场景为例需求大致能落成下面这张对照表业务场景核心诉求关键技术指标对应能力固定报表结果稳定、按时产出查询延迟秒级、调度可靠物化视图、CBO实时看板数据即导即用写入延迟秒级、更新可见主键模型、Routine Load实时风控高并发点查与关联万级 QPS、多表关联快分区分桶、向量化用户画像大宽表任意维度探查10PB 级规模、灵活建模明细/聚合模型自助 BIAdhoc 查询不拖垮集群资源隔离、大查询熔断资源组与分类器这张表是整份方案的锚点。后面每一个设计决策都要能回答“它服务的是表里哪一行”。如果某个模块说不清对应哪条需求大概率是过度设计答辩时也容易被追问到崩。2.2 选型对比MPP 数据仓库 vs 传统方案把需求摆清楚后选型的逻辑就顺了。传统做法通常是 MySQL 扛明细、定时任务跑聚合、再配一套缓存问题在于数据量上到亿级后聚合任务窗口越来越长实时性无从谈起多表关联靠应用层拼性能随维度增长断崖式下跌。白皮书给出的答案是 MPP 架构——任务并行分散到每个节点各节点算完再汇总充分挖掘每台机器的物理资源。选它的三个硬理由一是架构简洁全系统只有 FE、BE 两类进程不依赖外部组件部署运维成本低这对毕设环境尤其友好二是兼容 MySQL 5.7 协议和标准 SQL应用几乎不用改代码就能迁入课程设计里现成的业务代码可以直接复用三是全场景统一实时数仓、用户画像、风控、订单分析用同一套引擎覆盖不用为每个场景单独搭烟囱。这里有个血泪经验选型时别只看 benchmark 数字要看“你的团队能不能运维得动”。一个需要五六个外部组件协同的方案在答辩现场被问一句“某个组件挂了怎么办”就很难圆回来。2.3 方案边界与适用人群这份方案不是万能的。它适合对性能、实时性、并发和灵活性有较高要求的分析型场景如果你的需求是高频事务型写入比如订单主库那它不该替代 OLTP 数据库而是作为分析层存在。方案交付物我一般拆成四块需求指标表、架构设计说明、核心模块实现建表、导入、查询、验收测试用例。学生按这四块交结构完整从业者按这四块改能直接对接评审。下面几章就按这个骨架往下走。3. 总体架构设计FE/BE 双进程与四层职责划分3.1 架构分层与节点角色白皮书的架构图核心就一句话FE 管元数据和查询规划BE 管存储和计算执行。我把它整理成四层职责方便写进设计文档接入层Client Application 通过 MySQL 协议连入兼容各类主流 BI 工具和 MySQL 客户端。前端层FECatalog Manager 管元数据Query Coordinator 做查询规划与调度。FE 分 Follower 和 Observer 两种角色Follower 通过类 Paxos 的 BDBJE 协议选主只有 Leader 写元数据写操作需多数 Follower 确认Observer 不参与选主只异步同步日志用来横向扩展查询并发。后端层BE完全对等节点负责列式存储和 SQL 计算执行。数据导入直接写 BE、不经 FE 中转BE 负责落格式和建索引SQL 按语义规划成逻辑执行单元再按数据分布拆成物理执行单元在数据所在节点执行避免传输拷贝。存储层数据以列式存储多副本冗余Tablet 是数据均衡和恢复的最小单位。这套设计的价值在于“无单点”元数据多副本、数据多副本节点故障自动在可用节点补齐副本。写设计文档时我会专门画一张“故障场景 → 系统行为”的表比如 Leader 宕机后 Follower 重新选主、BE 下线后副本自动补齐这比单纯贴架构图有说服力得多。3.2 数据模型选型三种模型对应三类写入模式StarRocks 提供明细Duplicate Key、聚合Aggregate Key、主键Primary Key三种模型选错模型是新手最常见的翻车点。我的判断口诀是要召回原始明细选明细模型要预聚合结果选聚合模型要频繁更新选主键模型。主键模型用 Insert and Delete 模式实现 UPSERT相比 Merge on Read 有更好的实时导入和查询性能实时看板、风控这类需要数据更新的场景优先用它。建表示例以实时订单看板为例主键模型CREATE TABLE order_realtime ( order_id BIGINT NOT NULL COMMENT 订单ID主键, user_id BIGINT NOT NULL COMMENT 用户ID, city_code VARCHAR(16) NOT NULL COMMENT 城市编码, order_amount DECIMAL(18,2) NOT NULL COMMENT 订单金额, order_status TINYINT NOT NULL COMMENT 订单状态, update_time DATETIME NOT NULL COMMENT 更新时间 ) PRIMARY KEY (order_id) DISTRIBUTED BY HASH(order_id) BUCKETS 16 PROPERTIES ( replication_num 3 );这段建表语句里几个参数值得说清楚PRIMARY KEY指定主键重复主键写入即更新对应实时看板的“状态变更可见”BUCKETS 16是分桶数分桶键哈希值相同的数据形成 Tablet分桶数要结合 BE 节点数和数据量定太少单桶过大影响并行度太多小文件拖慢导入replication_num 3是三副本保证节点故障不丢数据。分桶键的选择原则是“高频等值查询条件优先”这样能命中分桶剪裁减少扫描量。3.3 分区分桶与高并发设计两级分区是这套方案撑高并发的关键第一级 Range 分区按时间切第二级 Hash 分桶按业务键切。分区的作用是把表拆成管理单元可以单独设副本数、冷热策略和存储介质还能配 TTL 自动建分区、删过期分区运维成本大幅下降。分桶则决定数据指向性规则覆盖大部分查询条件时分区剪裁、分桶剪裁加前缀索引三管齐下能精准定位数据、避免全表扫描。前缀索引是自动的每 1024 行生成一条索引项按排序键前缀编码等值和范围查询能快速锁定行不需要用户干预。高并发方面白皮书给的量级是合适的分区分桶加一定节点规模可支撑上万 QPS、数千用户同时分析。写方案时我会补一句容量估算单集群可扩到数百节点、10PB 级数据扩容期间不停服、数据按分片自动均衡。这句话在答辩时很管用因为它回答了“业务涨了怎么办”这个必问题。4. 核心模块实现数据摄入、湖仓一体与资源隔离4.1 数据摄入按数据量和频率选导入方式导入方式选错后面调优全是白费。白皮书给了五种方式我按“数据量 数据源 同步性”整理成决策表导入方式数据源数据量级同步/异步典型场景Stream Load本地 CSV 等平面文件10G 以下同步小批量本地导入Broker LoadHDFS、S3 等外部存储10GB–1000GB异步大批量文件导入Spark LoadHive/HDFS几 TB异步初次全量迁移Routine LoadKafka 数据流持续增量异步实时流式接入Insert IntoStarRocks 内部几百 MB同步轻量转换导入实时看板场景我一般用 Routine Load 消费 KafkaFE 把任务拆成子任务分发失败自动重试SQL 命令可暂停、重启、停止任务。批量迁移用 Spark Load把 ETL 预处理放到外部 Spark 集群省下 StarRocks 自身计算资源。这里有个容易忽略的点Stream Load 走 HTTP 协议FE 按 Redirect 把请求转给某个 BE 当 Coordinator由它按 Schema 分发数据所以导入性能瓶颈往往在网络和 Coordinator 节点而不是存储。4.2 Flink 生态与 Exactly-Once 语义实时链路里 Flink 是绕不开的一环。flink-connector-starrocks的 Sink 会把数据缓存后批量转成 Stream Load 写入Source 则能并行读取 BE 数据——这点比官方 JDBC connector 强后者会在 FE 形成单点瓶颈。Exactly-Once 的实现分两半外部系统保证 At Least OnceStarRocks 的 Label 机制保证 At Most Once合起来就是精确一次。它依赖 Flink 的 checkpointcheckpoint 时保存一批数据及其 label完成后、下次写入前阻塞刷新这批数据。配置示例Flink Sink 关键参数// 构建 StarRocks Sink核心是攒批与超时 StarRocksSinkOptions options StarRocksSinkOptions.builder() .withProperty(jdbc-url, jdbc:mysql://fe-host:9030) .withProperty(load-url, be-host:8040) .withProperty(database-name, demo_db) .withProperty(table-name, order_realtime) .withProperty(username, root) .withProperty(password, ******) .withProperty(sink.buffer-flush.max-rows, 100000) // 单批最大行数 .withProperty(sink.buffer-flush.interval-ms, 3000) // 攒批超时控制延迟 .withProperty(sink.properties.format, json) .withProperty(sink.properties.strip_outer_array, true) .build();max-rows和interval-ms是一对权衡参数调大提升吞吐但增加延迟实时看板一般 3 秒内可接受调小延迟低但小批写入多compaction 压力大。format选 json 便于半结构化字段扩展。MySQL 数据实时同步还有两条路Canal 写 Kafka 再走 Routine Load或 Flink CDC 直接抓增量SMT 迁移工具能根据源库表结构自动生成 source/sink 建表语句初次迁移能省不少手工活。4.3 湖仓一体与外表联邦查询数据湖按原始格式存数据StarRocks 当查询引擎FE 里存 StarRocks 表与 Iceberg 外表的元数据两边数据可以自由流动湖里有价值的数据流进 StarRocks 做关联查询仓里的冷数据流回湖里低成本长期保存。目前支持 Iceberg v1 表查询部分谓词已下推、Hive Catalog HDFS 文件外表、Hudi Copy on Write 表查询。外表联邦查询解决的是“数据孤岛”MySQL 外表存维度表、StarRocks 存事实表维度在 MySQL 里更新Hive 外表存离线数据、StarRocks 存实时数据两者关联查询Elasticsearch 外表利用倒排索引还能用 esquery 函数把条件下推到 ES 做过滤优化。写方案时我会强调一句外表不是银弹跨源查询的网络开销和谓词下推程度直接决定性能设计时优先把高频关联的数据物理上收拢到 StarRocks 内。4.4 资源隔离资源组与分类器多租户场景下一个大查询能把整个集群拖垮。资源隔离把 BE 的 CPU、内存划成资源组每个组绑一个或多个分类器分类器按 USER、ROLE、QUERY_TYPE、SOURCE_IP 四个条件匹配查询匹配度最高的生效。典型用法有五类大小查询隔离保护核心业务、ETL 与查询隔离、导入与查询隔离、大查询与高并发熔断、分时调度夜间跑批、白天查询。配置示例-- 创建资源组限制 CPU 与查询内存上限 CREATE RESOURCE GROUP rg_etl TO (rg_etl_classifier) WITH ( cpu_core_limit 8, mem_limit 30% ); -- 分类器按查询类型匹配ETL 类查询归入该组 CREATE CLASSIFIER rg_etl_classifier WITH ( query_type INSERT );cpu_core_limit是占 BE 核数的比例mem_limit限制 query pool 内存上限。设计说明里要写清匹配优先级分类器条件越具体越优先所以给核心报表单独建一个按 ROLE 匹配的分类器比笼统按 IP 匹配更稳。这套机制在答辩时是加分项因为它证明你考虑过“多业务共用集群”的真实问题。5. 避坑与排查五条最容易翻车的点5.1 模型选错导致更新失效现象实时看板数据更新后查询不到新值或者同一订单出现多行。原因用了明细模型存需要更新的数据明细模型插入即追加不做去重合并。解决需要 UPSERT 的场景一律用主键模型建表时确认PRIMARY KEY与业务唯一键一致已经建错的表通过新建主键表加数据回灌切换别在原表上硬改。5.2 分桶数拍脑袋导致导入慢现象导入任务耗时随数据量线性上涨BE 磁盘小文件多。原因分桶数过少单桶过大、并行度上不去或过多导致 compaction 压力大。解决按“单 Tablet 数据量控制在 1–10GB”估算分桶数结合 BE 节点数取整上线后用SHOW TABLETS观察桶大小分布偏差大的重新分桶。5.3 大查询拖垮集群现象某个 Adhoc 查询一跑其他业务查询全部超时。原因没配资源隔离大查询和核心业务抢 CPU 与内存。解决按 4.4 建资源组和分类器把 ETL、Adhoc 与核心报表分到不同组并对超预期并发的查询配熔断同时用慢查询日志定位问题 SQL看执行计划里是否有全表扫描。5.4 宽表建模的隐性成本现象为了“查询简单”建了超宽大宽表结果维度更新要全表 backfill导入时间越来越长。原因宽表更新会反映到整张表字段多、聚合模型 key 列多、排序列增加都会拉长导入时间。解决优先用星型模型加视图替代宽表多表关联性能在 SSB 测试里与单表相差不大确需宽表时控制字段数把更新频繁的维度拆出去走外表关联。5.5 Join 方式与数据分布不匹配现象两张大表关联时网络传输巨大、查询极慢。原因该用 Colocate Join 的场景用了 Shuffle Join数据在节点间反复分发。解决两张大表且都是本地关联时建表指定相同分桶键走 Colocate Join小表百万级以下用 Broadcast Join 推送到各节点内存join key 与分桶键一致且只涉及单分区时优先 Bucket Shuffle Join。建表阶段就要规划好事后改分布代价很高。6. 验收与答辩用一张测试矩阵把方案讲圆验收环节最忌讳“跑通了就算完”。我一般会设计一张测试矩阵把第 2 章的需求指标逐条对应到可执行的验证动作答辩时按矩阵讲逻辑闭环、不虚。验收项验证方法通过标准查询性能选 3 条典型 SQL单表、聚合、多表关联跑基准延迟满足需求表指标执行计划命中分区/分桶剪裁实时性Kafka 写入后轮询查询数据秒级可见主键更新后新值可查高并发压测工具模拟多用户并发查询达到设计 QPS 且无查询失败高可用手动下线一个 BE / 停一个 Follower查询不中断副本自动补齐资源隔离并发跑大查询与核心报表核心报表延迟不受明显影响数据一致性对比源库与目标表行数、聚合值误差为零Exactly-Once 链路无重复答辩技巧上我建议准备三个“深挖点”一是拿一条慢 SQL 现场讲执行计划从 Parser 到 FragmentBuilder 七个流程里指出哪一步做了谓词下推、哪一步做了分区分桶裁剪这比背架构图有说服力二是讲清楚一次故障演练的完整过程包括你怎么发现、怎么定位、系统怎么自愈三是主动说出方案的边界比如“这个场景我们没选宽表原因是 backfill 成本”主动暴露取舍反而显得可信。向量化和 CBO 的数字可以引用条件过滤约 5.1 倍、聚合约 14.9 倍、关联 3–4 倍TPC-H 1T 下 CBO 带来 5–10 倍提升但一定要说明这是基准测试环境别当成自己系统的实测值。从那以后我每次带方案都强制先写验收矩阵再动手搭环境——因为矩阵写不出来的需求基本等于没想清楚等到答辩被问“你怎么证明它行”就晚了。希望这套拆法帮到你白皮书里的架构图、模型对比和场景表照着填进你自己的设计文档就是一份能交、能讲、能落地的完整方案。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?